요즈음 개그콘서트에서 한창 인기를 누리고 있는 "남하당 여당당"의 두 주인공이 직접 촬영한 Windows 7 Personal Cloud Life 캠페인 동영상, 보셨나요? 이 글을 쓰고 있는 현 시점에서 두 편의 동영상이 선 공개되었고 조만간 새로운 동영상들이 유익한 내용과 함께 여러분을 찾아가게 될 예정입니다. 나른하고 졸린 식곤증을 재미있는 개그 동영상과 함께, 그리고 유익한 정보를 함께 배우며 재미있게 보내보신다면 좋겠습니다. :-D

캠페인 홈페이지에서 이벤트 응모도 가능합니다. http://www.win7pc.co.kr/ 를 방문하시면 됩니다. :-)

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

작년에 Windows Internet Explorer 8이 나왔을 때에는, Internet Explorer도 다른 브라우저들과 마찬가지로 "조금씩 더 좋아지는 행보"를 이어나갔었습니다. 그럼에도 불구하고, 어떤 맥락에서는 Internet Explorer 6 이후로 별다를 것 없이, 아키텍처에 관한 향상만을 논하는 정도에 그쳤던 것도 사실입니다. 그러나 이번에 발표될 Internet Explorer 9은 "Game Changer"임에 틀림이 없습니다. :-)

Windows Internet Explorer 9 (이하 IE9)은 현재 표준안 작업 중에 있는 HTML 5의 최신 사양을 지원하며, CSS v3.0을 정확히 처리하고, JavaScript의 성능 향상을 위하여 별도로 제작된 고성능 엔진인 Chakra Engine을 도입하였으며, 모든 렌더링이 이전의 GDI 기반이 아닌, DirectX 기반의 렌더링으로 대체된 것이 특징입니다. 이에 따라, HTML 5에서 가장 많이 주목받는 부분인 2.5D 그래픽이나 3D 그래픽의 구현이 Silverlight나 Adobe Flash, Unity 3D와 같은 써드 파티 기술에의 의존도를 최소화하고 단독으로도 구현하는 것을 고려해볼 수 있게 된 것입니다.

IE9은 지금까지 Platform Preview로 총 4번 공개되었으며, 이번에는 실제로 여러분의 데스크톱 컴퓨터의 Major Browser를 IE9으로 변경할 수 있도록 완전히 완성된 Beta 버전이 발표되었습니다. Beta 버전을 다운로드하려면, http://www.ie9html5.com/ 에 접속하여 다운로드하시면 됩니다. IE9부터는 Windows XP, Windows Server 2003을 더 이상 지원하지 않으며, 따라서 이들 운영 체제에서 택할 수 있는 최신 브라우저는 IE8으로 한정됨을 유의하셔야 하겠습니다.

다운로드 바로가기: http://msdn.microsoft.com/ko-kr/ie/aa740473.aspx

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

Windows Azure 개발 환경 및 기능 살펴보기에 대한 세미나를 준비하는 도중에 테스트를 위하여 설치와 테스트를 병행하던 도중, 문제에 빠질 수 있는 부분들이 몇 가지 있을 것으로 예상되어 개발 환경을 구축하는 방법에 대한 글을 정리하여 올려봅니다.

 

1. 시스템의 최소 요구 사항을 확인합니다.

 

Windows Azure 개발 환경을 구축하기 위해서는 시스템이 Windows Vista Service Pack 1 이상 - 또는 - Windows Server 2008을 실행 중이어야 합니다. Windows XP와 Windows Server 2003에서는 Windows Azure 개발 환경을 구축할 수 없음을 유의합니다. Windows Vista RTM 버전을 사용 중인 경우, 반드시 Service Pack 1을 설치하여야 합니다.

 

2. 인터넷 정보 서비스 (IIS) 및 WCF HTTP 활성화 옵션이 설정되어있는지 확인합니다.

 

Windows Azure 개발 환경을 구축하기 위해서는 시스템에 Internet Information Services (인터넷 정보 서비스)와 함께, WCF HTTP 기반 활성화 옵션이 설정되어있어야 합니다. 이를 확인하시려면 각 운영 체제 별로 다음과 같이 실행합니다.

 

Windows Vista 및 Windows 7의 경우

  • 시작 메뉴 -> 설정 -> 제어판 -> 프로그램 -> 프로그램 및 기능 순으로 선택합니다.
  • Windows 기능 켜고 끄기를 선택합니다.
  • Microsoft .NET Framework 3.0 (Windows 7의 경우 Microsoft .NET Framework 3.5.1)아래의 Windows Communication Foundation HTTP 활성화에 체크합니다.
  • Internet Information Services (또는 인터넷 정보 서비스) 아래의 World Wide Web 서비스 아래의 응용프로그램 개발 기능 아래에서 ASP.NET과 CGI에 체크합니다.
  • 선택한 항목들을 설치합니다.

Windows Server 2008 및 Windows Server 2008 SP1의 경우 (Core 버전은 해당되지 않습니다)

  • 시작 메뉴 -> 프로그램 -> 관리 도구 -> 서버 관리자 순으로 선택합니다.
  • 서버 관리자 화면에서, "기능 요약"의 "추가"를 선택합니다.
  • "추가" 대화 상자에서, Microsoft .NET Framework 3.0 (Windows Server 2008 SP1의 경우 Microsoft .NET Framework 3.5.1) 아래의 WCF 활성화 아래의 HTTP 활성화를 선택한 후, "다음" 버튼을 클릭합니다.
  • "역할 요약" 단계에서, 웹 서버 (IIS) 항목이 목록 중에 포함되어있는지 확인합니다. 만약 없을 경우, "역할 추가" 버튼을 클릭합니다.
  • "역할 추가" 대화 상자에서, "역할 요약" 아래의 "웹 서버 (IIS)"를 선택합니다.
  • 웹 서버 관리 대화 상자에서 "서비스 역할 추가"를 클릭합니다.
  • 나타나는 대화 상자에서 "웹 서버" 아래의 "응용프로그램 개발" 아래의 "ASP.NET"과 "CGI"를 선택하고, 다음 버튼을 클릭하여 선택한 항목들을 설치합니다.

3. Visual Studio를 설치합니다.

 

Visual Studio 2008 Professional 이상의 버전이 필요하며, Visual Studio 2008 Professional을 가지고 있지 않은 경우, http://www.microsoft.com/express/ 에서 Visual Web Developer 2008 SP1을 다운로드하여 설치할 수 있습니다.

 

Visual Studio 2008 Professional이 설치되어있으나 서비스팩을 설치하지 않은 경우, http://msdn.microsoft.com/en-us/vstudio/products/cc533447.aspx 에서 다운로드하여 설치할 수 있습니다.

 

Visual Studio 2010에서 테스트해보기를 원하는 경우, Visual Studio 2010 Beta 2 - 또는 - http://www.microsoft.com/express/ 에서 Visual Web Developer 2010 Beta 2를 무료로 다운로드하여 설치할 수 있습니다.

 

4단계의 내용과 관련하여, 설치 시 자동으로 선택되는 SQL Server 2005 - 또는 SQL Server 2008 Express Edition은 같이 설치해주실 것을 권장합니다.

 

4. Microsoft SQL Server 2005 - 또는 - Microsoft SQL Server 2008 인스턴스를 확인합니다.

 

Windows Azure의 Storage 기능을 로컬 컴퓨터에서 테스트해보기 위하여, Microsoft SQL Server 2005 버전 이상의 데이터베이스 인스턴스가 필요합니다. 개발 목적으로 사용하기 위하여, 무료로 Express Edition을 다운로드받을 수 있으며, Visual Studio 2008 설치 시 기본 옵션으로 설치하였을 경우 이미 시스템에 하나 이상의 SQL Server Express Edition이 설치되어있을 것입니다.

 

5. Windows Azure SDK 2009년 11월 버전을 설치합니다.

 

로컬 컴퓨터에서 Windows Azure 플랫폼의 환경을 재현하는 도구, Windows Azure 플랫폼에서 사용하는 닷넷 어셈블리의 개발 버전 및 필수 도움말, 기본 문서 자료, 배포용 패키징 도구 일체를 포함하는 Windows Azure SDK를 다운로드하여 설치해야 합니다. http://www.microsoft.com/downloads/info.aspx?na=47&p=2&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=6967ff37-813e-47c7-b987-889124b43abd&u=details.aspx%3ffamilyid%3d772990DA-8926-4DB0-958F-95C1DA572C84%26displaylang%3den 에서 다운로드 가능합니다.

 

NOTE) 이 글을 작성하는 현 시점에서 가장 최신 버전은 2009년 11월 버전이며 새 버전이 출시될 수 있으므로 Windows Azure 홈페이지를 참고하여 주시기 바랍니다.

 

6. Windows Azure Tools 2009년 11월 버전을 설치합니다.

 

Windows Azure SDK와 연계하여, Visual Studio 2008 및 Visual Studio 2010을 위한 개발 도구, 프로젝트 템플릿, 필수 도움말 및 기본 문서 자료 일체를 포함하는 Windows Azure Tools를 다운로드하여 설치해야합니다. http://www.microsoft.com/downloads/details.aspx?FamilyID=6967ff37-813e-47c7-b987-889124b43abd&displaylang=en 에서 다운로드 가능합니다.

 

7. KB967631 핫픽스 설치 (운영 체제 무관, Visual Studio 2008 SP1 및 Visual Web Developer 2008 SP1 사용 시 설치 필요)

 

운영 체제에 관계없이, Visual Studio 2008 SP1 및 Visual Web Developer 2008 SP1을 사용하여 Windows Azure SDK 및 Windows Azure Tools 2009년 11월 버전을 활용하는 경우, http://go.microsoft.com/fwlink/?LinkId=145526 에서 KB967631 핫 픽스를 설치하여 디버깅에 관련된 문제점을 수정할 수 있습니다.

 

8. KB967131 핫픽스 설치 (개발 도구 무관, Windows 7, Windows Server 2008 SP2 미만인 경우 설치 필요)

 

개발 도구 버전에 관계 없이, Windows Vista 모든 버전, Windows Server 2008 SP1의 경우 http://support.microsoft.com/kb/967131 에서 FastCGI 기반의 개발을 정상적으로 테스트해볼 수 있도록 시스템을 수정할 수 있습니다.

 

9. KB963676 핫픽스 설치 (개발 도구 무관, Windows 7 이외의 모든 운영 체제에서 설치 필요)

 

개발 도구 버전에 관계 없이, Windows 7 이외의 모든 운영 체제에서 https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=16827&wa=wsignin1.0 의 핫픽스를 설치하여 Visual Studio의 안정성 문제를 해결할 수 있습니다.

 

10. KB971842 / KB977420 핫픽스 설치 (개발 도구 무관)

 

개발 도구 버전에 관계없이, Windows Vista 및 Windows Server 2008은 KB971842 핫 픽스를, Windows 7 및 Windows Server 2008 R2는 KB977420 핫 픽스를 설치하여, Windows Azure Web Role 위에서 실행되는 WCF 서비스에 대한 참조를 클라이언트에서 정확하게 받아들일 수 있도록 할 수 있습니다.

 

KB971842 (Windows Vista, Windows Server 2008) 설치: http://code.msdn.microsoft.com/KB971842

KB977420 (Windows 7, Windows Server 2008 R2) 설치: http://code.msdn.microsoft.com/KB977420

 

이 핫 픽스를 설치하고, 설정 파일 (.config)에 useRequestHeaderForMetadataAddress 요소를 추가하여 HTTP 요청 헤더를 기준으로 WCF 참조를 맺고 통신할 수 있도록 설정합니다.

 

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

Windows가 1985년 11월에 처음 발매된 이후, 내년 2010년이면 약 25년째에 접어듭니다. Windows 7과 Windows Azure가 나오는 요즈음, 문득 Windows의 옛날 광고들은 어떤 메시지들을 담고 있었고 어떤 이야기들을 하고 있었는지 궁금해져서 유튜브에 올라와있던 광고들을 스크랩해보았습니다. 재미삼아서 봐주세요. :-)

 

Windows 1.0


Windows 3.0


Windows 95


Windows 98


Windows 2000


Windows XP


Windows Vista


Windows 7 (아크몬드님 감사합니다. 비디오 수정했습니다. :-) )


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

최근 고객사의 요청으로 ActiveX 컨트롤 하나를 유지보수하고 있습니다. ActiveX 컨트롤에서 탈피하려는 추세가 있지만, 별 다른 대안이 없어서 ActiveX 컨트롤을 유지보수해야 하는 경우도 아직 우리나라에서는 상당히 많은것 같습니다.

 

Internet Explorer 7.0부터는 보호 모드라는 개념이 새로 소개되었습니다. 보호 모드란, 일종의 Sand-box 개념으로 기존과 같이 현재 로그온한 사용자의 권한을 그대로 물려받아 무분별하게 실행되는 것을 방어하는 안전 장치입니다. Windows XP와는 달리 Windows Vista부터는 일반 사용자를 단순히 관리자로 분류하지 않고, UAC를 통하여 작업에 대해 허가/거절 여부를 정할 수 있게 하였습니다.

 

우리가 권한 상승이라고 이야기하는 기능은 사실 권한 상승을 사용자에게 요청하는 것입니다. 이러한 권한 상승 요청을 구현하기 위하여 이제까지 참고할 수 있는 보편적인 리소스는 EXE 파일과 함께 매니페스트 파일을 배포하는 것이 대표적인 것이었습니다. 그리고 ActiveX 컨트롤의 경우 Elevation Moniker를 통하여 권한 할당을 받는 것이 대표적입니다.

 

ActiveX 컨트롤에서 어떻게 권한 상승을 구현할 수 있는지에 대하여 잘 정리한 권용휘 MVP님의 아티클을 참고하시면 어떻게 권한 상승이 이루어지고 관리될 수 있는지에 대한 컨셉을 확인하실 수 있습니다. (http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=7669) 저는 권용휘 MVP님의 아티클 위에 몇 가지 내용을 더 첨언해보고자 합니다.

 

1. Visual C++ 6.0 (SP6)에서의 권한 상승 구현

 

놀랍게도, 그리고 안타깝게도, Visual C++ 6.0 개발 도구를 업그레이드하지 못하는 이슈는 도처에 널려있습니다. 기존에 개발되어있던 소프트웨어나 라이브러리가 특정 문자 세트에 완벽하게 맞추어져있지만, 업그레이드할 수 없을만한 이슈 (개발 업체의 부도 - 또는 - 계약 해지 / 담당자의 연락 두절과 같은)로 인하여, 올해부터는 더 이상 일체의 기술 지원을 받을 수 없는 (서비스 팩 다운로드도 MS 공식 홈페이지에서는 더이상 받으실 수 없습니다.) 그런 개발 플랫폼위에서 고군분투해야 하는 상황은 생각보다 자주 있습니다.

 

사실 권한 상승을 제대로 프로그래밍하려면 Windows Vista나 Windows 7 SDK가 필요합니다. 하지만 이들 SDK의 코드를 가져다 사용하려면 개발 도구를 Visual C++ 2005나 2008로 업그레이드할 필요가 있습니다. 하지만 개발 도구나 Windows SDK를 설치하지 않고 간단히 적용할 수 있다고 소개된 방법은 다행히 Visual C++ 6.0에서 온전하게 동작합니다.

 

typedef struct tagBIND_OPTS3 : tagBIND_OPTS2 {
 HWND hwnd;
} BIND_OPTS3, *LPBIND_OPTS3;

위의 코드를 자주 사용하는 헤더에 선언해두면 권한 상승을 위하여 호출하는 CoGetObject에 정확히 바인딩할 수 있습니다. 그리고, 아래의 두 함수를 이용하여, 권한 상승을 지원하는 운영 체제 (Windows Vista 이상의 운영 체제)를 식별하고 실제로 객체를 생성할 수 있습니다.

 

HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, OUT void ** ppv)
{
 BIND_OPTS3 bo;
 OLECHAR wszCLSID[50];
 OLECHAR wszMonikerName[300];
 const int CHARS_IN_GUID = 39;

 StringFromGUID2(rclsid, wszCLSID, CHARS_IN_GUID);
 swprintf(wszMonikerName, L"Elevation:Administrator!new:%s", wszCLSID);
 wprintf(L"%s\r\n", wszCLSID);
 wprintf(L"%s\r\n", wszMonikerName);

 memset(&bo, 0, sizeof(bo));

 bo.cbStruct = sizeof(bo);
 bo.hwnd = hwnd;
 bo.dwClassContext = CLSCTX_LOCAL_SERVER;

 return CoGetObject((LPCWSTR)wszMonikerName, &bo, riid, ppv);
}

 

BOOL IsUACRequiredOperatingSystem(void)
{
 BOOL bIsUACRequired = FALSE;
 OSVERSIONINFO sInfo;
 sInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

 if (GetVersionEx(&sInfo))
 {
  if( sInfo.dwPlatformId == VER_PLATFORM_WIN32_NT &&
   sInfo.dwMajorVersion >= 6 &&
   sInfo.dwMinorVersion >= 0) { // Windows VISTA or Higher
   bIsUACRequired = TRUE;
  }
 }

 return bIsUACRequired;
}

 

Visual C++ 6.0 기반의 프로젝트들은 거의 대부분 ANSI나 Multibyte Character Set 기반의 문자 세트를 기준으로 프로그램이 구성되어있습니다. 확장성을 위하여 Transition이 가능한 데이터 타입 (LPTSTR, LPCTSTR, TCHAR 등)은 거의 고려하지 않았을 확률이 높습니다. 하지만 우리가 호출해야 할 API들은 유니코드 문자열을 필요로 하기 때문에 직접 유니코드를 사용하도록 기존 코드를 수정하였습니다. 그리고 더불어서, StringCchPrintf 함수를 대신하여 sprintf 계열의 함수를 직접 이용하였습니다.

 

2. 실제 ActiveX 컨트롤에 권한 상승을 적용하는 또 다른 방법

 

권용휘 MVP님의 아티클에서 설명하는 방법은, 특정 메서드나 프로퍼티의 호출 과정에서 필요로하는 권한 상승을, 권한 상승을 외부에서 요구하고 결과를 받기 위한 프록시 멤버와, 실제 처리하는 멤버로 이원화하여 구현하는 방식입니다. 대부분의 경우 이 방법으로 해결할 수 있다고 생각합니다. 하지만 간혹, ActiveX 컨트롤의 동작이나 상태, 속성을 정의하는 작업 전체가 시스템에 종속적으로 구성된 경우도 있을 수 있습니다. 이 경우에는, 격리모드에서 실행되는 ActiveX 컨트롤과는 별도로 새로운 인스턴스를 노출시켜야 할 필요가 있습니다.

 

이에 대한 솔루션은 인터넷 검색중에 발견한 어떤 블로그의 아티클에서 찾을 수 있었습니다. (http://hbesthee.tistory.com/620) 이 아티클은 델파이 기반의 솔루션을 제시하고 있었으며 저는 이것을 Visual C++ 기반의 코드로 옮겼습니다.

STDMETHODIMP CtrusEBANK::trusElevate(VARIANT *ret)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState())

 if (IsUACRequiredOperatingSystem())
 {
  ItrusEBANK *pElevatedObj = NULL;
  HRESULT hr = CoCreateInstanceAsAdmin(NULL,
   CLSID_trusEBANK, IID_ItrusEBANK,
   (void **)&pElevatedObj);

  if (SUCCEEDED(hr))
  {
   ret->vt = VT_DISPATCH;
   ret->pdispVal = pElevatedObj;
   ret->pdispVal->AddRef();
   return S_OK;
  }
  else
  {
   ret->vt = VT_NULL;
   return hr;
  }
 }
 else
 {
  ret->vt = VT_BOOL;
  ret->boolVal = VARIANT_FALSE;
 }

 return S_OK;
}

 

STDMETHODIMP CtrusEBANK::trusNeedElevate(VARIANT *ret)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState())

 ret->vt = VT_BOOL;

 if (::IsUACRequiredOperatingSystem())
  ret->boolVal = VARIANT_TRUE;
 else
  ret->boolVal = VARIANT_FALSE;

 return S_OK;
}

 

위의 코드에서는 trusNeedElevate를 이용하여 권한 상승이 지원되는 운영 체제인지 파악하는 부분과, trusElevate를 이용하여 권한 상승이 적용될 개체를 반환하는 방법 두 가지를 보여주고 있습니다. 그리고 아래의 코드는 자바스크립트에서의 실제 사용 예시입니다.

 

var obj = new ActiveXObject("EBANK.trusEBANK");

if (obj.trusNeedElevate())
{
 var result = obj.trusElevate();
 if (result) {
  obj = result;
 }
}

// 여기서부터 obj 객체 사용

 

이와 같은 방법을 통하여, 권한 상승이 온전하게 ActiveX 컨트롤에 적용될 수 있도록 하여, 원활한 동작 환경을 구현할 수 있을 것입니다.

 

3. Internet Explorer Host Window를 Elevation하는 방법 [업데이트]

 

그리고 최근에 저는 여러가지 방법을 적용해보던 중에 가장 현실적인 타협안 하나를 발견하였습니다. 바로, Internet Explorer Host Window 자체를 Runtime 도중에 Elevation 처리하는 방법으로, 기존의 응용프로그램 기반 매니페스트와 유사하게 작동합니다. 그리고 이 방법은, Host Window를 Elevation하는 데에 사용할 수 있는것 뿐만 아니라, 대리 실행해야 하는 응용프로그램의 Manifest 보유 여부에 관계없이 Elevation에도 사용될 수 있습니다.

 

참고로, 이 방법은 http://www.softblog.com/2008-02/vista-tools/ 에서 소개한 VistaTools.cxx 파일의 코드를 일부 발췌한 것임을 밝혀둡니다.

 

typedef struct _TOKEN_ELEVATION {
    DWORD TokenIsElevated;
} TOKEN_ELEVATION, *PTOKEN_ELEVATION;

 

위의 구조체는 Elevation 상태를 점검하기 위하여 필요한 구조체로 이미 Elevation 처리가 되어있는 호스트 위에서 실행되는 경우 Elevation을 다시 실행하지 않도록 하기 위하여 필요합니다. 이 구조체는 Visual C++ 6.0 기반에서 프로그램을 업데이트할 때 수동으로 지정해야 합니다.

 

#ifndef CSIDL_PROGRAM_FILES
  #define CSIDL_PROGRAM_FILES 0x0026
#endif // CSIDL_PROGRAM_FILES

 

위의 Special Folder Constant는 %PROGRAMFILES% 폴더의 경로를 가져오기 위하여 필요합니다. 마찬가지로 Visual C++ 6.0 기반에서 프로그램을 업데이트할 때 수동으로 지정해야 합니다.

 

#include <shellapi.h>
#include <shlobj.h>

 

마지막으로 위의 두 헤더 파일을 참조하도록 선언하면 일단 준비는 끝납니다.

 

BOOL IsVistaOrHigher(void)
{
 OSVERSIONINFO versionInfo;
 versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

 if (GetVersionEx(&versionInfo) &&
  versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT &&
  versionInfo.dwMajorVersion >= 6)
  return TRUE;
 else
  return FALSE;
}

 

HRESULT IsElevated(BOOL *pElevated)
{
 HRESULT hResult = E_FAIL;
 HANDLE hToken = NULL;

 if (!IsVistaOrHigher())
  return hResult;

 if (!OpenProcessToken(
  GetCurrentProcess(),
  TOKEN_QUERY,
  &hToken))
  return hResult;

 TOKEN_ELEVATION te = { 0 };
 DWORD dwReturnLength = 0;
 const int TokenElevation = 20;

 if (GetTokenInformation(
  hToken,
  (TOKEN_INFORMATION_CLASS)TokenElevation,
  &te,
  sizeof(te),
  &dwReturnLength))
 {
  hResult = te.TokenIsElevated ? S_OK : S_FALSE;

  if (pElevated)
   *pElevated = (te.TokenIsElevated != 0);
 }

 CloseHandle(hToken);
 return hResult;
}

 

BOOL ShellExecWithVerb(HWND hWnd, LPCTSTR lpVerb, LPCTSTR lpPath, LPCTSTR lpParameters, LPCTSTR lpDirectory)
{
 SHELLEXECUTEINFO executeInfo;
 memset(&executeInfo, 0, sizeof(executeInfo));

 executeInfo.cbSize = sizeof(SHELLEXECUTEINFO);
 executeInfo.fMask = 0;
 executeInfo.hwnd = hWnd;
 executeInfo.lpVerb = lpVerb;
 executeInfo.lpFile = lpPath;
 executeInfo.lpParameters = lpParameters;
 executeInfo.lpDirectory = lpDirectory;
 executeInfo.nShow = SW_NORMAL;

 return ShellExecuteEx(&executeInfo);
}

 

BOOL ShellExecWithElevation(HWND hWnd, LPCTSTR lpPath, LPCTSTR lpParameters, LPCTSTR lpDirectory)
{
 return ShellExecWithVerb(hWnd, _T("runas"), lpPath, lpParameters, lpDirectory);
}

 

BOOL OpenUrlWithElevation(HWND hWnd, LPCTSTR lpUrl)
{
 _TCHAR lpBuffer[MAX_PATH + 1];

 if (!SHGetSpecialFolderPath(hWnd, lpBuffer, CSIDL_PROGRAM_FILES, 0))
  return FALSE;

 _tcscat(lpBuffer, _T("\\Internet Explorer\\iexplore.exe"));
 return ShellExecWithElevation(hWnd, lpBuffer, lpUrl, _T(""));
}

 

위의 코드의 내용들 중에서 강조표시된 것이 실제 Elevation을 위하여 필요한 코드입니다. 그리고 실제 사용법은 아래와 같습니다.

 

STDMETHODIMP CMyAXControl::RunElevatedWeb(VARIANT *url)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState())
 USES_CONVERSION;

 CComBSTR targetUrl;
 url->vt = VT_BSTR;
 targetUrl = CComBSTR(url->bstrVal);

 _TCHAR buffer[MAX_PATH + 1];
 _tcscpy(buffer, (_TCHAR*)OLE2T(targetUrl.m_str));
 BOOL bResult = OpenUrlWithElevation(NULL, buffer);

 if (bResult)
  return S_OK;
 else
  return E_FAIL;
}

 

그리고 위의 메서드가 실제로 실행되어야 할 때와, 그렇지 않을 때를 구분하기 위하여 아래와 같이 상태 확인을 위한 메서드를 배치하는 것도 도움이 됩니다. :-)

 

STDMETHODIMP CMyAXControl::NeedElevate(VARIANT *ret)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState())

 ret->vt = VT_I4;
 ret->intVal = 0;

 if (IsVistaOrHigher())
 {
  BOOL bResult = FALSE;

  if (SUCCEEDED(IsElevated(&bResult)))
  {
   if (bResult == TRUE)
    ret->intVal = 4; // 이미 Elevation이 완료됨
   else
    ret->intVal = 3; // Elevation이 필요함
  }
  else
   ret->intVal = 2; // 상태 정보를 조회할 수 없음
 }
 else
  ret->intVal = 1; // UAC가 지원되지 않는 운영체제로 판단함

 return S_OK;
}

 

위의 메서드를 통하여, 반환값이 1 - 또는 - 4로 반환되는 경우에 한정하여 실제로 필요한 코드를 실행하고, 그렇지 않은 경우 Elevation을 수행하도록 유도하는 코드를 웹에서 작성할 수 있을 것입니다.

 

덧) 지적하거나 수정이 필요한 부분이 있으시면 댓글로 남겨주시면 바로 반영하도록 하겠습니다. 감사합니다. :-)

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

데브피아 C# 포럼 RSS 방송국에서 만날 수 있는 여러 블로거분들을 소개하는 글을 올립니다. 2009년 6월 이후로 추가된 개발자분들의 블로그를 소개합니다. :-)

  • Chul's::Make_a_wish(Hit_the_ground_running); 블로그 (http://blog.naver.com/silent1002): 데브피아 C# 포럼에서 활발하게 활동해주시는 이철님 (데브피아 ID: neodory)의 블로그입니다. 현재 Samsung Software Membership에서 소프트웨어 개발에 대한 다양한 경험을 개발하고 계시며, 앞으로 많은 활동이 기대되는 데브피아 회원입니다. 블로그에는 C#을 처음 접하시는 개발자 분들에게 도움이 될만한 정보 뿐만 아니라, 다양한 기술 자료들이 축적되어있으니 꼭 북마크에도 추가하셔서 많은 도움 얻으시기 바랍니다.
  • Inside development, people and my life 블로그 (http://fast-learner.net/): 데브피아 스터디 그룹 Eva-Cast (데브피아 ID: again4you)에서 활동하셨었고, 최근에는 파이썬3 프로그래밍 (http://kangcom.com/sub/view.asp?sku=200906160008) 집필에 참여하신 우상정님의 블로그입니다. 파이썬 프로그래밍과 응용에 관심이 있으신 분들께서는 "파이썬3 프로그래밍"을 꼭 읽어보시기 바랍니다.
  • 새파람의 이야기 블로그 (http://blog.naver.com/saeparam): 데브피아 WCF 마을의 신사웅 촌장님 (데브피아 ID: saeparam)의 블로그입니다. WCF에 대한 다양한 기술 자료가 게시된 블로그이며, WCF에 관한 내용을 찾고자 하시는 분들께서는 WCF 마을과 함께 이 블로그도 꼭 참고하시기 바랍니다.
  • 아크비스타 :: 아크몬드의 비스타 블로그 (http://archvista.net/): Microsoft Windows Desktop Experience MVP로서 활동하고 계시는 박광수 MVP님의 블로그입니다. 최신 버전의 Windows가 나온다는 소식에 설레이는 마음으로 누구나 한번씩 구글이나 네이버 등의 블로그를 통해서 자료를 검색해보셨다면, 한번즈음 둘러보셨을만한 그런 블로그이며, 최근에는 Microsoft 기술 지원 센터 (http://support.microsoft.com) 에서도 박광수 MVP님의 블로그 포스트들을 쉽게 찾아보실 수 있습니다. 최신 운영 체제에 대한 정보가 필요하신 분들께서는 꼭 구독 리스트에 추가해주시기 바랍니다.
  • 정은성의 닷넷 블로그 (http://blog.tobegin.net/): 저와 같이 데브피아 C# 마을 시삽을 맡고 계신 정은성 시삽님 (데브피아 ID: finmaster)의 블로그입니다. 소프트웨어 개발에 관하여 누구나 고민해보았음직한 주제들을 골고루 다루어 고민을 함께해보자는 취지 아래에서, 심혈을 기울인 강좌를 블로그 포스트를 통하여 주기적으로 연재하고 계시니 소프트웨어 개발에 관심이 많은 분들께서는 꼭 구독 리스트에 추가해주시기 바랍니다.

데브피아 C# 포럼 RSS 방송국은 현재 열다섯분의 블로거의 글을 방송하고 있습니다. 블로그 운영에 열정이 있고, 다른 개발자들과 많은 내용을 공유하기 원하신다면, 주저하지 마시고 데브피아 ID rkttu2002 앞으로 쪽지를 보내주시거나, rkttu nospam rkttu dot com 앞으로 메일을 보내주십시오. :-)

 

방송국 RSS 피드 구독하기: http://feeds.feedburner.com/devpia-csharp-rss

 

 

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)