일부 넷북 컴퓨터나, 운영 체제에 대한 업그레이드를 심각하게 고민하는 환경 아래에서는 아직까지도 Windows XP를 사용하는 컴퓨터들이 상당히 많습니다. 그러다보니, Windows 7을 일반 데스크톱 컴퓨터에서 많이 채택하는 상황에서도 Windows XP에 대한 사용 상의 고민을 질문 받는 일은 자주 있는듯 합니다.

 

Windows XP를 실행하는 컴퓨터에 하드디스크 공간이 없어서 고민이라는 주변 동료분들의 이야기를 카운셀링하면서 자주 듣는 질문 중 하나는, 디스크 공간 정리의 "오래된 파일 압축"에 관한 것입니다. 맥락 상 잘못 이해하기 쉬운 부분에 위치한 이 기능에 대한 이야기를 간단히 풀어보려고 합니다.

 

디스크 정리 프로그램을 실행하면서 유독 이 부분에서 많은 시간이 걸리는 컴퓨터들을 흔히 보실 수 있습니다. 왜 그럴까요?

 

 

이유는 간단합니다. 이 항목에 대한 디스크 조각모음의 구체적인 설명을 읽어보면 알 수 있습니다.

 

 

오래된 파일 압축 항목에 대한 설명은, "자주 액세스하지 않는 파일은 Windows에서 압축해 보관할 수 있습니다. 파일을 압축해 보관하면 디스크 공간을 절약할 수 있고 압축한 상태에서 파일 액세스도 가능합니다. 압축해도 파일은 삭제되지 않습니다. 파일은 각각의 비율로 압축되기 때문에 절약할 수 있는 디스크 공간 크기는 근사값으로 표시됩니다." 와 같습니다. 굵게 표시한 부분에 해당하는 파일들을 검색하기 위하여 시스템을 일정 수준 Full-Scan 하기 때문인 것으로 이해하실 수 있습니다.

 

덧붙여서, 압축한 상태에서 파일 액세스가 가능하다는 것과, 삭제되지 않는다는 것은 어떤 의미일까요? 여기서의 압축은 파일이나 디렉터리 속성 대화 상자의 고급 버튼을 클릭하면 볼 수 있는 "압축 특성"을 뜻합니다.

 

 

위의 속성은 대부분의 일반적인 소프트웨어들에 대해 약간의 속도 저하를 유발합니다만, VMware나 Windows Virtual PC 등에서 사용하는 가상 하드 디스크 이미지에 대해서는 효율도 떨어질 뿐만 아니라, 이들 프로그램이 가상 하드 디스크를 사용하지 못하게 만드는 원인도 초래합니다. (특성을 다시 해제하면 사용이 가능합니다)

 

액세스한지 시일이 오래 지난 파일들을 디스크 정리 유틸리티로 압축 특성을 켜서 보관한다는 것은 공간 확보에 있어서 굉장히 메리트가 있습니다. 특히, 소프트웨어 개발을 위하여 설치한 IDE가 있고, 그 IDE가 C 또는 C++ 런타임에 대한 크기가 작은 다수의 헤더 파일들을 포함하고 있다면, 이들 헤더 파일들에 대한 하드 디스크 공간 배정을 바꾸어 적은 용량을 차지할 수 있게 합니다. 소프트웨어 개발에 관한 것 뿐만이 아니라, 평소에 Office 및 아래아 한글 문서들을 많이 보관하는 컴퓨터에 대해서도 비슷한 효과를 줄 수 있습니다.

 

데스크탑 컴퓨터에서 지울 프로그램이 없고, 쌓여있는 데이터 때문에 공간 부족이 있어 고민이신 분들은 디스크 정리 유틸리티를 한 번 사용해보시기 바랍니다. 만족할 만한 결과를 얻으실 수 있을 것입니다. 또한, Windows Server 2003의 경우, 속도에 민감하지 않은 오래된 자료를 보관하기 위하여 사용하는 아카이브형 스토리지에 대해서 이러한 특성을 사용하도록 만들면, 디스크 공간을 좀 더 많이 절약하도록 하실 수 있을 것입니다.

크리에이티브 커먼즈 라이선스
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)

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)

Windows XP SP3 Prerelease를 기존의 영문판 Windows XP SP2 기반 배포판에 Slipstreaming을 하여 새로운 CD를 만들어 설치하고 노트북에서 실행하던 중에 갑작스레 로그인을 함과 동시에 블루 스크린 오류가 나타나는 기괴한 현상을 목격하였습니다. 그리고 이벤트 로그에는 이러한 오류가 나타납니다.

The application-specific permission settings do not grant Local Launch permission for the COM Server application with CLSID
{DCBCA92E-7DBE-4EDA-8B7B-3AAEA4DD412B}
 to the user NT AUTHORITY\SYSTEM SID (S-1-5-18).  This security permission can be modified using the Component Services administrative tool.

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

구글을 통하여 검색을 해보니 여기에 대한 적절한 답이 있었지만 좀 다른 케이스였기 때문에 나름대로 고민을 하여 답을 얻을 수 있었습니다. 구글의 검색 결과에 따르면, 적어도 조치를 취하기 위해서는 안전 모드가 아닌 정상 모드 로그인 과정이 필요한 것이었기 때문에 충분한 답이 되지는 못했습니다.

  1. 우선은, 일반 안전 모드로 부팅합니다. BIOS 화면을 통과한 직후 F8 키를 연타하여 들어갈 수 있습니다.
  2. 로그인을 한 후, 안전 모드에서 계속 작업할지를 묻는 대화 상자에서 "Yes"를 클릭합니다.
  3. Start - Run에서 services.msc를 입력하고 Enter 키를 누릅니다.
  4. 서비스 관리자가 나타나면 Network Access Protection Agent 서비스를 "사용 안함"으로 설정합니다.
  5. 그리고 Wireless Zero Configuration 서비스도 "사용 안함"으로 설정합니다.
  6. 재부팅을 한 후 정상적으로 로그인할 수 있는 지 확인 합니다.
  7. Start - Run에서 %windir%\system32\com\comexp.msc를 입력하고 Enter 키를 누릅니다.
  8. 나타나는 화면의 왼쪽 트리 뷰에서 Component Services - Computers - My Computer - DCOM Config - NAP Agent Service 항목을 오른쪽 버튼으로 클릭하고 Properties 메뉴를 들어갑니다.
  9. 대화 상자의 Location 탭에서 Run application on this computer의 체크 상자를 해제하고 OK를 클릭합니다.
  10. 무선 인터넷을 사용하기 위하여, 다시 Wireless Zero Configuration 서비스를 시작시키고, 테스트를 위하여 재부팅해봅니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)
Windows Fundamentals for Legacy PCs (이름 한번 길다. 이하 WinFLP)를 구글링 도중 위키피디아에서 우연히 발견하게 되어 설치해보았다. 필시 Windows XP Embedded 사촌 정도의 아주 빈약한 OS를 연상하며 사용을 시작했지만 내 예상을 완벽히 뒤엎는 모습이 나타났다.

1. Internet Explorer 7.0, Windows Media Player 11.0, DirectX 9.0c, .NET Framework 1.1, 2.0, 3.0을 Microsoft Update에서 다운로드받아서 가뿐히 정품인증 절차를 뛰어넘고 설치할 수 있었다.

2. 무려 50여개 이상의 업데이트 (Windows XP SP2를 기점으로 만든 코어 OS이므로 이 정도 업데이트가 나온다는 것은 당연한 이야기이다.)를 설치하고도 전혀 느려짐이 없는 부팅 속도와 사용 속도

3. 무엇보다도 1번과 2번을 이루면서 테스트를 위하여 구성한 가상 PC는 메모리 256MB의 빈약한 사양이라는 사실

물론 IIS, Windows Media Center와 같은 추가 구성 요소는 사용할 수 없는 버전이지만 이 정도면 Visual Studio 2005나 Visual Studio 6.0, Eclipse 3.0 정도는 설치에 지장이 없을 것으로 생각된다. 아직 랩탑 PC에서도 원활하게 사용이 가능한지는 테스트해보지 않았지만 시간 내서 랩탑 PC에도 설치하여 운용할 생각이다.
크리에이티브 커먼즈 라이선스
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)

뒷북일수도 있겠지만, 잘 모르시는 초보자 분들을 위해서 올렸습니다.

실제로 가상 PC에 운영체제를 설치하고 나면 여러가지 문제점에 봉착하게 됩니다. 예를 들어, 비디오 카드 설정을 잡지 못해서 16색밖에 표현을 하지 못한다거나 사운드 카드를 사용할 수 없다거나 하는 문제점들이 있습니다. 하지만, 이런 것을 해결해주는 것은 VMWare Tools라는 패키지 뿐인데 이것을 찾지 못해서 많이들 해메는 것 같습니다.

VMWare Tools 패키지는 ISO 이미지 형태로  VMWare 디렉터리 안에 같이 제공됩니다. 운영 체제에 맞는 드라이버가 담긴 ISO를 PC 설정의 CD-ROM 부분에서 사용하도록 지정한 후에 설치를 실행하시면 됩니다.

그리고 사운드 부분에 있어서 설정하는 방법이 있습니다. VMWare의 사운드 카드는 Creative Sound Blaster AWE16과 호환됨은 물론 그 카드로 인지를 하게 됩니다. 따라서 설치하실 때에는 사운드 카드를 수동으로 등록하되 Creative Sound Blaster AWE16으로 잡아주시면 됩니다.

또, Windows XP나 .NET에서 VMWare용 스카시 하드 디스크를 인지시키는 방법이 있습니다. http://www.vmware.com/ 에서 다운로드란에 드라이버가 올라와있는데 이것을 텍스트 모드 설치 도중에 Third Party 드라이버를 로딩할거냐고 물을 때 던져주면 됩니다.

참, VMWare 3.1 버전으로 업데이트 되었는데 http://www.vmware.com/ 에서 패치를 내려받아서 설치만 하시면 됩니다. 기존의 라이센스는 그대로 유지됩니다.

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