我正在嘗試讓我的一個正在運行的進程被提升爲使用標準用戶令牌重新啓動資源管理器。模擬標準用戶
我在做什麼,首先我經營的主要過程作爲管理員,然後我在運行的快照:
if (Process32First(hSnapshot,&pe32))
{
do
{
if (!wcsicmp(pe32.szExeFile, L"explorer.exe"))
{
DWORD dwExplorerSessId = 0;
if (ProcessIdToSessionId(pe32.th32ProcessID, &dwExplorerSessId) && dwExplorerSessId == dwSessionId)
{
dwExplorerLogonPid = pe32.th32ProcessID;
break;
}
}
} while (Process32Next(hSnapshot, &pe32));
}
CloseHandle(hSnapshot);
然後,一旦我得到它的標準下運行資源管理器的PID用戶帳戶,我呼籲:
OpenProcessToken(hProcess,TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_IMPERSONATE
,&hPToken))
然後我打電話:
ImpersonateLoggedOnUser(hPToken);
和國際泳聯lly我taskkill explorer.exe和shell再次執行它,但它的管理員權限下運行。
它彷彿impersonateLoggedonUser不起作用。雖然它返回true,GetLastError()返回0;
我也使用CreateProcessAsUser嘗試(),但這總是給人一種ERROR_FILE_NOT_FOUND:
STARTUPINFO si;
GetStartupInfo(&si);
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
TCHAR tchcmd[MAX_PATH];
_tcscpy(tchcmd, _T("explorer.exe"));
PVOID penv;
CreateEnvironmentBlock(&penv, hToken, FALSE);
HANDLE hNewToken;
DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityIdentification, TokenImpersonation, &hNewToken);
CreateProcessAsUser(, NULL, tchcmd, 0, 0, 0, CREATE_DEFAULT_ERROR_MODE, penv, 0, &si, &pi);
任何意見或建議。
請記住,Process32First/Next函數是爲了向後兼容性而保留的,並不總是返回完美的結果。它們不能在64位機器上可靠地工作,並且它們通常返回的實際數量少於svchost.exes。鋤頭,幫助:) – 2010-02-17 16:00:52
@BillyONeal:它會返回所有進程...如果你有權限SE_DEBUG – 2010-02-17 16:10:43
即使使用'SeDebugPrivilege'它並不總是返回正確數量的svchosts。在Windows API初始化之前(在NT引導過程早些時候),啓動任何東西都會遇到問題。「EnumProcesses()」是唯一(記錄)的函數,它總是返回正確的答案。 – 2010-02-17 18:33:53