2010-01-15 2 views
12

다른 프로세스에 대한 프로세스 토큰을 얻으려고 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 여전히 시스템 컨텍스트 공정에 성공했다.

도움 주셔서 감사합니다.

+0

(+1) 문제. 나는 새 Windows 서비스를 작성할 때 몇 달에 한 번 이런 종류의 문제에 직면 해 있습니다. 그리고 분명히 내가 춤을 잊을 때마다. –

+0

해결책을 찾았습니까? (지역 서비스로 달리기 제외) – vdk

답변

1

먼저 세부 정보 부분에 들어가는 대신 제거 경로를 찾으셨습니까? - 프로세스를 LOCAL_SYSTEM으로 실행하고 트릭을 수행하는지 확인하십시오. 결국 신이 그것을 할 수 없다면 아무도 할 수 없다 : P.

+0

좋은 생각. 나는 그것을 시도했고 물론 시스템 계정으로 작동했다. 불행히도 admin 계정이 작동하지 않는 이유에 대한 전구는 없습니다. – dbyron

+0

이러한 문제의 또 다른 문제점은 대상 컴퓨터에 어떻게 연결되어 있는지에 있습니다. 원격 데스크톱 연결에는 기본적으로 "콘솔 액세스"가 없습니다. 원격으로 실제로 개발하고 있다면 : 나는 콘솔 문자열을 통해 RDP 클라이언트에 제공 할 수있는/console 또는/admin 스위치 (윈도우 버전에 따라 다름)를 추천합니다. –

+0

이것은 모두 하나의 컴퓨터에 있습니다. 여기에 원격 액세스가 없습니다. – dbyron

0

대상 프로세스의 SECURITY_DESCRIPTOR은 SYSTEM 사용자 만 프로세스 토큰을 열 수 있다고 생각합니다. 슬프게도 할 수있는 일이 없다는 것을 의미합니다.

-1

예 서비스 또는 앱 인스턴스를 서비스로 실행할 수있는 해결책이 있습니다. 좋은 당신이 시스템으로 실행 코드를 얻을 것이다 이런 식으로 ....

또 다른 옵션 (하지만 더 방해) 이미 관리자이기 때문에, 대상 프로세스의 ACL을 변경하는 것입니다 ....

관련 문제