Utility SpotlightWindows PowerShell용 SMS Cmdlet

Don Brown

이 기사의 코드 다운로드: Utility2007_11.exe (1211KB)

예전에는 Microsoft System Management Server(SMS) 2003 클라이언트를 명령줄에서 관리할 방법이 없었습니다. 다행히 관리자가 복잡성, 변경 및 구성을 효과적으로 관리할 수 있도록 최근 개발된 여러 가지 기술 덕분에 결국 Windows PowerShell에서 이 문제가 해결되었습니다.

이 기술을 이용하기 위해 필자는 SMS2003PowerShellSnapinSample이라는 간단한 "유틸리티"를 작성했습니다. 이 유틸리티는 칼럼과 함께 제공되는 코드 다운로드(technetmagazine.com/code07.aspx)에 포함되어 있습니다. 이 유틸리티는 사실상 여섯 가지 cmdlet의 컬렉션을 하나의 Windows PowerShellTM 스냅인으로 구성한 것이라 할 수 있습니다. 이러한 cmdlet을 사용하면 Windows PowerShell에서 로컬 컴퓨터 또는 원격 컴퓨터 그룹에 사용할 SMS 클라이언트 로컬 정책을 구성할 수 있습니다.

SMS 클라이언트 로컬 정책을 사용하면 할수록 효과적인 방식이라는 것을 알 수 있었습니다. 또한 SMS 작동 방식에 대해 이해의 폭을 넓히는 계기가 되기도 했습니다. SMS 클라이언트 로컬 정책을 신중히 사용하면 SMS 클라이언트를 완전히 새로운 방식으로 제어할 수 있습니다. 즉, 동일한 사이트에 보고하는 모든 컴퓨터를 동일하게 구성할 필요가 없어집니다. 이러한 개념을 바탕으로 특정 컴퓨터는 사용 권한 없이도 원격으로 제어할 수 있도록 설정하는 것부터, 클라이언트에서 새 정책을 확인하는 빈도를 변경하거나 하루 중 다양한 시간에 특정 구성 요소를 사용할 수 없도록 하는 등 SMS 클라이언트 로컬 정책의 용도에는 제한이 없습니다. 그럼 자세히 살펴보도록 하겠습니다.

SMS 고급 클라이언트 로컬 정책

프로그래밍 리소스

제대로 작동하는 모든 SMS 2003 고급 클라이언트에는 구성 정책이 있습니다. 기본적으로 이 정책은 다양한 구성 요소를 제어하는 설정의 목록이라고 할 수 있습니다. 그리고 이러한 구성 정책에는 클라이언트, 인벤토리 컬렉션, 소프트웨어 배포 설정 등이 모두 포함되어 있습니다. 정책 자체는 사이트 서버에 생성되고 SMS 관리 지점을 통해 고급 클라이언트로 전달됩니다.

SMS 정책의 실제 내용은 고급 클라이언트에서 \\.\root\CCM WMI (Windows® Management Instrumentation) 네임스페이스로 컴파일되는 인스턴스의 집합을 포함한다는 점에서 MOF(Managed Object Format) 파일과 비슷합니다. 다양한 에이전트가 \\.\root\ccm\policy\machine\requestedconfig 네임스페이스에서 이러한 설정을 읽게 됩니다. 그러나 MOF를 통해 로컬 정책을 적용할 때에는 단일 컴퓨터에서만 MOF를 컴파일할 수 있으며 로컬로만(더 정확히 말하자면 컴퓨터에 직접 로그온한 경우에만) 실행해야 합니다. 그러나 WMI의 경우 고유한 분산 특성으로 인해 로컬로도, 원격으로도 액세스할 수 있기 때문에 SMS 관리자를 위한 다양한 옵션이 지원됩니다. 다시 말해, 적절한 관리 권한만 있으면 원격 컴퓨터에서도 로컬 컴퓨터와 마찬가지로 손쉽게 WMI에 연결할 수 있습니다.

SMS 클라이언트 정책은 여러 가지 클라이언트 구성 요소의 구성 설정으로 이루어지지만 소프트웨어 패키지 콘텐츠 실행 명령을 포함할 수도 있습니다. Active Directory® 그룹 정책과 마찬가지로 SMS 관리 지점에서 가져온 SMS 2003 고급 클라이언트 정책은 SMS 클라이언트 로컬 정책에 의해 재정의될 수 있습니다. 정책의 모든 부분을 재정의할 수는 없지만 몇 가지 유용한 핵심 속성을 재정의할 수 있습니다. 따라서 SMS 관리자가 SMS 사이트에 적용된 표준 구성에 예외를 허용하는 방법으로 SMS 클라이언트의 구성과 작동을 더 큰 폭으로 제어할 수 있습니다.

SMS 관리자가 서버와 워크스테이션을 모두 단일 SMS 주 사이트의 클라이언트로 관리하는 안전하고 통합된 환경을 예로 들어 보겠습니다. 이 가상 환경의 보안 정책에는 기술 지원 엔지니어가 사용자의 컴퓨터를 원격으로 제어하기 전에 사용자에게 사용 권한 부여 여부를 물어야 한다는 내용이 포함될 수 있습니다. 이는 기술 지원 엔지니어가 원격 제어를 통해 서버에 연결하려 할 때 문제가 됩니다. 일반적으로 서버에는 사용자가 로그온되어 있지 않으므로 원격 제어 권한을 부여할 사용자가 없습니다. 하지만 로컬 정책을 잘 사용하면 특정 클라이언트에서 사용자 권한이 필요하지 않도록 할 수 있습니다. 특정 SMS 클라이언트 에이전트의 구성에 예외를 허용하는 데 SMS 로컬 정책을 유용하게 사용할 수 있는 경우는 이 외에도 많습니다.

Windows PowerShell 스냅인 살펴보기

Windows PowerShell의 기본 개념에 어느 정도 익숙해지면 명령줄에서 이 칼럼과 함께 제공되는 샘플 소스 코드에 코드를 추가하여 SMS 클라이언트 로컬 정책의 기능을 확장할 수 있습니다. Windows PowerShell에 노출하기 전에 클래스에 적용해야 하는 몇 가지 특성이 있습니다. 먼저, cmdlet이 어떤 유형이며 어떠한 작업을 수행하는지를 결정해야 합니다. 이를 "동사-명사" 쌍이라고 합니다. Windows PowerShell에서 많이 사용되는 동사로는 Add, Get, Set 등이 있습니다. 명사 부분은 작업 대상 개체를 설명합니다. 일반적으로 cmdlet에는 cmdlet 클래스에 다양한 형식의 공용 속성으로 선언되는 매개 변수가 있습니다. 마지막으로, 주 작업 대상이 되는 ProcessRecord 함수가 있습니다. 그림 1에는 cmdlet을 직접 작성하는 데 사용할 수 있는 일반 템플릿이 나와 있습니다.

Figure 1 Cmdlet 템플릿

[Cmdlet( "Verb", "Noun", SupportsShouldProcess = true )]
public class Verb_Noun : PSCmdlet
{
    [Parameter( ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, 
        HelpMessage = "Parameter" )]
    [ValidateNotNullOrEmpty]
    [Alias( "param" )]
    public string Parameter
    {
        get { return MyParameter; }
        set { MyParameter = value; }
    }
    private string MyParameter;

    protected override void ProcessRecord( )
    {
        //Do your stuff here!
    }
}

스냅인을 컴파일한 후에는 RunInstaller 특성이 설정되고 특정 속성이 정의된 클래스를 프로젝트에 포함하여 Windows PowerShell에서 해당 스냅인을 등록해야 합니다. 자세한 내용은 이 기사와 함께 제공되는 소스 코드를 참조하십시오. 스냅인을 등록하려면 Microsoft® .NET Framework에 포함된 InstallUtil.exe 도구를 사용해야 합니다. 그림 2는 스냅인 등록에 사용되는 구문을 보여 줍니다. Windows Vista®의 경우 이 작업을 위해서는 권한 상승이 필요하므로 "관리자로 열기" 옵션을 사용하거나 technetmagazine.com/issues/2007/06/UtilitySpotlight에서 다운로드 가능한 Script Elevation PowerToys for Windows Vista를 사용하여 Windows PowerShell을 열어야 합니다.

Figure 2 Windows PowerShell에서 스냅인 설치

PS> set-alias installutil $env:windir\Microsoft.NET\Framework\v2.0.50727\installutil 
PS> installutil C:\MySMSTools\SMS2003PowerShellSnapinSample.dll 
Microsoft (R) .NET Framework Installation utility Version 2.0.50727.42 
Copyright (C) Microsoft Corporation. All rights reserved. 
Running a transacted installation. 
... 
The transacted install has completed.

다음 단계로, Windows PowerShell에서 스냅인이 승인되는지 확인해야 합니다. Get-PSsnapin cmdlet을 Registered 매개 변수와 함께 사용하면 Windows PowerShell에 현재 로드된 스냅인이 추가할 등록된 스냅인 목록과 함께 요약됩니다. 이 목록에 해당 스냅인이 포함되어 있어야 합니다.

PS> Get-PSsnapin -registered

이제 다음과 같이 Add-PSsnapin cmdlet을 사용하여 셸에 Windows PowerShell 스냅인을 추가할 수 있습니다.

PS> add-pssnapin SMS2003PowerShellSnapinSample

이 작업에 성공하면 Windows PowerShell 스냅인에서 cmdlet을 실행할 수 있습니다.

Windows PowerShell 스냅인에서 사용할 수 있는 cmdlet을 모두 보려면 Get-Command cmdlet으로 특정 스냅인을 지정하고 스냅인의 이름을 PSsnapin 매개 변수의 값으로 전달하면 됩니다. 이 칼럼과 함께 제공되는 샘플 스냅인은 그림 3과 같이 동사-명사 cmdlet 템플릿을 비롯하여 여섯 가지 cmdlet을 표시합니다.

그림 3 스냅인의 cmdlet 표시

그림 3** 스냅인의 cmdlet 표시 **(더 크게 보려면 이미지를 클릭하십시오.)

샘플 소스 코드에서는 구성 방법을 보여 주기 위해 Get-SMSServerConnection cmdlet에 대한 도움말만 작성했습니다. 도움말을 확장하는 데 대한 예제는 나중에 XML 파일로 소개하겠습니다. 그림 4에는 도움말 출력이 나와 있습니다.

Figure 4 샘플 Get-Help 출력

PS > get-help Get-SMSServerConnection

NAME
    Get-SMSServerConnection

SYNOPSIS
    This cmdlet establishes a connection to the specified SMS primary site server using your current credentials. An object of type "SMSProvider" is returned through the pipeline.

SYNTAX
    Get-SMSServerConnection [-SMSServerName] [<string>] [<CommonParameters>]

DETAILED DESCRIPTION
    This Cmdlet makes a connection to the specified SMS primary site server.  An object of type "SMSProvider" is returned. The "SMSProvider" object is not serializable and is used only to forward on through the pipeline to other cmdlets.

RELATED LINKS

Windows PowerShell 스냅인 설치 방법, 스냅인의 명령을 찾는 방법 및 일반적인 cmdlet에 대한 도움말을 보는 방법을 살펴보았으므로 이제 실제로 cmdlet을 사용해 보도록 하겠습니다. SMS 주 사이트 서버에 모든 컬렉션의 목록을 표시하려면 다음 명령을 사용합니다.

PS > Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | Format-Table Name

파이프라인을 살펴보십시오. 이 파이프라인이 Windows PowerShell 작동에서 핵심적인 부분이며 강력한 도구입니다. Windows PowerShell에서는 코드 한 줄로 거의 모든 작업이 가능합니다. Get-SMSServerConnection cmdlet은 SMS 서버와의 연결을 설정합니다. Get-Collections cmdlet에는 Get-SMSServerConnection에 의해 반환되는 형식의 입력 매개 변수가 하나 있으므로 Get-SMSServerConnection cmdlet에서 Get-Collections cmdlet으로 간단히 출력을 전달할 수 있습니다. 이는 파이프라인의 작동 방식을 보여 주는 예로, cmdlet 간에 복잡한 개체를 전달하는 방법을 잘 보여 줍니다. 개체를 변수에 저장할 수도 있으며, Windows PowerShell 스크립트를 사용하는 경우 코드가 다음과 같이 됩니다.

$SMS = Get-SMSServerConnection 
     -server MYSMSSERVER
Get-Collections -SMSServerProvider $SMS

Get-Collections는 SMSCollections 형식(기본적으로 SMSCollection 형식의 개체 배열)의 개체를 반환하므로 출력의 형식을 잘 지정하지 않으면 읽기가 어려울 수 있습니다. 간단히 말해 내용을 간결하게 보려면 표시할 컬렉션을 필터링하거나 원하는 속성만 포함된 표로 표시해야 합니다. 이를 위해서는 파이프라인을 통해 Get-Collections cmdlet에서 Format-Table cmdlet으로 출력을 전달해야 합니다. 이 경우 지정한 속성만 표시됩니다. 예를 들어 | Format-Table Name, Member를 추가할 수 있습니다.

하지만 특정 컬렉션의 멤버를 모두 표시하는 더 효과적인 방법이 있습니다. 이 예제의 경우 Get-CollectionMembers를 사용하면 됩니다. 이 cmdlet은 컬렉션의 각 멤버 이름을 나타내는 문자열의 배열을 반환합니다. 이미 눈치챘겠지만 이는 다음 cmdlet으로 파이프라인을 전달하는 좋은 예입니다.

지금까지는 SMS 고급 클라이언트 로컬 정책이 사용되지 않았습니다. SMS 주 사이트 서버에 연결하고 컬렉션과 컬렉션 멤버를 열거했을 뿐입니다. 이 샘플 Windows PowerShell 스냅인에는 마지막으로 Enable-SoftwareDistribution 및 Disable-SoftwareDistribution이라는 두 가지 cmdlet이 사용됩니다. 이 두 cmdlet에 SMS 클라이언트 로컬 정책이 사용됩니다. 이 두 cmdlet은 SMS 고급 클라이언트의 소프트웨어 배포 클라이언트 에이전트 구성 요소에 대한 SMS 클라이언트 로컬 정책을 조작합니다. cmdlet의 동사 부분에서 알 수 있듯이 Disable은 소프트웨어 배포 클라이언트 에이전트도 해제하도록 클라이언트 로컬 정책을 재정의합니다. 마찬가지로 Enable이라는 동사는 모든 클라이언트 로컬 정책 재정의를 제거하고 소프트웨어 배포 클라이언트 에이전트를 SMS 관리 지점에서 전달되는 SMS 정책에 정의된 정상 상태로 되돌립니다. 그림 5에는 Windows PowerShell 한 줄 코드가 나와 있습니다. 이 코드는 Windows Server 2003 Systems 사용자 지정 컬렉션의 모든 멤버를 강제로 해제하는 소프트웨어 배포 클라이언트 에이전트에 대한 SMS 클라이언트 로컬 정책 재정의와 유사합니다. 이 한 줄 코드는 동일한 컬렉션이 나열된 소프트웨어 배포 클라이언트 에이전트에 대한 모든 SMS 클라이언트 로컬 정책 재정의를 제거합니다. SMS 클라이언트 로컬 정책을 조작할 컴퓨터 수가 적은 경우 Disable-SoftwareDistribution 및 Enable-SoftwareDistribution cmdlet을 그 자체만으로 사용할 수도 있습니다.

Figure 5 cmdlet 어셈블 예제

PS >Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | where-object {$_.Name -eq "Windows Server 2003 Systems"} | Get-CollectionMembers | Disable-SoftwareDistribution 
PS >
PS > Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | where-object {$_.Name -eq "Windows Server 2003 Systems"} | Get-CollectionMembers | Enable-SoftwareDistribution
PS >
PS >Disable-SoftwareDistribution –hosts SMSCLIENT1, SMSCLIENT2, SMSCLIENT3
PS >
PS >Enable-SoftwareDistribution –hosts SMSCLIENT1, SMSCLIENT2, SMSCLIENT3

다음 단계

이 기사와 함께 제공되는 샘플 소스 코드는 여러 컴퓨터에 SMS 클라이언트 로컬 정책 재정의를 적용할 때 기반으로 사용할 수 있습니다. 여기서 소개하는 샘플은 SMS 소프트웨어 배포 클라이언트 에이전트의 Enabled 속성에 대해서만 다룹니다. 다른 클라이언트 에이전트에는 이와 같은 방법으로 재정의를 적용할 수 있는 속성이 많습니다. 이제 기초 사항을 배웠으므로 SMS 클라이언트 로컬 정책의 다른 부분을 살펴보시기 바랍니다. 관리 시스템의 그룹에도 SMS 클라이언트 로컬 정책 재정의를 유용하게 사용할 수 있습니다. 마지막으로 하나 덧붙이자면 항상 코드가 어떻게 진행되는지 잘 파악하는 것이 중요하므로 테스트 환경에서 철저히 테스트해야 합니다.

Don Brown은 Microsoft의 수석 필드 엔지니어로, 오랫동안 SMS(SCCM) 개발 및 지원 업무를 담당해 왔습니다. 문의 사항이 있으면 donbrown@microsoft.com으로 연락하십시오.

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