본문 바로가기
IT-개발,DB

[개발/VC++] IE 보호 모드에서 비보호 모드 프로세스 실행

by SB리치퍼슨 2011. 3. 11.



IE 보호 모드에서 비보호 모드 프로세스 실행


UAC 환경(Windows Vista, Windows 7)의 IE7, IE8 보호모드에서 동작하는 ActiveX에서 실행 파일을 실행할 경우(브로커 프로세스) 비보호 모드로 열린다는 보안 경고창이 나온다.
이 문제를 해결하려면 아래와 같이 자동 권한 상승 정책을 레지스트리에 등록해주어야 한다. {347DAD60-9849-4921-89B6-16FA1B7936CC}는 임의의 GUID값이다.

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Low Rights\ElevationPolicy\{347DAD60-9849-4921-89B6-16FA1B7936CC}]
"AppName"="실행 파일명"
"AppPath"="실행 파일 위치(디렉토리)"
"Policy"=dword:00000003

또 다른 문제는 이 자동 권한 상승 정책을 IE 프로세스가 아닌 외부에서 추가하는 경우 ieuser.exe(IE7), iexplore.exe(IE8)에서 권한 상승 정책을 캐싱하고 있기 때문에 바로 적용이 안 된다는 것이다. ieuser.exe나 iexplore.exe 프로세스를 종료해야만 적용할 수 있다. 하지만 설치 과정에서 프로세스를 종료하는 것은 부담스러운 일이다.

이 문제를 해결하기 위해서 2007년 6월에 배포된 IE 보안 업데이트에 아래와 같은 새로운 API가 추가되었다.

HRESULT IERefreshElevationPolicy(VOID);

자동 권한 상승 정책을 레지스트리를 등록하고 ieframe.dll에 있는 IERefreshElevationPolicy 함수를 호출해주면 추가된 자동 권한 상승 정책이 바로 적용된다.
주의할 점은 IERefreshElevationPolicy를 호출할 때 반드시 IE 프로세스가 실행 중인 계정에서 호출해야 한다는 것이다. 별도의 관리자 계정이나 시스템 계정(Windows Installer의 경우 서비스에서 설치를 수행해 시스템 계정으로 설치가 되는 것으로 보인다)에서 호출할 경우 보안 경고창이 뜰 수 있다.

아래는 공식 블로그에 있는 예제 코드이다.

HRESULT RefreshPolicies()
{
    HRESULT hr = E_NOTIMPL;

    HMODULE hDll = LoadLibrary(L"ieframe.dll");
    if (NULL != hDll)
    {
        typedef HRESULT (*PFNIEREFRESHELEVATIONPOLICY)();
        PFNIEREFRESHELEVATIONPOLICY pfnIERefreshElePol = (PFNIEREFRESHELEVATIONPOLICY) GetProcAddress(hDll, "IERefreshElevationPolicy");
        if (pfnIERefreshElePol)
        {
            hr = pfnIERefreshElePol();
        } else {
             DWORD error = GetLastError();
             hr = HRESULT_FROM_WIN32(error);
         }
        FreeLibrary(hDll);
    } else {
       DWORD error = GetLastError();
       hr = HRESULT_FROM_WIN32(error);
    }
    return hr;
}

출처 : 인터넷

반응형

댓글