DirTy™의 하루일과/DirTy™의 가당찮은MFC

[MFC] 윈도우 프로세스 특권

DirTy™ 2014. 2. 18. 16:43

 

프로젝트 중에 윈7에서 PC종료를 해야하는 코드를 추가해야하는데

종료 코드를 넣어도 종료가 안되는 상황이 발생... 왜그럴까 하고 검색해보니

아래와 같은 설명....

-------------------------------------------------------------------------------------------

로컬 컴퓨터에서 보안 정책을 실시하고, 런타임 개체 보호 및 감사를 수행하여 운영체제 리소스들을 보호하는 SRM(Security Reference Monitor)은 프로세스나 스레드의 보안 컨텍스트를 식별하기 위해 엑세스 토큰(access token, 줄여서 토큰)이라는 개체를 사용한다. 보안 컨텍스트는 프로세스 또는 스레드와 관련된 권한, 계정, 그룹 등에 대한 정보들로 구성된다. 기본적으로 자식 프로세스는 부모 프로세스에서 토큰을 복사해 쓴다.
Windows의 보안 메커니즘의 토큰의 두 가지 성분을 사용하여 어떤 개체들이 접근 가능한지, 어떤 행위들이 가능한지를 결정한다.
그중 한가지는 토큰의 사용자 SID와 그룹 SID이다.
나머지 하나가 토큰의 프로세스 또는 스레드가 무엇을 할 수 있는지를 검사하는데 사용되는 권한(특권) 배열(privilege array)이다. 토큰의 권한 배열은 토큰에 관련된 권한들의 목록이다.
특권은 활성화/비활성화 될 수 있다. 특권 검사가 성공하기 위해서는, 특권은 특정 토큰에 들어 있어야 하고 활성화되어 있어야 한다.

모든 프로세스에 접근할 수 있는 SeDebugPrivilege 특권을 활성화 시키는함수이다.

-------------------------------------------------------------------------------------------

 

뭐 결국 프로세스 접근 권한을 줘야 한다는 이야기...

코드상에 아래와같이 추가만 하면 잘된다.

 

HANDLE hToken; 
TOKEN_PRIVILEGES tkp; 
            
// Get a token for this process. 
            
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    return;
            
// Get the LUID for the shutdown privilege. 
            
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); 
            
tkp.PrivilegeCount = 1;  // one privilege to set    
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
            
// Get the shutdown privilege for this process. 
            
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); 
            
if (GetLastError() != ERROR_SUCCESS) 
    return;

 

ExitWindowsEx(EWX_FORCE | EWX_POWEROFF, 0);