第一种方式(修改注册表):
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;