2009-08-17 1 views
2

J'ai un service Windows (sous WinXP SP2), exécuté sous le compte LocalSystem, qui lance les processus à l'aide de CreateProcessWithLogonW. Pour nettoyer les processus enfants, j'essaie d'utiliser un objet de travail et TerminateJobObject. MSDN indique que le handle de travail doit avoir droit d'accès JOB_OBJECT_ASSIGN_PROCESS, ce qu'il a depuis qu'il est créé via CreateJobObject. Le descripteur de processus doit avoir les droits PROCESS_SET_QUOTA et PROCESS_TERMINATE. Je pense qu'il les a depuis que TerminateProcess et SetProcessWorkingSetSize retournent tous deux sans erreur.CreateProcessWithLogonW et AssignProcessToJobObject

Cependant, AssignProcessToJobObject échoue avec errno 5 (Accès refusé). Tout fonctionne bien si je remplace CreateProcessWithLogonW par un simple CreateProcess.

Ai-je raté quelque chose ou est ce que j'essaye de faire impossible?

Modifier: Il semble que svchost.exe, qui crée réellement le processus lorsque CreateProcessWithLogonW est utilisé, affecte déjà le processus à un travail anonyme. L'indicateur CREATE_CREAKAWAY_FROM_JOB est ignoré par cette fonction. La vraie question est donc: existe-t-il un moyen d'empêcher svnhost d'assigner le processus à un travail?

Répondre

4

De Jeff Lawson sur MSDN:

Interactions avec Win32 Job Objects

CreateProcessWithLogonW exécute le nouveau processus comme un enfant du service de connexion secondaire, qui a le résultat de faire la processus échappement toute appartenance à un objet Job/restrictions même si l'objet de tâche n'a pas permis breakaway.

De plus, le secondaire service de connexion crée automatiquement son propre nouvel objet d'emploi et affecte le nouveau processus en elle. En tant que tel, il est pas possible pour l'appelant de assigner explicitement le nouveau processus tout autre objet de travail (depuis un processus ne peut être affecté à un emploi objet, et ne peut jamais être retiré de une fois l'objet d'emploi il a été affecté à un).

Chaque nouveau processus nécessite-t-il une connexion différente? Sinon, vous pouvez créer un processus unique avec la nouvelle connexion et le faire générer un nouveau processus en utilisant CreateProcess qui pourrait ensuite être associé à un objet Job.

+0

En fait, il existe un ensemble fixe d'ouvertures de session qui sont nécessaires, donc je peux utiliser cette approche avec un processus par ouverture de session en faisant le CreateProcess. Merci d'avoir répondu. – fraca7

+0

J'ai rencontré exactement le même problème. Ma façon de le résoudre était - comme vous l'avez proposé - de créer un troisième processus. Merci. –

Questions connexes