我想在另一個用戶下創建一個進程。所以我使用LogonUser和CreateProcessAsUser。但我的問題是,CreatePtocessAsUser總是返回錯誤代碼1314,這意味着「所需的特權不由客戶端持有」。所以我的問題是,我做錯了什麼?或者我怎麼能把這些特權交給手柄? (我認爲句柄應該有權限,或者我錯了?)對不起,我的英語錯誤,但我的英語知識不是最好的:)CreateProcessAsUser錯誤1314
如果有人知道如何糾正我的申請Plesase的幫助。
這是我的部分代碼。
STARTUPINFO StartInfo;
PROCESS_INFORMATION ProcInfo;
TOKEN_PRIVILEGES tp;
memset(&ProcInfo, 0, sizeof(ProcInfo));
memset(&StartInfo, 0 , sizeof(StartInfo));
StartInfo.cb = sizeof(StartInfo);
HANDLE handle = NULL;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ALL_ACCESS, &handle)) printf("\nOpenProcessError");
if (!LookupPrivilegeValue(NULL,SE_TCB_NAME,
//SE_TCB_NAME,
&tp.Privileges[0].Luid)) {
printf("\nLookupPriv error");
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes =
SE_PRIVILEGE_ENABLED;//SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(handle, FALSE, &tp, 0, NULL, 0)) {
printf("\nAdjustToken error");
}
i = LogonUser(user, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &handle);
printf("\nLogonUser return : %d",i);
i = GetLastError();
printf("\nLogonUser getlast : %d",i);
if (! ImpersonateLoggedOnUser(handle)) printf("\nImpLoggedOnUser!");
i = CreateProcessAsUser(handle, "c:\\windows\\system32\\notepad.exe",NULL, NULL, NULL, true,
CREATE_UNICODE_ENVIRONMENT |NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, NULL, NULL,
&StartInfo, &ProcInfo);
printf("\nCreateProcessAsUser return : %d",i);
i = GetLastError();
printf("\nCreateProcessAsUser getlast : %d",i);
CloseHandle(handle);
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
在此先感謝!
很幸運,您甚至知道錯誤號碼。調用GetLastError的正確方法是在調用API後立即調用它,如果API失敗。如果你調用其他任何東西(例如printf),那麼GetLastError通常會給你一個以後的錯誤,而不是你想要的錯誤。 – 2009-09-25 05:44:02
是的,你是對的,我也知道,但我嘗試了很多方法來解決這個問題,我忘記了刪除printf。我的錯誤:( – kampi 2009-09-25 05:55:51
ERROR_PRIVILEGE_NOT_HELD只是爲了防止有人搜索錯誤名稱而不是1314. – 2017-08-16 16:56:55