2009-09-25 10 views
9

मैं किसी अन्य उपयोगकर्ता के अंतर्गत एक प्रक्रिया बनाना चाहता हूं। तो मैं LogonUser और CreateProcessAsUser का उपयोग करता हूं। लेकिन मेरी समस्या यह है कि CreatePtocessAsUser हमेशा त्रुटि कोड 1314 देता है, जिसका अर्थ है "क्लाइंट द्वारा एक आवश्यक निजीकरण नहीं किया जाता है"। तो मेरा सवाल है, मैं क्या गलत कर रहा हूँ? या मैं हैंडल में निजीकरण कैसे दे सकता हूं? (मुझे लगता है कि हैंडल में विशेषाधिकार होना चाहिए, या मैं गलत हूं?) मेरी अंग्रेजी गलतियों के लिए खेद है, लेकिन मेरा अंग्रेजी ज्ञान सबसे अच्छा नहीं है :)CreateProcessAsUser त्रुटि 1314

कोई भी जानता है कि कोई भी मेरे आवेदन को सही करने के बारे में जानता है।

यह मेरे कोड का एक हिस्सा है।

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 को कॉल करने का सही तरीका एपीआई को कॉल करने के तुरंत बाद इसे कॉल करना है, अगर एपीआई असफल हो। यदि आप बीच में कुछ और कहते हैं (उदाहरण के लिए printf) तो GetLastError आमतौर पर आपको इच्छित त्रुटि के बजाय बाद में त्रुटि देगा। –

+0

हां, आप सही हैं, और मैं इसे भी जानता हूं, लेकिन मैंने इस समस्या को हल करने के कई तरीकों की कोशिश की, और मैं printf को मिटाना भूल गया हूं। मेरी गलती :( – kampi

+0

ERROR_PRIVILEGE_NOT_HELD अगर कोई त्रुटि नाम की खोज करता है और 1314 नहीं। –

उत्तर

15

अपने अनुप्रयोग चलाने वाले इन विशेषाधिकारों स्थानीय सुरक्षा नीति में सक्षम होनी चाहिए स्थानीय खाता:

  • ऑपरेटिंग सिस्टम
  • पर एक टोकन वस्तु बनाएं
  • लॉग एक के रूप में के भाग के रूप अधिनियम बैच जॉब
+1

हाय! मैं एक डोमेन और स्थानीय खाता भी उपयोग करना चाहता हूं। मुझे लगता है कि शायद टोकन ऑब्जेक्ट बनाना सबसे आसान तरीका होगा, और मुझे उम्मीद है कि यह दोनों खातों को काम करेगा। क्या आप मुझे एक नमूना कोड दे सकते हैं, अपेक्षित विशेषाधिकारों के साथ टोकन ऑब्जेक्ट कैसे उत्पन्न करें? धन्यवाद, कम्पी – kampi

+1

मैं उन विशेषाधिकारों को कैसे सेट करूं? – Joel

+0

हर किसी के आने के लिए: मैंने नहीं किया इनमें से पहले दो की आवश्यकता नहीं है (हालांकि मैं पहले से ही "बैच नौकरी के रूप में लॉग ऑन" में हूं)।इसके बजाए, आखिरकार, मैंने इसे "प्रक्रिया स्तर टोकन को बदलें" जोड़कर काम करने के लिए प्राप्त किया जैसे @ पैटल सुझाव दिया। –

0

आपका कोड आपके टोकन में SE_TCB_NAME विशेषाधिकार जोड़ता है।

एमएसडीएन का कहना है, "आम तौर पर, CreateProcessAsUser फ़ंक्शन को कॉल करने वाली प्रक्रिया में SE_ASSIGNPRIMARYTOKEN_NAME और SE_INCREASE_QUOTA_NAME विशेषाधिकार होना चाहिए।"

+0

हाँ, मुझे वह भी पता है। मेरी समस्या यह है कि मुझे इन विशेषाधिकारों को कैसे जोड़ना चाहिए? तो मैं कोशिश यह: अगर मैं त्रुटि मिलती है (LookupPrivilegeValue (शून्य, SE_ASSIGNPRIMARYTOKEN_NAME और SE_INCREASE_QUOTA_NAME, और tp.Privileges [0] .Luid)!): द्विआधारी ऑपरेटर के लिए प्रकार के अवैध ऑपरेंड 'और' तो मैं इन दो विशेषाधिकारों को एक ही समय में कैसे जोड़ूं? – kampi

+4

मैंने कुछ मदद मांगी (कुछ कामकाजी कोड, या स्पष्टीकरण)। अगर आप मदद नहीं करना चाहते हैं, तो कृपया टिप्पणी जोड़ें मत !! – kampi

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 कॉलिंग खाते के अधिकारों तरक्की करने की आवश्यकता होगी" प्रक्रिया स्तर टोकन बदलें " सही। ऐसा करने के लिए, को खोलने के लिए नियंत्रण कक्ष/प्रशासनिक उपकरण/स्थानीय सुरक्षा नीति और उपयोगकर्ता खाते को "प्रक्रिया स्तर टोकन को बदलें" पर जोड़ें। (आपको यह परिवर्तन प्रभावी होने के लिए लॉगआउट या यहां तक ​​कि रीबूट करना पड़ सकता है।) "

संबंधित मुद्दे