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