2010-08-18 71 views
1

我的服務程序執行本身的另一個實例,實質上是CreateProcess(GetCommandLine())。子進程然後使用OpenProcess獲取其父進程的句柄(以便它可以檢測父進程何時停止運行)。對於某些客戶,OpenProcessERROR_ACCESS_DENIED而失敗。我試圖確定原因並重現內部測試的情況。什麼會報告帳戶的權限?

我想要一些我可以發送給客戶的東西(程序或使用已經安裝在Windows服務器上的程序的說明)以供它們運行並生成報告,其中包含服務運行的帳戶和特權該帳戶及其組已被授予或拒絕。我怎樣才能從客戶收集這些信息?

回答

0

獲取帳戶名稱很簡單 - GetUserName。獲得分配給該帳戶的權利還有點多。如果內存提供,則序列運行如下:

GetKernelObjectSecurity(Current_oject, &security_descriptor) 
GetSecurityDescriptorDacl(security_descriptor, &dacl) 
GetEffectiveRightsFromAcl(dacl, user_name, &rights) 

對於最後一步,您可能更願意使用GetExplicitEntriesFromAcl。所有這些都有一個問題:如果他們限制了用戶太多,它的一些(或全部)可能會失敗。

+0

我可能可以使用它。但是,我將傳遞給GetKernelObjectSecurity的內核對象是什麼?我猜GetCurrentProcess,因爲我想知道當前進程允許做什麼。 MSDN說我需要READ_CONTROL權限才能調用這個函數,但這不應該是一個問題,因爲這個進程正在請求關於它自己的信息,對吧? – 2010-08-19 19:41:50

+0

是的,你會想要當前的進程句柄(我認爲)。是的,我認爲你幾乎總是有權查看,但很難說 - 它可能會設置一些權限來防止這種情況發生。 – 2010-08-19 21:35:29