Windows Server 2008이 나오면... (45) - IIS와 PowerShell의 절묘한 만남?!

꼬알라주 : "우리들의 Windows Server 2008 이야기" 이벤트는 진행중입니다. (9월 31일까지) 좌측 배너내 티셔츠 사진을 클릭하시면 해당 이벤트로 이동합니다. :)

image

IIS.Net 사이트의 Writing PowerShell Command-lets for IIS7 를 읽어보신 적 있으세요?

IIS 7과 IIS 6에 대한 관리를 Windows PowerShell로 하실 수 있도록 가이드라인을 제공하는 글입니다. (영어라고 싫어하신 분들도 계실 것 같습니다. :)) Windows PowerShell을 이용하시면 좀더 편리하게 많은 서버들을 관리하실 수 있습니다.

IIS 6, 7 모두 WMI 기반의 관리를 제공하므로, Windows PowerShell의 Get-WMIObject를 이용하여 WMI 접근을 할 수 있는 컨셉을 알 수 있습니다. 그렇지만 조금더 편리하게 Windows PowerShell에서 New-IISSite와 Get-IISSite와 같은 IIS용 Cmdlet을 사용할 수 있다면 더욱 편하겠죠? 2007년 5월 2일에 개최되었던 Windows Server 2008 Beta 3 Launch 세미나에서 제가 데모를 통해 보여드렸던 내용의 실체를 공개합니다.

필요한 준비물

1. Windows PowerShell
2. IIS Cmdlet 생성 C# 소스 - 다운로드 후 실행해보시면 압축이 풀리고 하나의 .CS 파일이 나타납니다.
3. 약간의 타이핑 실력
4. PowerShell의 ExecutionPolicy를 RemoteSigned로 변경

사용하시는 운영 체제에 맞게 Windows PowerShell을 설치합니다. 다만 주의사항은 x86(32-bit)와 x64(64-bit)에 따라 작업 디렉터리가 약간 틀리다는 것을 주지하시기 바랍니다.

Windows PowerShell은 보안 설정상 서명되지 않은 스크립트는 실행하지 않게되어져 있습니다. 따라서 사용자가 생성한 스크립트도 전자 서명을 하기전까진 사용을 못하게 됩니다. 이를 사용할 수 있도록 명령어를 내립니다. Set-ExecutionPolicy RemoteSigned ... 그리고..

IIS Cmdlet은 .NET Framework의 System.Management.Automation을 사용합니다. 해당 DLL을 추출해내서.. IISCmd C# 소스를 컴파일할 때 사용합니다. DLL을 추출해봅시다.

[appdomain]::currentdomain.getassemblies() | where {($_.fullname -match "system.management")} | copy-item -path {$_.location} -destination c:\IIS (이번 포스팅에서는 IIS라는 폴더를 제가 만들어서 사용합니다. - 별도의 폴더를 이용하셔도 됩니다.)

image 

해당 Cmdlet에 의해 2개의 DLL이 추출됩니다. 이를 이용하여 이제 C# 소스를 컴파일합니다. 컴파일을 하게 되면 Windows PowerShell을 확장하기 위한 SnapIn용 DLL이 생성됩니다.

주의 - x86과 x64의 작업 폴더는 틀립니다.

x86 - %windir%\Microsoft.NET\Framework\v2.0.50727\csc /t:library /r:c:\iis\system.management.automation.dll c:\iis\IISDemoCmd.cs
x64 - %windir%\Microsoft.NET\Framework64\v2.0.50727\csc /t:library /r:c:\iis\system.management.automation.dll c:\iis\IISDemoCmd.cs

이 작업을 마치시고 나면... 하나의 DLL파일이 생성됩니다.

image

이 DLL을 설치하고 불러들입니다. Exchange Server 2007의 경우에도 Windows PowerShell에 Exchange Server용 Cmdlet DLL을 불러들이는 형태로 확장하게 됩니다. 역시나 x86, x64가 틀립니다.

x86 - %windir%\Microsoft.NET\Framework\v2.0.50727\installutil IISDemoCmd.dll
x64 - %windir%\Microsoft.NET\Framework64\v2.0.50727\installutil IISDemoCmd.dll

DLL을 설치한 후.. 이제 PowerShell에서 사용만 하면 되겠죠? SnapIn을 불러들입니다. Cmdlet은...

Add-PSSnapIn IISDemoCmdSnapIn

입니다. 정상적으로 추가되었다면 Get-Command IIS* -CommandType Cmdlet을 입력하면 첫번째 그림과 같은 결과가 보입니다. Add-PSSnapIn Cmdlet은 Windows PowerShell 창을 새롭게 열때 마다 해주셔야 합니다. 항상 사용하실 것이라면 Profile을 사용하시는 것을 권장합니다.

또 한가지 중요한 사항이 남았습니다. WMI 접속시에는 사용자의 인증 정보를 입력할 수 있는 방법을 제공하지 않습니다. 이에 WMI 명령어를 내리기 전, 사용할 사용자의 Credential(인증 정보)를 만들어줘야 합니다. 해당 C# 소스에는 이를 IISCredential이라는 변수로 정의해 놓았습니다. 그렇다면..

$global:iiscredential = get-credential 도메인(컴퓨터명)\Administrator 를 이용하여 IISCredential에 인증 정보를 넣어줘야 합니다. 저는 이런 사항이 귀찮아서 아예 Profile로 만들어 놓고.. 저장해놓아.. Windows PowerShell을 실행할때마다 자동으로 올라오게 만들었습니다.

글이 생각보다 길어졌습니다. 한번만 해보시면 그리 어렵지 않다는 것을 느끼실 수 있습니다.. 마지막 선물은.. 이를 이용하여 사이트 100개 만들기 입니다. :)

"1..100 | Foreach {$Port = 8000+$_; $Num = $_.ToString("000"); Add-IISSite Koalra$Num @{Protocol="http"; BindingInformation="*:$($Port):"} C:\IIS -Computer WOW-WEB-01} "