작년에 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)
MS MVP (Microsoft Most Valuable Professional)들이 직접 보여주고, 알려주는 Step by Step 레시피 몇 가지를 공개해봅니다. 이 블로그를 방문하시는 대부분의 손님 여러분들께서는 컴퓨터를 잘 다루시는 전문가들임에 틀림없을 것입니다만, 여러분의 주변에 컴퓨터의 기초 사용법이나, 일상적인 작업들 (프로그램 설치나 사용법에 관한)로 인하여 어려움을 겪고 계시는 분들이 있으실 것입니다. 그럴 때, 아래의 자료를 활용하여 친절히 설명해주시면 좋을 것 같습니다. :-)

 
살펴보시고, 도움이 되는 내용들을 많이 공유하시면 좋겠습니다. :-)
크리에이티브 커먼즈 라이선스
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)

그동안의 Microsoft Windows 서버 환경에 대한 일반적인 오해와 편견, 그리고 불편한 부분까지 일거에 해소시켜줄 새로운 아이템이 하나 등장했습니다. 바로 Microsoft /web Platform Installer와 Microsoft /web Application Installer (이하 Web PI, Web AI)가 그 주인공들입니다. 양쪽 솔루션은 모두 Windows Vista SP1 이상, Windows Server 2008 이상의 시스템에서 동작하도록 설계되어있습니다.

1. Microsoft Web Platform Installer

Microsoft 및 관련 커뮤니티에서는 지속적으로 웹 환경에 알맞는 소프트웨어를 개발하고 테스트합니다. 그 덕분에 최근에 IIS 7.0에서는 Apache의 URL Rewriting 모듈과 호환 수준이 높은 자체적인 무료 URL Rewriting Engine이 배포되어 절찬리에 채택중입니다. 이것은 예전에 ASP .NET 기반 사이트에서만 자체적으로, 그리고 제한적으로 구현하였던 URL Rewriting Engine보다 더 성능이 좋고 범용적이며 검증이 많이 된 것입니다. 또 그 이외에도 계속해서 새로운 프로젝트와 기술들이 발표되곤 합니다.

이제는 이러한 기술들에 대한 정보를 놓치거나 테스트해보지 못할 걱정을 더 이상 하지 않으셔도 됩니다. Web PI가 이러한 부분을 일정 부분 이상 보충해 줄 것입니다. Web PI는 한 번 실행하고 마는 설치 프로그램이 아니라 개발자 PC에서는 주기적으로 새로운 시스템에 대한 정보를 확인하고 설치할 수 있도록 해줄 것입니다.

다음은 소개 동영상입니다.

WebPI는 http://www.microsoft.com/web/channel/products/WebPlatformInstaller.aspx 에서 받아보실 수 있습니다. 위의 도구를 이용하여 필요한 모든 플랫폼 도구를 설치한 다음에는 실제 테스트해보고 싶은 여러분만의 웹 어플리케이션을 바로 설치해볼 수 있는 Web AI를 써보실 차례입니다.

2. Microsoft Web Application Installer

아직 국내에서 많이 사용되는 PHP 기반 응용프로그램들 중 하나인 텍스트큐브가 IIS 7.0을 Apache + PHP 조합처럼 네이티브하고 자연스럽게 처리해주지는 않고 있지만, IIS 7.0을 기준으로 실행하는 것이 가능할 정도로 IIS 7.0은 이전의 IIS 6.0과는 다르게 유연해지고 강력해졌습니다. Web AI는 ASP.NET 기반 응용프로그램들 뿐만 아니라 PHP 기반 응용프로그램의 설치도 지원하며 PHP 해석 엔진과 MySQL 설치도 종속성 검사를 통하여 자동으로 이루어질 수 있도록 돕습니다.

Web PI에서 권장하는 모든 설치 요소를 설치한 다음에 이 설치 도구를 이용하여 필요한 웹 응용프로그램을 설치하셔야 합니다. Web AI는 http://www.microsoft.com/web/channel/products/WebApplicationInstaller.aspx 에서 받아보실 수 있습니다. Web AI로 설치할 수 있는 웹 어플리케이션들 중 DotNetNuke, phpBB, Wordpress 블로그는 특히 주목할만한 부분입니다. :-)

위의 두 가지 도구를 이용하여 멀리 발품팔지 않고도 손쉽고 빠르게 IIS의 기능을 업그레이드하고 필요한 모든 개발 도구와 웹 응용프로그램을 쉽게 구하고 설치할 수 있습니다. 이제부터는 여러분도 IIS로 마음껏 원하는 일을 해보시면 어떨까요? ^^

ps. http://www.microsoft.com/web 에 가시면 인스톨러 이외에 더 많고 풍부한 정보들을 얻으실 수 있습니다. :-)

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

Visual Studio 6.0 Enterprise Edition 전반을 위한 XML 매니페스트 패키지를 구성해보았습니다. 이 압축 파일을 Visual Studio 6.0 Enterprise Edition이 설치된 디렉터리에 맞추어 압축 해제를 하면 Windows XP와 Windows Vista의 시각 테마 효과가 몇몇 프로그램을 제외하고 모두 적용됩니다. Hotspot Editor, Visual FoxPro, ODBC Administrator 프로그램에서는 적용되지 않거나 적용 시 버그가 발생하여 제외하였습니다.


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)
다운로드: http://www.microsoft.com/downloads/details.aspx?familyid=1ff0b35d-0c4a-40b4-915a-5331e11c39e6&displaylang=en&tm

Visual Studio 2007 (코드네임: Orcas)의 2007년 1월 CTP가 MS 웹 사이트에서 배포 중입니다. Visual Studio 2005가 2005년 말에 나왔고 그로부터 1년 조금 넘게 걸려서 첫 소식이 나온 셈입니다.

아직 Visual Studio 2007은 Windows Vista와의 호환성은 고려하지 않고 배포 중인 것 같습니다. 기존 시스템에 영향을 주지 않고 테스트할 수 있도록 얼마전에 무료화된 Microsoft Virtual PC 2004와 무료 가상 서버 플랫폼인 Microsoft Virtual Server 2005 R2에서 돌려볼 수 있는 OS를 포함한 전체 가상 PC 이미지도 같이 제공하고 있습니다.

VIsual Studio 2007은 대강 이런 기능들을 새로 선보인다고 하네요.

* ADO .NET 엔티티 프레임워크
* LINQ와 완전히 통합된 ADO .NET API (LINQ는 프로그래밍 언어 수준에서 SQL과 유사한 질의를 사용할 수 있는 언어 확장 기술)
* 문서로만 떠돌던 C# 3.0을 처음으로 정리한 C# 3.0 컴파일러 및 IDE 내장
* LINQ 자체도 ADO .NET 외에 일반적인 컬렉션, 제네릭 컬렉션에 대해서 작동할 수 있도록 확장됨
* ClickOnce 기능의 업그레이드
* 강력한 암호화 기술을 위한 Elliptic Curve Diffie Hellman 및 Elliptic Curve Digital Signature Algorithm 구현 추가
* 오피스 2007 개발 지원
* 향상된 객체 수명 주기 관리 및 응용프로그램 도메인 관리 기능 추가
* ASP .NET을 위한 향상된 로그인/로그아웃/역할 모델 메카니즘 도입
* Windows Vista의 ETW 시스템과 연동되는 이벤트 추적 Listener 지원
* ASP.NET AJAX를 위한 확장된 JScript 인텔리센스 기능 구현
* System.Numeric 네임스페이스가 새로 추가되고 기존의 System.Int64 및 System.UInt64보다 훨씬 넓은 범위의 수를 다룰 수 있으며 이런 범위의 수에 대해 효율적으로 작동하는 전용 수학 알고리즘 대거 추가
* 이번 버전에 포함된 LINQ의 경우 특별히 XML에 관한 기능까지 사용할 수 있게 됨 (XML을 XPath 이외의 방법으로 질의하거나 데이터의 삽입 및 수정이 가능해짐)
* SSCE (SQL Server Compact Edition) 번들링

다운로드: http://www.microsoft.com/downloads/details.aspx?familyid=1ff0b35d-0c4a-40b4-915a-5331e11c39e6&displaylang=en&tm

VMware Workstation이나 VMware Player에서 아직 구동해보지는 않았습니다만 가상 PC 마이그레이션을 통하여 실행하는 것도 가능할 듯 싶습니다. :-)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

Visual Basic Extension, Object Linking Embedded, Component Object Model, Binary Behavior, Distributed Component Object Model, Component Object Model Plus, Windows DNA 등 Microsoft가 C++과 객체 지향 기술을 이용하여 개발해왔던 다양한 프레임워크들 중 하나인 ActiveX가 이제는 그 수명을 다하려는듯한 결정적인 루머를 내고 있다.

당장 내년 1월에 새롭게 출시될 Windows Vista에 포함된 IE7에서는 ActiveX 컨트롤 자체가 완벽하게 Sand-Box 처리가 될 것이라고 한다. ActiveX 인스턴스는 어차피 Internet Explorer와 함께 그 수명을 같이하는 것이므로 이상할 것이 없지만 Sand-Box 라는 것은 다소 생소하실 분들이 많겠다.

요약하자면, ActiveX 컨트롤을 PC에 다운로드하여 Install하는 작업을 하지 않고 마치 Java Applet이나 Flash Content 또는 Script 처럼 동작하게 만들겠다는 의미가 된다. 보안 상으로는 틀림없이 이득이 될테지만 ActiveX를 개발하여 배포해왔던 업체들에게는 정말 큰 일인셈이다.

퍼블릭 릴리즈로 나온 IE7을 먼저 써본 사람들은 새로운 모드인 "안전 모드"에 대하여 궁금해 했을 것이라 생각한다. 이 "안전 모드"가 바로 이 루머와도 관련이 있겠다. 단순히 설치된 ActiveX 컨트롤 전체를 사용하지 않는 것으로 시작해서 유입되는 모든 ActiveX 컨트롤이 하드 디스크에 저장되거나 설치되는 것을 통제하고, 퍼미션 조절을 통하여 작업에 제약을 걸어놓는 모드이다. 정식으로 나올 Windows Vista의 IE7에서는 아마도 이 "안전 모드"를 기본 모드로 사용하도록 권하기 때문에 이런 루머가 나온 것이 아닐까 싶다.

더 재미있는 사실은, Windows Vista가 이제는 .NET Framework 3.0을 기본으로 내장하고 있다는 사실이다. 이것이 의미하는 바는 ActiveX의 운명을 더욱 확실하게 만들어주고 있다. .NET Framework 2.0부터 강화된 ClickOnce는 Windows Forms로 개발된 .NET Application을 Internet Explorer와 연동할 수 있도록 도울 것이며, Windows Presentation Framework의 XAML은 Internet Explorer 7.0이 직접 렌더링하는 것도 가능하다. 또한 Windows Presentation Framework Everywhere는 경량화된 응용프로그램을 지원할 것이다. 지금 언급한 이 세 가지 기술을 적극 유치하고 유도하는 것이 MS의 실제 목표다. ActiveX는 보안 상의 문제가 많다는 점을 이용하여 오히려 뒤로 빼려는 셈이다.

또한 이제는 ActiveX보다는 Flash, Java를 이용한 개발을 더욱 선호하는 추세이다. 컨텐츠 프로바이더의 입장에서도 ActiveX는 메리트가 없는 셈이다. 그리고 기억하는 사람들도 아직 있으리라 생각되는 이올라스社의 소송 승리도 ActiveX의 숨통을 조르고 있다.

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