Я выполняю процесс как пользователь в Группе администраторов, пытаясь получить маркер процесса для другого процесса. Другой процесс выполняется пользователем не в Группе администраторов. Вот суть кода, который я использую. 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 все еще преуспел в системном процессе контекста.
Спасибо за помощь.
Вместо того, чтобы перейти к деталям головы сначала, вы спустились по пути устранения? - Запустите процесс как local_system и посмотрите, если это делает трюк. Ведь, если бы Бог не может сделать это, то никто не может: с.