2009-09-25 196 views
9

我想在另一個用戶下創建一個進程。所以我使用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); 

在此先感謝!

+0

很幸運,您甚至知道錯誤號碼。調用GetLastError的正確方法是在調用API後立即調用它,如果API失敗。如果你調用其他任何東西(例如printf),那麼GetLastError通常會給你一個以後的錯誤,而不是你想要的錯誤。 – 2009-09-25 05:44:02

+0

是的,你是對的,我也知道,但我嘗試了很多方法來解決這個問題,我忘記了刪除printf。我的錯誤:( – kampi 2009-09-25 05:55:51

+0

ERROR_PRIVILEGE_NOT_HELD只是爲了防止有人搜索錯誤名稱而不是1314. – 2017-08-16 16:56:55

回答

15

運行你的應用程序必須具有這些權限的本地安全策略啓用本地帳戶:

  • 充當操作系統
  • 上創建令牌對象
  • 登錄的一部分批量作業
+1

嗨! 我想使用域名和本地帳戶。我想也許創建一個令牌對象是最簡單的方法,我希望它能在這兩個賬戶中工作,你能否給我一個示例代碼,如何生成一個具有所需權限的令牌對象? 謝謝,kampi – kampi 2009-09-25 05:46:10

+1

如何設置這些權限? – Joel 2016-01-28 10:12:39

+0

對於每個人來說:我didn最終需要前兩個(儘管我已經在「以批處理作業登錄」)。相反,我最終通過添加「替換進程級別令牌」(像@Patel建議的那樣)來工作。 – 2017-08-16 16:55:36

0

您的代碼將SE_TCB_NAME特權添加到您的令牌中。

MSDN說:「通常,調用CreateProcessAsUser函數的進程必須具有SE_ASSIGNPRIMARYTOKEN_NAME和SE_INCREASE_QUOTA_NAME特權。」

+0

是的,我也知道。我的問題是,我應該如何添加這些特權? 如果我試試這個: 如果 我的錯誤(LookupPrivilegeValue(NULL,SE_ASSIGNPRIMARYTOKEN_NAME&SE_INCREASE_QUOTA_NAME,與tp.Privileges [0] .Luid)!):類型爲二進制運算符無效的操作數 '和' 所以我如何在同一個thime中添加這兩個特權? – kampi 2009-09-25 06:14:00

+4

我問了一些幫助(一些工作代碼或解釋)。如果你不想幫忙,那麼請不要添加評論! – kampi 2009-09-25 11:26:07

0

我檢查了鏈接,它運行良好。 Check this

void main() 
{ 

DWORD dwSessionId; 
HANDLE hToken = NULL; 

TOKEN_PRIVILEGES tp; 
PROCESS_INFORMATION pi; 
STARTUPINFOW si; 

// Initialize structures. 
ZeroMemory(&tp, sizeof(tp)); 
ZeroMemory(&pi, sizeof(pi)); 
ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 


LPTSTR lpszUsername = "user\0"; 
LPTSTR lpszDomain = ".";//"bgt\0"; 
LPTSTR lpszPassword = "password\0"; 

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY 
| TOKEN_ADJUST_PRIVILEGES , &hToken)) { 

MyError(); 
} 



// Look up the LUID for the TCB Name privilege. 
if (!LookupPrivilegeValue(NULL,SE_TCB_NAME, //SE_SHUTDOWN_NAME , 
//SE_TCB_NAME, 
&tp.Privileges[0].Luid)) { 
MyError(); 
} 


tp.PrivilegeCount = 1; 
tp.Privileges[0].Attributes = 
SE_PRIVILEGE_ENABLED;//SE_PRIVILEGE_ENABLED; 
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, 0)) { 

MyError(); 
} 


if(LogonUser(lpszUsername,lpszDomain,lpszPassword, 
LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&hToken) == 0) 
{ 
MyError(); 
} 
else 
{ 
STARTUPINFO sInfo; 
PROCESS_INFORMATION ProcessInfo; 
memset(&sInfo,0,sizeof(STARTUPINFO)); 
sInfo.cb = sizeof(STARTUPINFO); 
sInfo.dwX = CW_USEDEFAULT; 
sInfo.dwY = CW_USEDEFAULT; 
sInfo.dwXSize = CW_USEDEFAULT; 
sInfo.dwYSize = CW_USEDEFAULT; 


bool bRet = CreateProcessAsUser(hToken, 
"c:\\windows\\system32\\notepad.exe", 
NULL, 
NULL, 
NULL, 
TRUE, 
CREATE_NEW_CONSOLE, 
NULL, 
NULL, 
&sInfo, 
&ProcessInfo); 

if(bRet == 0) 
MyError(); 
} 
2

尋找答案小時後,我終於找到了在從MSDN下面的鏈接。希望將來可以幫助別人。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/c905c900-cae1-4081-b0c9-00f10238e7ad/createprocessasuser-failed?forum=clr

「要解決這個問題,你需要提升帳戶調用CreateProcessAsUser與的權利‘替換進程級令牌’正確的。要做到這一點,打開控制面板/管理工具/本地安全策略「,然後將用戶帳戶添加到」替換進程級別令牌「權限(您可能必須註銷或甚至重新啓動才能使此更改生效。)」

相關問題