服务端的开机自启动

第一种方式(修改注册表):

    CString strPath =CString(_T("C:\\Windows\\SysWOW64\\RemoteCtrl.exe"));
	if (!PathFileExists(strPath))
	{
		CString strSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
		CString strInfo = _T("该程序只允许合法的用途!\r\n");
		strInfo += _T("继续运行该程序,将使得这台机器处于被监控状态!\r\n");
		strInfo += _T("如果你不希望这样,请按下“取消按钮”。\r\n");
		int ret = MessageBox(NULL, strInfo, _T("警告"), MB_YESNOCANCEL | MB_ICONWARNING | MB_TOPMOST);
		if (ret == IDYES)
		{
			char sPath[MAX_PATH] = "";
			char sSys[MAX_PATH] = "";
			std::string strExe = "\\RemoteCtrl.exe ";
			GetCurrentDirectoryA(MAX_PATH, sPath);
			GetSystemDirectoryA(sSys, sizeof(sSys));
			std::string strCmd = "mklink " + std::string(sSys) + strExe + std::string(sPath) + strExe;
			ret = system(strCmd.c_str());
			TRACE("ret=%d\r\n", ret);
			HKEY hKey = NULL;
			ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, strSubKey, 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey);
			if (ret != ERROR_SUCCESS)
			{
				RegCloseKey(hKey);
				MessageBox(NULL, _T("设置自动开机启动失败!是否权限不足?"), _T("错误"), MB_ICONERROR | MB_TOPMOST);
				exit(0);
			}
			ret = RegSetValueEx(hKey, _T("RemoteCtrl"), 0, REG_EXPAND_SZ, (BYTE*)(LPCTSTR)strPath, strPath.GetLength() * sizeof(TCHAR));
			if (ret != ERROR_SUCCESS)
			{
				RegCloseKey(hKey);
				MessageBox(NULL, _T("设置自动开机启动失败!是否权限不足?"), _T("错误"), MB_ICONERROR | MB_TOPMOST);
				exit(0);
			}
			RegCloseKey(hKey);
		}
		else if (ret == IDCANCEL)
		{
			exit(0);
		}
	}
	return;

总结:
1 开机启动的时候的权限是跟随启动用户的
2 如果两者权限不一致则会失败
3 开机启动对环境变量的影响,如果依赖动态库,启动会失败
在登录前启动
第二种方式(启动文件目录)
1 在登录后启动

    char szStartupPath[MAX_PATH] = "";
	::SHGetSpecialFolderPathA(NULL, szStartupPath, CSIDL_STARTUP, TRUE);
	CString strPath = (CString)szStartupPath + CString("\\RemoteCtrl.exe");
	if (!PathFileExists(strPath))
	{
		CString strInfo = _T("该程序只允许合法的用途!\r\n");
		strInfo += _T("继续运行该程序,将使得这台机器处于被监控状态!\r\n");
		strInfo += _T("如果你不希望这样,请按下“取消按钮”。\r\n");
		int ret = MessageBox(NULL, strInfo, _T("警告"), MB_YESNOCANCEL | MB_ICONWARNING | MB_TOPMOST);
		if (ret == IDYES)
		{
CString strCmd = GetCommandLine();
	strCmd.Replace(_T("\""), _T(""));
	BOOL ret=CopyFile(strCmd, strPath, FALSE);
	if (ret == FALSE)
	{
		MessageBox(NULL, _T("复制文件失败,是否权限不足?"), _T("错误"), MB_ICONERROR | MB_TOPMOST);
		exit(0);
		}
		else if (ret == IDCANCEL)
		{
			exit(0);
		}
	}
	return;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值