我有一个Windows服务(在WinXP SP2下),在LocalSystem帐户下运行,使用CreateProcessWithLogonW启动进程。 为了清理subprocess,我试图使用一个作业对象和TerminateJobObject。
MSDN指出,作业句柄必须具有JOB_OBJECT_ASSIGN_PROCESS访问权限,因为它是通过CreateJobObject创build的。 进程句柄必须具有PROCESS_SET_QUOTA和PROCESS_TERMINATE权限。 我认为它有自从TerminateProcess和SetProcessWorkingSetSize都返回没有错误。
但是,AssignProcessToJobObject失败,错误5(拒绝访问)。 一切工作正常,如果我用一个简单的CreateProcessreplaceCreateProcessWithLogonW。
我错过了什么,或者是我想要做的事情吗?
编辑:似乎svchost.exe,实际上CreateProcessWithLogonW使用时创build该进程,已经分配进程的匿名作业。 CREATE_CREAKAWAY_FROM_JOB标志被这个函数忽略。 所以真正的问题是:有没有办法阻止svnhost分配进程的工作?
来自MSDN的Jeff Lawson :
与Win32作业对象的交互
CreateProcessWithLogonW作为辅助登录服务的子进程执行新进程,即使作业对象不允许分离,也会使进程转义任何作业对象成员资格/限制。
此外,辅助登录服务会自动创建自己的新作业对象,并将新的进程分配给它。 因此,调用者不可能明确地将新进程分配给任何其他作业对象(因为进程只能被分配给一个作业对象,并且一旦被分配给一个作业对象就不能从作业对象中被删除)。
每个新进程是否需要不同的登录? 否则,可以使用新登录创建单个进程,并使用CreateProcess生成新进程,然后可以将其与作业对象相关联。