2009-08-17 65 views
2

我有一個Windows服務(在WinXP SP2下),在LocalSystem帳戶下運行,使用CreateProcessWithLogonW啓動進程。爲了清理子進程,我試圖使用一個作業對象和TerminateJobObject。CreateProcessWithLogonW和AssignProcessToJobObject

MSDN指出作業句柄必須具有JOB_OBJECT_ASSIGN_PROCESS訪問權限,因爲它是通過CreateJobObject創建的。進程句柄必須具有PROCESS_SET_QUOTA和PROCESS_TERMINATE權限。我認爲它有它們,因爲TerminateProcess和SetProcessWorkingSetSize都返回沒有錯誤。

雖然,AssignProcessToJobObject失敗,錯誤5(拒絕訪問)。如果我用一個簡單的CreateProcess替換CreateProcessWithLogonW,一切正常。

我錯過了什麼,或者是我想要做的事情嗎?

編輯:似乎svchost.exe,實際上創建進程CreateProcessWithLogonW時使用,已分配進程到匿名作業。此函數忽略CREATE_CREAKAWAY_FROM_JOB標誌。所以真正的問題是:有沒有辦法阻止svnhost將進程分配給工作?

回答

4

Jeff Lawson在MSDN:

的Win32工作互動對象

CreateProcessWithLogonW執行 新工藝爲 Secondary Logon服務,它具有 結果作出的孩子進程轉義 任何作業對象成員/限制 即使作業對象不允許 分離。

此外,登錄服務 自動創建其自己的新作業對象並將 新進程分配給它。因此,它是 不可能呼叫者 明確指明新工藝 任何其他工作對象(因爲過程 可能只被分配給一個工作 對象,且永遠不能從 作業對象中除去一次它已被分配爲 )。

每個新進程是否需要不同的登錄?否則,您可以使用新登錄創建單個進程,並使用CreateProcess生成新進程,然後將其與作業對象關聯。

+0

實際上,我們需要一組固定的登錄名,所以我可以在每次登錄CreateProcess時使用這種方法。感謝你的回答。 – fraca7 2009-08-17 13:46:15

+0

我遇到了完全相同的問題。我的方式來解決它 - 如你所建議 - 創建第三個過程。謝謝。 – 2014-04-19 18:20:17

相關問題