Monday, June 7, 2010

Windows Vista之後的AssignProcessToJobObject

今天因為一個極為奇怪的的問題困擾著我
當我嘗試呼叫 AssignProcessToJobObject 目標Process放進經過權限設定的Job時,不幸的傳回了System Error Code 5(ERROR_ACCESS_DENIED),並且困擾著我


在嘗試過多種方法後,決定透過網路來取得此問題的解決方案
幸運的,也有人遇到了此問題並有熱心人士提供了解答(原始資料)。原來在Vista之後,Windows為了解決相容性問題,Program Compatibility Assistant會在程式執行時將它自動加入到一個Job中,由於一個Process只能被加入到一個Job中,導致我的程式呼叫AssignProcessToJobObject失敗


從這張圖可以很明確的看到,就算是一個在普通不過的程式,也會被自動加入到一個特殊的Job中
解決方法:

  1. 可以在CreateProcess的CreationFlags加入CREATE_BREAKAWAY_FROM_JOB,這麼一來,Program Compatibility Assistant就不會將Process加入到Job中
  2. 透過一個Manifest檔指示Program Compatibility Assistant不要加Process加入到Job中
  3. 可以使用cmd.exe來執行你的Process,這樣也不會被加入到Job中

No comments:

Post a Comment