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