Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CreateProcessWithLogonW和AssignProcessToJobObject_C_Windows_Security_Winapi - Fatal编程技术网

CreateProcessWithLogonW和AssignProcessToJobObject

CreateProcessWithLogonW和AssignProcessToJobObject,c,windows,security,winapi,C,Windows,Security,Winapi,我有一个Windows服务(在WinXP SP2下),在LocalSystem帐户下运行,它使用CreateProcessWithLogonW启动进程。为了清理子进程,我尝试使用作业对象和TerminateJobObject MSDN声明作业句柄必须具有作业对象分配进程访问权限,该权限自通过CreateJobObject创建以来一直存在。进程句柄必须具有进程设置配额和进程终止权限。我认为它有它们,因为TerminateProcess和SetProcessWorkingSetSize都返回而没有错

我有一个Windows服务(在WinXP SP2下),在LocalSystem帐户下运行,它使用CreateProcessWithLogonW启动进程。为了清理子进程,我尝试使用作业对象和TerminateJobObject

MSDN声明作业句柄必须具有作业对象分配进程访问权限,该权限自通过CreateJobObject创建以来一直存在。进程句柄必须具有进程设置配额和进程终止权限。我认为它有它们,因为TerminateProcess和SetProcessWorkingSetSize都返回而没有错误

但是,AssignProcessToJobObject失败,错误为5(访问被拒绝)。如果我用一个简单的CreateProcess替换CreateProcessWithLogonW,一切都会很好

我是错过了什么,还是我想做的不可能

编辑:svchost.exe似乎已经将进程分配给匿名作业,它在使用CreateProcessWithLogonW时实际创建了该进程。此函数将忽略CREATE_CREAKAWAY_FROM_作业标志。所以真正的问题是:有没有办法防止svnhost将流程分配给作业?

来自MSDN:

与Win32作业对象的交互

CreateProcessWithLogonW执行 新流程作为 辅助登录服务,它具有 使进程逃逸的结果 任何作业对象成员资格/限制 即使作业对象不允许 分离

此外,第二 登录服务自动创建 它自己的新作业对象并分配 将新流程融入其中。因此,它是 呼叫方不可能 显式地将新进程分配给 任何其他作业对象(自进程之后) 只能分配给一个作业 对象,并且永远不能从 作业对象一旦被分配,就会被删除 对一)


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

实际上,需要一组固定的登录,因此我可以使用这种方法,每个登录一个进程来执行CreateProcess。谢谢你的回答。我遇到了完全相同的问题。我解决这个问题的方法是——正如你们所建议的——创建第三个过程。谢谢