我正在管理員組中以用戶身份運行一個進程,試圖獲取另一個進程的進程標記。另一個進程由不在管理員組中的用戶運行。這是我使用的代碼的要點。此代碼中的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仍然成功地在系統環境的過程。
感謝您的幫助。
(+1)好題。每當我寫一個新的Windows服務時,我都會遇到這類問題 - 顯然每次我忘記了舞蹈。 – 2010-01-15 18:56:54
您是否找到了解決方案? (除了作爲本地服務運行) – vdk 2010-08-19 07:07:38