Я запускаю процесс как пользователь в группе администраторов, пытаюсь получить маркер процесса для другого процесса. Другой процесс запускается пользователем, не входящим в группу администраторов. Вот суть кода, который я использую. pid в этом коде представляет идентификатор процесса не-администратора. Все это на Windows XP SP 2 и все на одной машине. Здесь удаленного доступа не происходит.
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. Я добавил некоторый код, чтобы понять привилегии процесса, выполняющего этот код, и включить как можно больше, а также собрать информацию о процессе, для которого я пытаюсь получить токен. Это включало запрос большего доступа (READ_CONTROL | ACCESS_SYSTEM_SECURITY в дополнение к PROCESS_QUERY_INFORMATION) из OpenProcess и вызов GetKernelObjectSecurity (дескриптор). Вот что у меня есть:
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, является членом группы администраторов.
Вот информация из 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 все же преуспел в системном контексте.
Спасибо за вашу помощь.