2012-11-21 105 views
2

我的應用程序正在運行中。我想用OpenJobObject得到一個Handle到這個Jobobject,所以我以後可以使用這個句柄。問題是,我不知道作業名稱,並將NULL傳遞給作業名稱時,返回錯誤87(參數不正確)。如何在不知道名稱的情況下獲取JobObject的句柄?

這是我嘗試過:

HANDLE handle = OpenJobObject(JOB_OBJECT_QUERY, FALSE, NULL); 
if (!handle ) printf("\nError %d", GetLastError()); 
else printf("\nOK"); 

我也發現這個MSDN上: 應用程序無法獲得一個句柄在運行它,除非它的工作對象有作業對象的名稱。但是,應用程序可以使用NULL調用QueryInformationJobObject函數以獲取有關作業對象的信息。

所以我的問題是,有可能以某種方式得到我的應用程序正在運行的JobObject的句柄?或者獲取我的應用程序運行的作業的名稱?

謝謝!

更新:
我迄今爲止代碼:http://pastebin.com/aJ7XMmci 現在,我從​​:(

+0

您可以枚舉所有命名的作業對象:http://www.scriptinternals.com/new/ us/support/Internal/WMI_Win32_NamedJobObject.htm –

+0

不幸的是,runas似乎沒有使用指定的作業對象,所以OpenJobObject在你的特定情況下不會起作用。 –

回答

0

確定收到錯誤87(參數不正確),看起來不像有任何受支持的方法。這並不意味着它不能完成!:-)

要枚舉系統中的所有句柄,請參見this question。示例代碼here可以對句柄進行過濾,僅查找屬於特定過程的那些句柄,但很容易更改。您可能需要首先啓用調試權限。

對於每個句柄,將其複製到您的過程中,然後調用IsProcessInJob以查明它是否是正確的句柄。

一旦你有了工作,檢查SYSTEM_HANDLE.ObjectTypeNumber是否總是相同的作業對象。它可能(至少在任何給定的操作系統上),在這種情況下,只需檢查作業對象句柄,就可以顯着提高代碼的效率。

您或許也可以過濾運行Secondary Logon服務的進程,因爲這似乎是爲runas創建作業對象的原因。

(如果你得到這個工作,請張貼代碼 - 它可能爲未來的訪客是非常有用的。)

+0

非常感謝!這應該工作......天才:)我一定會得到這份工作,因爲它給我和其他人帶來了很多麻煩。我還有一個問題,有人建議使用工作對象。 http://stackoverflow.com/questions/13399313/how-to-start-a-process-and-wait-for-its-child-process-to-finish您能否也請看看。也許你有另一個想法來解決我的問題。但我也會這樣解決它,並在我準備好時發佈代碼。 – kampi

+0

你有沒有在這裏看到我的答案? http://stackoverflow.com/a/13405317/886887 –

+0

是的,我做了,但不幸的是它沒有工作。它啓動setup.exe,但在setup.exe啓動它的兩個進程之後,setup.exe關閉,並且您的程序也退出:( – kampi

相關問題