Windows PowerShell디렉터리 관리 자동화

Don Jones

Windows PowerShell의 최초 버전에서 가장 아쉬운 점은 타이밍입니다. Windows PowerShell 팀은 제품 출시에 대한 부담을 어느 정도 느끼고 있었으며(Exchange Server 2007 출시가 예정되어 있었는데 여기에는 Windows PowerShell이 필요했음) Active

Directory 팀은 시간적 여유가 충분했습니다(Windows Server® 2008이라는 다른 제품 작업 중에 있었음). 이러한 이유로 Windows PowerShell은 다소 강력하지 않은 Active Directory® 관리 기능을 탑재한 상태로 출시되었습니다.

그렇다고 해서 Windows PowerShell®에 Active Directory 기능이 전혀 없는 것은 아닙니다. 사실 Windows PowerShell 팀은 VBScript 사용자에게 이미 잘 알려져 있는 스크립팅 용이한 기술인 ADSI(Active Directory Services Interface)에 대한 적절한 지원을 제공하기 위해 많은 노력을 했습니다.

ADSI 방식

ADSI의 동작 방식은 WMI(Windows® Management Instrumentation)와 비슷합니다. 특수 구문을 사용하여 작성한 쿼리를 실행하면 이 쿼리는 도메인 컨트롤러와 같은 원격 컴퓨터로 전송되어 실행됩니다. 쿼리 결과는 Active Directory 개체이거나 개체 컬렉션(예: 사용자 또는 그룹)이며 해당 개체에 대한 참조를 얻어 작업할 수 있습니다. 개체의 속성을 수정하거나 메서드를 실행하여 변경 내용을 저장하고, 새 개체를 만들고, 개체를 삭제하는 등의 작업을 할 수 있습니다. 예를 들어 사용자를 만들려면 사용자가 포함될 OU(조직 구성 단위)나 컨테이너를 쿼리합니다. 반환되는 개체에는 사용자를 만드는 데 사용할 수 있는 Create 메서드가 있습니다.

극히 기본적인 수준에서 보면 Windows PowerShell에서 ADSI를 사용하는 것은 간단하고 쉬워 보입니다. 예를 들어 다음 명령은 사용자를 검색하여 해당 사용자의 Company 특성을 표시합니다.

$user = [ADSI]"LDAP://cn=Ringo,ou=Singers,dc=company,dc=pri"
$user.Get("Company")

사용자를 Get-Member로 전달하여 해당 사용자의 속성과 메서드를 볼 수 있습니다. 하지만 Windows PowerShell 1.0에서는 이러한 디렉터리 개체가 완벽하게 구현되지 않습니다. 그림 1에서 볼 수 있듯이, 셸에서는 개체의 디렉터리 특성을 열거하지 않으며 앞서 사용한 Get 메서드와 같은 개체의 메서드를 표시하지도 않습니다.

그림 1 사용자를 Get-Member로 전달하여 해당 사용자의 속성을 볼 수 있음

그림 1** 사용자를 Get-Member로 전달하여 해당 사용자의 속성을 볼 수 있음 **(더 크게 보려면 이미지를 클릭하십시오.)

이 지원은 Windows PowerShell 2.0의 CTP(Community Technology Preview)에서 약간 향상되었지만 아직은 제한적입니다. 근본적으로 Microsoft® .NET Framework에서는 관리자가 원하는 것을 쉽게 볼 수 있는 기능을 제공하지 않습니다. 애초에 Framework는 개발자를 위해 설계된 것이기 때문입니다. 또 다른 문제는 Windows PowerShell 팀에서 할 수 있는 일이 많지 않으며 Active Directory를 완벽하게 지원하려면 디렉터리를 가장 잘 아는 팀에서 작업을 해야 한다는 점입니다. 즉, Active Directory 팀의 지원이 필요합니다. Windows PowerShell은 아직은 미비하지만 언젠가는 완벽한 기능을 갖출 것으로 확신합니다. 하지만 그 전에는 어떻게 해야 할까요?

이 칼럼의 2007년 6월호(technetmagazine.com/issues/2007/06/PowerShell)에서 Windows PowerShell에 포함된 ADSI 기술을 이용하는 방법을 다룬 적이 있습니다. 이 "기본" 기술에 대한 자세한 내용을 보려면 이 칼럼을 참조하시기 바랍니다. 이번 칼럼에서는 다른 접근법을 소개하겠습니다.

풍부한 환경

Windows PowerShell 설계자인 Jeffrey Snover는 Windows PowerShell의 풍부한 환경을 자주 언급하곤 합니다. 이는 팀에서 Microsoft 내의 프로그래머뿐만 아니라 모든 사용자가 Windows PowerShell의 기능을 확장할 수 있도록 노력했음을 의미합니다. 이미 많은 회사에서는 명령줄을 통해 제품을 관리할 수 있는 기본 Windows PowerShell cmdlet을 만들어 기능을 확장하고 있으며 VMWare, IBM, Citrix 및 Foundry가 이러한 회사에 해당합니다.

이러한 풍부한 환경의 예로 Quest Software를 들 수 있습니다. 이 회사에서는 Active Directory 관리를 위해 설계된 비상업용 cmdlet 집합을 무료로 제공하며 quest.com/powershell에서 다운로드할 수 있습니다. 또한 아직 명령줄에 익숙하지 않은 사람들을 위해 Windows PowerShell을 기반으로 하는 비상업용 무료 그래픽 UI인 PowerGUI(powergui.org)도 제공합니다. PowerGUI를 사용하면 Active Directory 관리 cmdlet을 사용하는 방법을 쉽게 배울 수 있습니다. 이 방법은 사용자에게 매우 유용합니다. 이 cmdlet을 사용하면 Active Directory 관리 기능을 효율적이고 손쉽게 활용할 수 있습니다. PowerGUI에 대한 자세한 내용을 보려면 2008년 1월호의 Toolbox 칼럼(technetmagazine.com/issues/2008/01/Toolbox)을 참조하십시오.

Windows PowerShell 방식

cmdlet과 관련된 모든 것이 사실 Windows PowerShell의 작동 방식입니다. 기존의 스크립트나 프로그래밍 개체를 다룰 필요가 없습니다. 다음은 필자가 좋아하는 한 줄 코드입니다. 이 코드는 CSV 파일을 가져오고 해당 파일의 정보를 사용하여 수십 또는 수백 개의 새 Active Directory 사용자를 만드는 간단한 명령줄입니다.

Import-CSV 'C:\provision1.csv' |
ForEach-Object {New-QADUser -organizationalUnit 'company.pri/Singers' -name ($_.'First Name' + '.' + $_.'Last Name') 
-samAccountName $_.'Logon name' -city $_.city -title $_.'Job title' -department $_.department} 

이것은 매우 긴 명령이지만 기능은 아주 강력합니다. 이 명령에서는 먼저 CSV 파일을 읽고 개체를 반환하는 기본 셸 cmdlet인 Import-CSV부터 시작합니다. CSV 파일의 각 줄은 단일 개체이며 CSV 파일의 열은 개체의 속성이 됩니다. Provision1.csv 파일에서 "Logon Name" 및 "First Name" 등이 열 이름입니다. 여기서 열 이름이 Active Directory 사용자 특성과 직접 매핑되지 않는다는 점을 주목하십시오. 이러한 파일에서는 Active Directory에만 적용되는 이름보다는 친숙한 열 이름을 사용하는 경우가 일반적입니다. 이러한 파일은 회사의 인사 부서로부터 받는 경우가 많은데, 인사 부서에서는 Last Name이 실제로는 Active Directory의 sn 특성이라는 사실을 모를 수 있습니다.

CSV 파일의 모든 데이터를 가져와서 개체로 변환한 후 이러한 개체를 ForEach-Object cmdlet으로 전달합니다. 그러면 여기에서 각 개체에 대해 한 줄 코드의 중괄호에 포함된 코드 블록을 실행합니다. 즉, CSV 파일의 각 줄에 대해 이 스크립트가 한 번 실행됩니다. 스크립트 안에서 특수 변수 $_는 현재 개체 또는 CSV 파일의 현재 줄에 대한 참조입니다.

각 개체에 대해 New-QADUser cmdlet을 실행한다는 것을 알 수 있습니다. 이는 Quest 추가 기능에 있는 여러 cmdlet 중 하나입니다. 여기서 잠시 QADUser라는 이름에 대해 설명하겠습니다. 짐작할 수 있겠지만 Q는 Quest를 나타냅니다. 이러한 이름 지정 규칙은 Microsoft Active Directory 팀이 향후 만들 수 있는 New-ADUser cmdlet과의 충돌을 피하기 위한 것입니다. 두 cmdlet이 동시에 셸에 로드된 경우 이를 통해 사용자와 셸에서 두 가지를 쉽게 구분할 수 있습니다.

한 줄 코드의 나머지 부분은 New-QADUser cmdlet에 대한 매개 변수로 구성됩니다. 먼저 모든 새 사용자를 만들 organizationalUnit을 지정합니다. 그 다음은 First Name 열의 내용, 마침표 및 Last Name 열의 내용으로 구성되도록 설정된 name 특성을 지정합니다.

마지막으로 다음과 같은 점을 살펴보아야 합니다. 먼저 city 매개 변수는 실제로 Active Directory의 1 특성(또는 Locality-Name)을 변경합니다. 또한 cmdlet은 같은 역할을 하는 l이라는 매개 변수도 사용합니다. 대부분의 경우 Active Directory 특성을 참조하는 매개 변수는 Active Directory 사용자 및 컴퓨터 도구의 특성 이름이나 텍스트 레이블을 사용할 수 있습니다.

기타 Windows PowerShell 방식

Active Directory는 계층적 저장소입니다. 그리고 Windows PowerShell의 강점 중 하나는 모든 계층적 저장소를 디스크 드라이브로 제공할 수 있기 때문에 Dir, Del, Ren, Copy 등과 같은 익숙한 명령을 사용하여 다양한 저장소를 관리할 수 있다는 점입니다. 하지만 Windows PowerShell 1.0에는 PSDrive Provider for Active Directory가 포함되어 있지 않기 때문에 셸에는 Active Directory 자체를 드라이브로 제공할 방법이 없습니다.

다행히 앞서 언급한 풍부한 환경이 PowerShell Community Extensions를 통해 그 역할을 합니다. 이 공개 소스 추가 기능은 codeplex.com/powershellcx에서 무료로 구할 수 있습니다. PowerShell Community Extensions를 설치하면 셸을 도메인 이름으로 리디렉션하여 디렉터리를 드라이브처럼 관리할 수 있습니다.

CD COMPANY:
CD SINGERS
DIR

이 명령은 COMPANY 도메인으로 이동하고 Singers OU로 이동한 다음 그림 2와 같은 개체 목록을 표시합니다. 이 위치에서 Del과 같은 명령을 사용하여 사용자를 삭제하거나 Md를 사용하여 새 OU를 만드는 등의 작업을 수행할 수 있습니다. Community Extensions PSDrive Provider에 대해 몇 가지 알아둘 내용이 있습니다. 이는 구현되었을 것으로 예상하는 기능이기는 하지만 Active Directory 자체가 작동하는 방식에 매핑되지 않기 때문에 사용할 수 없습니다. 또한 도메인의 루트로 이동하여 del * -recurse를 실행하면 권한이 있는 경우 도메인의 모든 개체가 삭제되기 때문에 매우 주의해야 합니다. 기본적으로 "삭제하시겠습니까?"와 같은 메시지도 나타나지 않습니다. 이렇게 명령줄은 강력한 반면 사용 경험이 없고 신중하지 않으면 위험할 수 있습니다.

그림 2 PowerShell Community Extensions을 사용하여 셸을 리디렉션하고 디렉터리를 관리함

그림 2** PowerShell Community Extensions을 사용하여 셸을 리디렉션하고 디렉터리를 관리함 **(더 크게 보려면 이미지를 클릭하십시오.)

셸 사용 시작

필자의 강의를 듣는 학생들은 Windows PowerShell로 바로 할 수 있는 일이 무엇인지 묻는 경우가 많습니다. Microsoft 제품 중 Windows PowerShell을 사용하도록 재설계되지 않은 제품도 있으며 Windows PowerShell을 아직은 더 발전을 거쳐야 하는 도구로 생각할 수 있습니다.

하지만 사실은 지금 바로 사용할 수 있습니다. Microsoft에서는 아직 Active Directory에 명령줄 관리 기능을 구현하지 않았지만 타사에서는 이를 위한 도구를 제공해 왔으며 이러한 도구들은 상당히 유용합니다. Windows PowerShell을 사용하면 많은 사용자를 새로 만드는 것과 같은 시간이 많이 걸리고 부담스러운 일부 작업의 자동화를 포함하여 많은 관리 작업을 수행할 수 있습니다. Windows PowerShell을 더 유용한 도구로 만들기 위해 노력 중인 커뮤니티의 결과물을 찾아보는 것도 도움이 됩니다. Microsoft 후원 사이트이며 필자가 관리에 참여하고 있는 PowerShellCommunity.org를 방문해 보십시오. Windows PowerShell에 적절한 도구를 갖춘다면 귀찮고 시간이 많이 걸리는 일부 관리 작업을 스크립트로 처리함으로써 관리 작업을 보다 효과적이고 효율적으로 수행할 수 있습니다.

Don JonesWindows PowerShell: TFM, 2nd Edition의 공동 저자이자 VBScript, WMI, and ADSI Unleashed의 저자이며 PowerShellCommunity.org의 이사입니다.

© 2008 Microsoft Corporation 및 CMP Media, LLC. All rights reserved. 이 문서의 전부 또는 일부를 무단으로 복제하는 행위는 금지됩니다..