다른 프로세스에 대한 프로세스 토큰을 얻으려고 Administrators 그룹의 사용자로 프로세스를 실행하고 있습니다. 다른 프로세스는 Administrators 그룹이 아닌 사용자가 실행합니다. 여기 내가 사용하는 코드의 요지가있다. 이 코드의 pid는 비 관리자 프로세스의 프로세스 ID를 나타냅니다. 이 모든 것은 Windows XP SP 2 및 모든 컴퓨터에 있습니다. 여기에 원격 액세스가 없습니다. 여기 OpenProcess에 대한OpenProcessToken이 ERROR_ACCESS_DENIED와 함께 실패하는 이유
HANDLE handle;
HANDLE token;
handle = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pid);
token = NULL;
OpenProcessToken(handle,TOKEN_DUPLICATE,&token);
참조 : 여기 OpenProcessToken에 대한 http://msdn.microsoft.com/en-us/library/ms684320%28VS.85%29.aspx이
참조 : http://msdn.microsoft.com/en-us/library/aa379295%28VS.85%29.aspx
OpenProcess에 성공하지만, 아무리 내가 OpenProcessToken에 DesiredAccess 인수에 전달할 것, 그것은 실패하지 및 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를 호출 프로세스가 관리자 그룹의 구성원인지 보여줍니다 생각 : 여기있어거야.
여기 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 서비스를 작성할 때 몇 달에 한 번 이런 종류의 문제에 직면 해 있습니다. 그리고 분명히 내가 춤을 잊을 때마다. –
해결책을 찾았습니까? (지역 서비스로 달리기 제외) – vdk