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