Как запустить исполняемый файл с предоставленными аргументами, если я запускаю службу сети? Я попытался использовать ShellExecuteEx из моей программы (которая работает как сетевая служба):
try
{
DWORD dwErr;
TCHAR bufProgName[1000] = _T("");
TCHAR bufParameters[1000] = _T("");
::lstrcat(bufProgName,_T("C:\\NotMyFault\\x86\\NotMyFault.exe"));
::lstrcat(bufParameters,_T(" -help"));
SHELLEXECUTEINFO ShExecInfo;
ZeroMemory(&ShExecInfo,sizeof(ShExecInfo));
ShExecInfo.cbSize=sizeof(ShExecInfo);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = bufProgName;
ShExecInfo.lpParameters = bufParameters;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOWNORMAL;
ShExecInfo.hInstApp = NULL;
int res = ShellExecuteEx(&ShExecInfo);
if(!res)
{
dwErr = GetLastError();
return -1;
}
}
catch(...)
{
std::cout<<"ShellFail: " << dwError;
return -1;
}
Но все это делает запуск NotMyFault.exe, выполняемый как пользовательская сетевая служба (я вижу это из диспетчера задач), но это не помогает. То же самое для других аргументов ("-crash").
Я знаю, что это поспешно написанный код, но мне нужно выяснить, может ли процесс, выполняемый как служба сети (например, мой), сделать это успешно. Когда я запускаю его как другого пользователя (двойным щелчком по исполняемому файлу), похоже, все работает нормально.
Ваша служба работает в сеансе 0. Ваш интерактивный рабочий стол находится в другом сеансе. Таким образом, вы не увидите ничего, когда ваша служба начнет процесс. Поскольку он начинается в том же сеансе, что и служба, в сеансе 0.
Если вы хотите, чтобы служба запускала процесс на интерактивном рабочем столе, это возможно, хотя и трудно: запуск интерактивного процесса из Windows Service в Windows Vista и более поздних версиях.
CreateProcess
?