천객만래 [千客萬來] (It has an interminable succession of visitors)

Internet Explorer의 Protected Mode(보호모드)에서 activeX나 BHO 설치 후 레지스트리 값 수정후 IE를 재시작해야 하는 경우가 있는데 IERefreshElevationPolicy() 함수를 사용하면 그렇게 하지 않아도 된다고 합니다.

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);

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;
Posted by SB패밀리