我有一个windows服务(在winxp sp2下),运行在localsystem帐户下,它使用createprocesswithlogonw启动进程。为了清理子进程,我尝试使用作业对象和TerminateJobObject。
msdn声明作业句柄必须具有作业对象分配进程访问权限,该权限自通过createjobobject创建以来就一直具有。进程句柄必须具有进程设置配额和进程终止权限。我认为它有它们,因为terminateprocess和setprocessworkingsetsize都返回了,没有错误。
但是,assignprocesstojobobject失败,错误号为5(拒绝访问)。如果我用一个简单的createprocess替换createprocesswithlogonw,一切都可以正常工作。
我是错过了什么还是我想做的是不可能的?
编辑:svchost.exe在使用createprocesswithlogonw时实际创建进程,它似乎已经将该进程分配给匿名作业。此函数忽略“从作业创建”标志。所以真正的问题是:是否有办法阻止svnhost将流程分配给作业?
最佳答案
从MSDN上的Jeff Lawson开始:
与win32作业对象的交互
createprocesswithlogonw执行
作为
辅助登录服务,它具有
使过程逃逸的结果
任何作业对象成员资格/限制
即使作业对象不允许
分离。
此外,第二个
登录服务自动创建
它自己的新作业对象并分配
新的过程。因此,它是
打电话的人不可能
显式地将新进程分配给
任何其他作业对象(自进程
只能分配给一个作业
对象,并且永远不能从
作业对象一旦被分配
对一)
每个新进程需要不同的登录吗?否则,您可以使用新登录创建单个进程,并让它使用create process生成新进程,然后该进程可以与作业对象关联。