2 Stimmen

CreateProcessWithLogonW und AssignProcessToJobObject

Ich habe einen Windows-Dienst (unter WinXP SP2), der unter dem LocalSystem-Konto läuft und Prozesse mit CreateProcessWithLogonW startet. Um Kindprozesse zu bereinigen, versuche ich, ein Job-Objekt und TerminateJobObject zu verwenden.

MSDN gibt an, dass das Job-Handle das Zugriffsrecht JOB_OBJECT_ASSIGN_PROCESS haben muss, was es hat, da es über CreateJobObject erstellt wurde. Das Prozess-Handle muss die Rechte PROCESS_SET_QUOTA und PROCESS_TERMINATE haben. Ich denke, er hat sie, da sowohl TerminateProcess als auch SetProcessWorkingSetSize ohne Fehler zurückkehren.

AssignProcessToJobObject schlägt jedoch mit errno 5 (Zugriff verweigert) fehl. Alles funktioniert gut, wenn ich CreateProcessWithLogonW durch ein einfaches CreateProcess ersetze.

Übersehe ich etwas oder ist das, was ich versuche, unmöglich?

Bearbeiten: Es scheint, dass svchost.exe, das den Prozess tatsächlich erstellt, wenn CreateProcessWithLogonW verwendet wird, den Prozess bereits einem anonymen Job zuordnet. Das Kennzeichen CREATE_CREAKAWAY_FROM_JOB wird von dieser Funktion ignoriert. Die eigentliche Frage ist also: Gibt es eine Möglichkeit zu verhindern, dass svnhost den Prozess einem Job zuweist?

4voto

Judge Maygarden Punkte 25975

De Jeff Lawson auf MSDN:

Interaktionen mit Win32-Auftragsobjekten

CreateProcessWithLogonW führt die neuen Prozess als ein Kind des Sekundären Logon-Dienstes, der die Ergebnis hat, dass der Prozess aus alle Job-Objekt-Mitgliedschaften/Einschränkungen auch wenn das Job-Objekt nicht erlaubt Ausbrechen.

Darüber hinaus ist der Sekundärbereich Logon-Dienst automatisch eine ein eigenes neues Job-Objekt und ordnet den neuen Prozess zu. Daher ist es ist es für den Aufrufer nicht möglich den neuen Prozess explizit einem anderen einem anderen Job-Objekt zuzuweisen (da ein Prozess nur einem Job-Objekt zugewiesen werden kann Objekt zugeordnet werden kann und niemals aus einem Job-Objekt entfernt werden kann, sobald er einem zugewiesen wurde).

Benötigt jeder neue Prozess eine andere Anmeldung? Andernfalls könnten Sie einen einzigen Prozess mit der neuen Anmeldung erstellen und ihn mit CreateProcess einen neuen Prozess erzeugen lassen, der dann mit einem Job-Objekt verknüpft werden könnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X