2010-01-15 139 views
12

我正在管理員組中以用戶身份運行一個進程,試圖獲取另一個進程的進程標記。另一個進程由不在管理員組中的用戶運行。這是我使用的代碼的要點。此代碼中的pid表示非管理進程的進程ID。所有這些都在Windows XP SP 2上,並且都在同一臺機器上。這裏沒有遠程訪問。爲什麼OpenProcessToken失敗,出現ERROR_ACCESS_DENIED

HANDLE handle; 
HANDLE token; 

handle = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pid); 
token = NULL; 
OpenProcessToken(handle,TOKEN_DUPLICATE,&token); 

參考了OpenProcess這裏:http://msdn.microsoft.com/en-us/library/ms684320%28VS.85%29.aspx

參考了OpenProcessToken這裏:http://msdn.microsoft.com/en-us/library/aa379295%28VS.85%29.aspx

OpenProcess成功,但無論怎樣我傳爲DesiredAccess參數OpenProcessToken,它失敗,並且GetLastError()返回ERROR_ACCESS_DENIED。我添加了一些代碼來理解運行此代碼的進程的權限並儘可能多地啓用,以及收集關於我試圖獲取令牌的進程的信息。這涉及從OpenProcess請求更多的訪問權限(READ_CONTROL | ACCESS_SYSTEM_SECURITY和PROCESS_QUERY_INFORMATION),並調用GetKernelObjectSecurity(handle)。下面是我得到了什麼:

current user: PLEASE_T\dbyron (S-1-5-21-3405506234-1792454352-3826119157-1005) 
current process: group 0: flags: 0x00000007 sid: S-1-5-21-3405506234-1792454352-3826119157-513 (PLEASE_T\None) 
current process: group 1: flags: 0x00000007 sid: S-1-1-0 (\Everyone) 
current process: group 2: flags: 0x0000000F sid: S-1-5-32-544 (BUILTIN\Administrators) 
current process: group 3: flags: 0x00000007 sid: S-1-5-32-545 (BUILTIN\Users) 
current process: group 4: flags: 0x00000007 sid: S-1-5-4 (NT AUTHORITY\INTERACTIVE) 
current process: group 5: flags: 0x00000007 sid: S-1-5-11 (NT AUTHORITY\Authenticated Users) 
current process: group 6: flags: 0xC0000007 sid: S-1-5-5-0-91553 (no account mapping) 
current process: group 7: flags: 0x00000007 sid: S-1-2-0 (\LOCAL) 
SeDebugPrivilege privilege enabled 
SeTakeOwnershipPrivilege privilege enabled 
SeSecurityPrivilege privilege enabled 
SeChangeNotifyPrivilege privilege enabled 
SeBackupPrivilege privilege enabled 
SeRestorePrivilege privilege enabled 
SeSystemtimePrivilege privilege enabled 
SeShutdownPrivilege privilege enabled 
SeRemoteShutdownPrivilege privilege enabled 
SeDebugPrivilege privilege enabled 
SeSystemEnvironmentPrivilege privilege enabled 
SeSystemProfilePrivilege privilege enabled 
SeProfileSingleProcessPrivilege privilege enabled 
SeIncreaseBasePriorityPrivilege privilege enabled 
SeLoadDriverPrivilege privilege enabled 
SeCreatePagefilePrivilege privilege enabled 
SeIncreaseQuotaPrivilege privilege enabled 
SeUndockPrivilege privilege enabled 
SeManageVolumePrivilege privilege enabled 
SeImpersonatePrivilege privilege enabled 
SeCreateGlobalPrivilege privilege enabled

我試圖讓每一個特權可能的,而且我覺得上面的組信息顯示過程調用OpenTokenProcess是Administrators組的成員。

下面是從GetKernelObjectSecurity信息:

control(SE_DACL_PRESENT | SE_SELF_RELATIVE, 0x00008004) 
owner sid: S-1-5-21-3405506234-1792454352-3826119157-2807 (PLEASE_T\dummyusr) 
group sid: S-1-5-21-3405506234-1792454352-3826119157-513 (PLEASE_T\None) 
grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-21-3405506234-1792454352-3826119157-2807 (PLEASE_T\dummyusr) 
grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-32-544 (BUILTIN\Administrators) 
grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-18 (NT AUTHORITY\SYSTEM)

所以看來dummyusr(非管理員)過程允許訪問到管理員組。這可能是我誤解了所以爲什麼OpenProcessToken失敗,ERROR_ACCESS_DENIED?我試着將TOKEN_DUPLICATE改爲TOKEN_QUERY,但不會改變結果。

我錯過了一個特權?還有什麼會拒絕我訪問此進程的訪問令牌?我已經在沒有反病毒軟件的機器上試過這個,但我仍然得到相同的結果。

我也試過這個在系統上下文中運行。關於在這種情況下,當前進程的信息是:

current user: NT AUTHORITY\SYSTEM (S-1-5-18) 
current process: group 0: flags: 0x0000000E sid: S-1-5-32-544 (BUILTIN\Administrators) 
current process: group 1: flags: 0x00000007 sid: S-1-1-0 (\Everyone) 
current process: group 2: flags: 0x00000007 sid: S-1-5-11 (NT AUTHORITY\Authenticated Users)

注意,標誌爲BUILTIN \ Administrators組略有不同。管理員進程有0xF,系統進程有0xE。從http://msdn.microsoft.com/en-us/library/aa379624%28VS.85%29.aspx開始,0x1位表示SE_GROUP_MANDATORY,在這裏看起來並不相關。

默認情況下,系統上下文過程中也有一些額外的特權:

SeAuditPrivilege 
SeCreatePermanentPrivilege 
SeLockMemoryPrivilege 
SeTcbPrivilege

但我禁用所有這些,OpenProcessToken仍然成功地在系統環境的過程。

感謝您的幫助。

+0

(+1)好題。每當我寫一個新的Windows服務時,我都會遇到這類問題 - 顯然每次我忘記了舞蹈。 – 2010-01-15 18:56:54

+0

您是否找到了解決方案? (除了作爲本地服務運行) – vdk 2010-08-19 07:07:38

回答

1

而不是首先詳細介紹,你有沒有走下去的路線? - 運行過程LOCAL_SYSTEM,看看是否有竅門。畢竟,如果上帝不能做到這一點,那麼沒有人可以:P。

+0

好主意。我嘗試了它,當然它作爲系統帳戶工作。很遺憾,沒有燈泡說明管理員帳戶無法使用的原因。 – dbyron 2010-01-15 21:41:11

+0

這些問題的另一個關鍵點是關於如何連接到目標計算機。遠程桌面連接默認情況下不具有「控制檯訪問權限」。如果你的確在遠程開發:我會推薦/ console或/ admin開關(取決於windows的版本) - 你可以通過連接字符串提供給RDP客戶端。 – 2010-01-16 16:07:09

+0

這一切都在一臺機器上。這裏沒有遠程訪問。 – dbyron 2010-01-16 16:19:18

0

我想目標進程的SECURITY_DESCRIPTOR只允許SYSTEM用戶打開他的進程標記。 這意味着你不能做任何事。

-1

是的,有一種解決方案,您可以運行服務或應用程序的實例作爲服務。這樣你會得到你的代碼運行的系統....

另一個選擇(但更具侵入性),因爲你已經是管理員,是改變目標進程ACL ....