Почему OpenProcessToken завершается ошибкой с ERROR_ACCESS_DENIED - PullRequest
14 голосов
/ 15 января 2010

Я запускаю процесс как пользователь в группе администраторов, пытаюсь получить маркер процесса для другого процесса. Другой процесс запускается пользователем, не входящим в группу администраторов. Вот суть кода, который я использую. 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 все же преуспел в системном контексте.

Спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 15 января 2010

Вместо того, чтобы вдаваться в подробности, идите ли вы по пути исключения? - запустите процесс как LOCAL_SYSTEM и посмотрите, поможет ли это. В конце концов, если Бог не может этого сделать, то никто не может: P.

0 голосов
/ 10 ноября 2017

да, есть решение, которое вы можете запустить как службу или экземпляр вашего приложения. таким образом, ваш код будет работать как система ....

Другой вариант (но более навязчивый), так как вы уже являетесь администратором, это изменить целевой процесс acl ....

0 голосов
/ 03 декабря 2013

Полагаю, что SECURITY_DESCRIPTOR целевого процесса позволяет только пользователю SYSTEM открывать свой токен процесса. Это, к сожалению, означало бы, что вы ничего не можете сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...