Tech2010.08.27 15:29

안녕하세요, 자이닉스의 꽃순이입니다.
(자제하겠습니다.)

최근 저희는 7월달 동안 바쁜 일정 보내다 이제 아주 쬐꼼 여유가 생겨, 블로깅할 떡밥을 물고 왔습니다.

요즘 -_-) 급 C++이랑 데이트 중이라, 울고 있습니다.
최근
wafe 과장님(울면서)작업을 하는 중에 IE 비보호 모드에서 외부 프로그램이 실행될 때, 허용 여부를 묻는 경고창을 어떻게 처리할 것인가에 대한 방법을 찾게 되었습니다.

방법은 총 세 가지인데,
1. 경고창에서 다시 묻지 않는다는 체크 박스를 체크하는 방법
2. IE를 관리자 권한으로 실행시키는 방법
3. 레지스트리에 실행시킬 프로그램을 등록하는 방법

들이 있습니다. 우리는 이 중, 3번을 선택하여 방법을 찾던 중에,
스틸님의 블로그에서
"IE 보호 모드에서 비보호 모드 프로세스 실행" 글을 참조하였습니다.

일단 우리가 레지스트리 키를 등록시킬 위치를 알아야겠죠?
실행 창에서 "regedit(레지스트리 편집기)"를 실행시켜서 왼쪽 탭에서 위치를 찾습니다.
HKEY_CURRENT_USER
- Software
  - Microsoft
    - Internet Explorer
      - Low Rights
        - ElevationPolicy

를 확인해보세요 ^-^) 쏼라쏼라 GUID 키들이 보일 겁니다. 새로운 프로그램의 레지스트리 키를 등록할 위치가 바로 이 곳입니다.
내용 구성이 어떻게 되어 있는지 한 놈 집어서 살펴볼까요?


REG_SZ AppName, REG_SZ AppPath, REG_DWORD Policy 이 세 가지 정보가 있는데요. 이 정보들은 레지스트리 키를 생성하여 등록할 때 채워줘야 할 내용들입니다.

자, 이제 레지스트리 키를 생성하여 등록할 위치와 내용을 채울 정보들이 무엇인지 알았으니, 프로그램을 레지스트리에 등록시켜주는 예제 프로그램을 만들어보도록 합시다.
우선, 관리자 권한으로 Visual Studio를 실행시켜 새로운 MFC 응용 프로그램 프로젝트를 생성한 후,


레지스트리에 실행시킬 프로그램을 등록시켜주는 함수를 생성합니다.

이제부터 사용될 함수와 상수들은 WinReg.h에 정의된 놈들입니다.
일단, 레지스트리 키 관련한 네 가지 함수를 아시면 되는데요.

RegOpenKeyEx : 특정 레지스트리 키를 연다.
RegCloseKey : 특정 레지스트리 키를 닫는다.
RegCreateKeyEx : 새로운 레지스트리 키를 생성한다.
RegSetValueEx : 레지스트리 키의 Value를 설정한다.

새로운 레지스트리 키를 등록시킬 위치가 있는지 확인부터 합시다.
RegOpenKeyEx를 이용하여 HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\Low Rights\\ElevationPolicy 키가 존재하는지 확인할 수 있습니다.

long rtn = 0;					// 레지스트리 관련 작업의 수행 성공/실패 여부를 갖는 변수
HKEY rtnKey = NULL;				// 레지스트리 관련 작업의 결과물인 레지스트리 키 정보를 갖는 변수

rtn = RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Internet Explorer\\Low Rights\\ElevationPolicy"), 0, KEY_ALL_ACCESS, &rtnKey);

RegOpenKeyEx의 반환값인 rtn이 0이면 레지스트리 키가 존재하는 것이고, 1이면 존재하지 않다는 것입니다.
Open한 레지스트리 키의 정보는 rtnKey에 담겨집니다.

그리고 새로운 레지스트리 키를 생성하기 위해 열었던 레지스트리 키를 닫습니다.

RegCloseKey(rtnKey);

닫은 후, 새로운 레지스트리 키를 생성해보도록 하죠.
예를 들어, calc.exe 라는 외부 프로세스가 실행된다는 것을 가정하고, 레지스트리에 새로이 등록한다고 했을 때,

DWORD dwDisp; // 레지스트리 키를 생성할 때, 상태 정보

CString guid = CreateGUID();    // GUID 키 생성
CString newRegKey;
newRegKey.Format(_T("SOFTWARE\\Microsoft\\Internet Explorer\\Low Rights\\ElevationPolicy\\%s"), guid);

rtn = RegCreateKeyEx(HKEY_LOCAL_MACHINE, newRegKey
	,0, NULL, REG_OPTION_NON_VOLATILE,  KEY_ALL_ACCESS, NULL, &rtnKey, &dwDisp);

dwDisp에 관한 설명이 조금 이상합니다만; 부가적인 설명을 덧붙이자면, RegCreateKeyEx를 이용하여 새로운 레지스트리 키를 생성할 때, 1이라는 값을 가지고 있으면, 생성할 레지스트리 키가 존재하지 않은 상태에서 생성된 상태라는 것을 의미하고, 2라는 값을 가지고 있으면, 이미 레지스트리 키가 존재하고 Open 되었다는 것을 의미합니다.
새로운 GUID를 생성하여 레지스트리 키로 등록합니다.

이제 새로운 레지스트리 키를 생성했으니, 레지스트리 키에 필요한 정보(AppName, AppPath, Policy)를 채워줍니다.

CString appName(_T("calc.exe"));
RegSetValueEx(rtnKey, _T("AppName"), 0, REG_SZ, (BYTE*)(appName.GetBuffer()), (appName.GetLength() + 1) * 2);
appName.ReleaseBuffer();

CString appPath(_T("C:\\Windows\\System32"));
RegSetValueEx(rtnKey, _T("AppPath"), 0, REG_SZ, (BYTE*)(appPath.GetBuffer()), (appPath.GetLength() + 1) * 2);
appPath.ReleaseBuffer();

DWORD dwPolicy = 3;
RegSetValueEx(rtnKey, _T("Policy"), 0, REG_DWORD, (BYTE*)(&dwPolicy), sizeof(dwPolicy));

AppName에는 외부 프로그램의 이름을 채웁니다. 저는 calc.exe를 채웁니다 ^-^)
AppPath에는 외부 프로그램의 경로를 채우고, Policy에는 3을 채우면 됩니다.

위의 작업을 모두 마쳤으면, 다시 레지스트리 키를 닫는 것으로 끝납니다.
프로그램을 실행시키고, 레지스트리 키에 calc.exe가 등록되어졌는지 확인해볼까요?


위의 사진처럼 레지스트리 편집기를 확인해보았을 때, 새로이 생성된 GUID 이름의 레지스트리 키가 생성되었고, 내용들이 채워져 있는 것을 확인하실 수 있을 것입니다.
이제 IE를 비보호 모드에서 실행시켰을 때에도, calc.exe를 실행시킬 것인지 허용 여부를 묻는 경고창이 뜨지 않을 것입니다 ^-^)

그럼 이만, 뿅!
Posted by 벚꽃손님

댓글을 달아 주세요