[서비스에서 프로세스 접근 권한 조회]
프로세스의 접근 권한 조회 방법은 아래 사이트에 있는 ProcessPerms에 너무 잘 정리되어있다.
안그래도 관련 코드 찾기 힘든 와중에 단비같은 소스.
출처 : https://github.com/nccgroup/WindowsDACLEnumProject/tree/master/ProcessPerms
[서비스에서 프로세스 접근 권한 변경]
위 코드를 참조하여 현재 Process에 PROCESS_ALL_ACCESS 권한이 없다면 PROCESS_ALL_ACCESS 권한 부여.
회사에서 사용중인 솔루션에 포함된 코드들이 다수 있어 첨부 불가.
1. GetSecurityInfo() / GetAce() : ACE의 Type이 ACCESS_DENIED_ACE_TYPE인 것을 확인.
2. GetAclInformation( , , , AclSizeInformation) : ACL의 Size 계산
3. HeapAlloc으로 Size만큼 New ACL 할당
4. InitializeAcl() : New ACL 초기화
5. GetSidIdentifierAuthority() : 해당 SID의 Authority 알아오기
* S-1-1 : SECURITY_WORLD_SID_AUTHORITY (Everyone)
* S-1-5 : SECURITY_NT_AUTHORITY (System, Administrator, 사용자 계정 등등)
6. SID를 확인하여 System인지 Administrator인지 상세 구분.
* MSDN : Well-Known SIDs 참조
7. AllocateAndInitializeSid() : 위에서 구분한 그룹 및 사용자 계정에 따라 인자 설정.
* S-1-5-18 (SYSTEM)
-> AuthorityCount : 1
-> SubAuthority0 : SECURITY_LOCAL_SYSTEM_RID
* S-1-5-32 (Administrator)
-> AuthorityCount : 2
-> SubAuthority0 : SECURITY_BUILTIN_DOMAIN_RID
SubAuthority1 : DOMAIN_ALIAS_RID_ADMINS
* S-1-1 (Everyone)
-> AuthorityCount : 1
-> SubAuthority0 : SECURITY_WORLD_RID
* S-1-5-21 (사용자 계정)
-> AuthorityCount : 5
-> SubAuthority : GetSidSubAuthorityCount(), GetSidSubAuthority()로 구해와야 함.
* S-1-5-5 (Logon Session?)
-> AuthorityCount : 3
-> SubAuthority0 : SECURITY_LOGON_IDS_RID
-> SubAuthority1 : GetAuthLuid() - Luid.HighPart
-> SubAuthority2 : GetAuthLuid() - Luid.LowPart
8. AddAccessAllowedAce() : New ACL에 권한 재설정.
9. SetSecurityInfo() : 재설정한 ACL로 수정.
* 하나의 그룹에 대해서만 변경이 되지 않기 때문에 모든 그룹과 사용자 계정에 대해 1~8 작업을 반복하여 New ACL에 저장하였다가 마지막에 SetSecurityInfo로 Set!
[활성화된 윈도우 계정명 알아오기]
WTSEnumerateSessions, WTSQuerySessionInformation 함수를 이용하여
현재 활성화된 Session과 윈도우 계정명을 알아오는 예제.
코드는 정말 간단하지만 이런 작업은 처음이라 아래 사이트를 찾기 전까지 엄청 삽질.
출처 : http://blog.naver.com/PostView.nhn?blogId=ccandolyi&logNo=120059436475
'User mode' 카테고리의 다른 글
StartService 1053 (0x41D) (3) | 2014.03.07 |
---|---|
IsUserAdmin (0) | 2014.02.05 |
InterlockedCompareExchange (0) | 2014.01.29 |
UAC 사용여부와 관리자 권한 획득 유무 (0) | 2014.01.14 |
CreateRemoteThread - ERROR_NOT_ENOUGH_MEMORY (0) | 2013.08.08 |