CreateProcessAsUser error 1314
Will ich schaffen, einen Prozess unter einem anderen Benutzer. Also ich benutze LogonUser und CreateProcessAsUser. Aber mein problem ist, dass CreatePtocessAsUser gibt immer den Fehlercode 1314, was bedeutet, "Eine erforderliche Privileg ist nicht gehalten, die durch den AUFTRAGGEBER". Also meine Frage ist, was mache ich falsch? Oder wie kann ich die Privilegien, um den Griff? (Ich denke, der Griff sollte über die Rechte, oder bin ich falsch?) Sorry für meine Deutsch Fehler, aber meine Englisch-Kenntnisse nicht die besten 🙂
Plesase helfen, wenn jemand weiß, wie richtig meine Anwendung.
Dies ein Teil von meinem code.
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);
Vielen Dank im Voraus!
- Sie sind glücklich, dass Sie sogar wissen, die Fehler-Nummer. Der korrekte Weg, rufen Sie GetLastError ist, rufen Sie sofort nach dem Aufruf einer API, ob die API fehlschlug. Wenn Sie rufen, alles andere dazwischen (z.B. printf), dann GetLastError wird in der Regel geben Sie einem später Fehler aus, anstatt den Fehler, den Sie haben wollten.
- Ja, du hast Recht, und ich weiß es auch, aber ich habe versucht, so viele Möglichkeiten, um dieses problem zu lösen, und ich habe vergessen zu löschen printf. Mein Fehler 🙁
- ERROR_PRIVILEGE_NOT_HELD nur für den Fall, dass jemand sucht für die Fehler, die Namen und nicht 1314.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem lokalen Konto ausgeführt wird, muss die app diese Berechtigungen aktiviert in der Lokalen Sicherheitsrichtlinie:
Nach der Suche nach der Antwort für die Stunden, schließlich fand ich es im folgenden link von MSDN. Hoffe es kann jemand helfen in der Zukunft.
https://social.msdn.microsoft.com/Forums/vstudio/en-US/c905c900-cae1-4081-b0c9-00f10238e7ad/createprocessasuser-failed?forum=clr
"Um dieses problem zu beheben, müssen Sie heben Sie die Rechte des Kontos aufrufen CreateProcessAsUser mit dem "Ersetzen eines Tokens auf Prozessebene" Recht. Öffnen Sie dazu die Systemsteuerung /Verwaltung /Lokale Sicherheitsrichtlinie, und fügen Sie das Benutzerkonto, um die "Ersetzen eines Tokens auf Prozessebene" Recht. (Sie müssen sich möglicherweise Abmelden oder auch neu starten, um diese änderung wirksam wird.)"
Dein code fügt das SE_TCB_NAME Privileg, um Ihre token.
MSDN sagt "in der Regel, den Prozess, der fordert, die CreateProcessAsUser-Funktion muss das SE_ASSIGNPRIMARYTOKEN_NAME und SE_INCREASE_QUOTA_NAME Privilegien."
Habe ich überprüft, die links, und es funktionierte gut.
Überprüfen Sie diese