CreateProcessWithLogonW和AssignProcessToJobObject

时间:2009-08-17 12:14:53

标签: c windows security winapi

我有一个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将进程分配给作业?

1 个答案:

答案 0 :(得分:4)

来自MSDN上的Jeff Lawson

  

与Win32作业对象的交互

     

CreateProcessWithLogonW执行   作为孩子的新过程   二级登录服务,其中包含   让这个过程逃脱的结果   任何工作对象成员资格/限制   即使作业对象不允许   分离

     

此外,中学   登录服务自动创建   它自己的新Job Object并分配   进入它的新过程。因此,它是   调用者不可能   明确地将新流程分配给   任何其他工作对象(因为一个过程   可能只能分配给一个工作   对象,永远不能删除   作业对象一旦被分配   一个)。

每个新进程是否需要不同的登录?否则,您可以使用新登录创建单个进程,并使用CreateProcess生成新进程,然后可以将其与作业对象关联。