2
我尋求的示例代碼:示例代碼:一個服務調用CreateProcessAsUser(),我想在用戶的會話中運行的過程,而不是會話0
對於一個服務調用CreateProcessAsUser()我想的過程中運行用戶的會話,會話不是0
迄今創建的過程僅在會話0
我尋求的示例代碼:示例代碼:一個服務調用CreateProcessAsUser(),我想在用戶的會話中運行的過程,而不是會話0
對於一個服務調用CreateProcessAsUser()我想的過程中運行用戶的會話,會話不是0
迄今創建的過程僅在會話0
此運行像一個服務從一些舊代碼,從服務啓動控制檯應用程序剝離。它在NT4下工作,但我沒有用現代版本的Windows測試它,所以不能保證它能像在NT4上那樣工作。
編輯:不,這不會按原樣工作。您需要添加代碼here以創建桌面,設置SID等。
if (!LogonUser(userId,
domain,
password,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
&hUserToken))
{
return GetLastError();
}
if (!ImpersonateLoggedOnUser(hUserToken))
{
DWORD rc = GetLastError();
CloseHandle(hUserToken);
return rc;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si, 0, sizeof(si));
memset(&pi, 0, sizeof(pi));
si.cb = sizeof(si);
rc = CreateProcessAsUser(hUserToken, // user token
0, // app name
"foo.exe", // command line
0, // process attributes
0, // thread attributes
FALSE, // don't inherit handles
DETACHED_PROCESS, // flags
0, // environment block
0, // current dir
&si, // startup info
&pi); // process info gets put here
if (!rc)
{
DWORD rc = GetLastError();
RevertToSelf();
CloseHandle(hUserToken);
return rc;
}
RevertToSelf();
CloseHandle(hUserToken);
return 0;
您不需要創建新的桌面。您可以在'STARTUPINFO'結構中指定一個現有桌面,例如用戶的交互式'WinSta0 \ Default'桌面(如Microsoft示例所示)。而且你也不需要混淆SID。服務中的CreateProcessAsUser()可以在沒有它們的情況下正常工作。我一直在服務中使用它多年,沒有任何問題,我也沒有爲它操縱SID。另一方面,我不使用LogonUser()或ImpersonateLoggedOnUser(),而是使用WTSQueryUserToken()和DuplicateTokenEx()。 –
另外,在調用'CreateProcessAsUser()'之前,你應該調用'CreateEnvironmentBlock()'。 –
@RemyLebeau我同意(有點)。也許你應該寫一個新的答案。這是一個三歲的答案,沒有接受,也沒有投票,所以我不願意花更多的時間在現在。 –