천객만래 [千客萬來] (It has an interminable succession of visitors)
[작업] Internet Explorer 주소창 검색 기술 개발

얼마전 인터넷 익스플로러어 주소검색창에서 키워드를 입력하면 검색엔진을 이용하여 사용자에게 유익한 검색결과를 보여주는 프로그램을 제작했다.

여기서, 단지 주소창 검색은 쉬워보였었다. 연초에 만들어 보았더니 쉽게 되어서 별거 아니구나 했었는데 이번에 개발하는데 무지어려웠다.

이미 공개된 소스들로는 로직만 사용될 정도였다. 제대로 구현되지 않아서는 세상에 공개할 수 없는 작품이었다.

윈도우즈 7이 나오면서 무지 어려워진것이다.
그리고 IE 버전별로 이렇게 동작과 구성이 다를줄 몰랐다. 결국 win xp와 win 7기반에서 IE버전별로 모조리 분석을 했다.

여러차례의 시행착오를 거쳤다. 그리고 결국 만들어 냈다. 그런데, win 7 ultimate 버전이 말썽이었다. BHO로 동작하면서 win 7의 UAC에 막혀서 고전을 했다.

하지만 이것도 결국 이겨냈다.
그래서 IE 6~9 모든 버전과 win xp, win 7 모두에서 주소창 검색이 동작하는 주소창 검색 솔루션을 만들었다.

추석연휴까지 반납했었는데...
된다고 믿었고 나 하나가 아닌 함께하는 사람들을 떠올리면서 이루어낸 것이라 생각했다.

추석에 못 찾아뵌 가족들은 이후 찾아뵈었다.
이 성과물이 나와 함께하는 분들에게 좋은 결과를 가져다 줄 것이라 믿는다.

많이 도와준 분들도 약간 도와준 분들도 나에게 모두 고마운 분들이다. 고마운 마음으로 계속해 나갈 것이다.
Posted by SB패밀리

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패밀리