본문 바로가기

Windows Server

GPMC 스크립팅

지난 4월에 Microsoft는 Windows Server 2003 및 Windows 2000 그룹 정책을 쉽게 관리할 수 있도록 하기 위해 MMC(Microsoft Management Console) 기반 UI를 제공하는 그룹 정책 관리 콘솔(GPMC)을 출시했습니다. GPMC는 Windows 2000의 기본 도구에 비해 한 차원 높아진 그룹 정책 개체(GPO) 관리 기능을 제공합니다. 기본 도구에서는 GPO 관리 스크립팅이 어렵지만 GPMC에는 많은 공통 GPO 관리 작업을 자동화하는 스크립팅 인터페이스 집합이 포함되어 있습니다. 이러한 스크립팅 인터페이스를 사용하여 GPO 설정에 대한 보고서를 생성하고 GPO를 만들고 복사하며 연결이 해제된 GPO를 찾는 등의 그룹 정책 환경 관리 작업을 할 수 있습니다. Microsoft는 많은 공통 스크립팅 작업을 처리하는 GPMC 스크립트를 몇 가지 제공합니다. 또한 사용자가 사용자 지정 GPO 관리 작업을 수행하기 위해 직접 스크립트를 만들 수도 있습니다.

사용자가 Windows 2000의 도메인 기반 그룹 정책을 관리하려 할 수 있지만, GPMC는 Windows 2003과 Windows XP Professional 컴퓨터에서만 실행됩니다. GPMC의 요구 사항과 기능에 대한 자세한 내용은 http://www.winnetmag.com에서 2003년 7월에 게시된 InstantDoc ID 39190 "Windows Server 2003의 그룹 정책 관리 콘솔"을 참조하십시오. Microsoft 다운로드 센터(http://www.microsoft.com/downloads/details.aspx?FamilyID=c355b04f-50ce-42c7-a401-30be1ef647ea&displaylang=en)에서 GPMC를 다운로드할 수 있습니다. GPMC를 설치할 때 시스템은 미리 작성된 GPMC 스크립트가 모두 포함되어 있는 Scripts라는 폴더를 만듭니다. Windows 2003이나 Windows XP 클라이언트에서 이 폴더는 %programfiles%\gpmc 디렉터리에 있습니다. 주요 관리 스크립트의 확장명은 Windows 스크립트 호스트(WSH)와 관련된 파일 형식 중 하나인 .wsf입니다. 확장명이 .wsf인 스크립트는 VBScript나 JScript로 작성된 다른 스크립트를 호출할 수 있는 XML 형식의 파일입니다. 즉, 이러한 스크립트에서는 VBScript 및 JScript 스크립팅 엔진을 모두 이용할 수 있습니다. 이 문서의 스크립트에는 .wsf 파일을 사용하지 않고 VBScript를 사용합니다.

GPMC 인터페이스는 %programfiles%\gpmc 디렉터리에 있는 gpmgmt.dll에서 구현됩니다. Microsoft는 이러한 인터페이스를 GPO 관리뿐 아니라 GPMC 기능 자동화에 사용할 수 있도록 조정했습니다. 따라서 인터페이스를 사용하여 GPO 마이그레이션에 대한 매핑 테이블을 만드는 등의 GPMC 작업을 스크립팅할 수 있을 뿐 아니라 GPO를 쿼리하고 수정할 수도 있습니다. 그러나 GPMC 인터페이스를 통해 GPO에서 정책 설정을 읽거나 구성할 수는 없습니다. 예를 들어 GPO에서 시작 메뉴에서 실행 제거 관리 템플릿 정책을 사용하도록 설정하는 스크립트를 만들 수 없습니다. 이러한 제한이 단점이긴 하지만 GPMC 인터페이스는 지금까지 사용할 수 없었던 뛰어난 수준의 자동화 기능을 제공합니다. 이제 GPMC 스크립팅을 시작하는 방법과 GPMC 개체를 사용하여 GPO 사용 권한을 검색하고 정책의 결과 집합(RSoP) 보고서를 얻는 등의 다양한 관리 작업을 수행하는 방법에 대해 살펴보겠습니다.

GPMC 스크립팅 시작하기

GPMC 스크립트를 작성하는 방법은 매우 간단합니다. 모든 GPMC 스크립트는 같은 기본 단계를 따라 작성됩니다. WSH 환경에서 사용하는 새로운 개체의 경우와 마찬가지로 우선 사용할 개체의 인스턴스를 만들거나 사용할 개체를 인스턴스화해야 합니다. 모든 GPMC 스크립트에서 가장 먼저 인스턴스화할 개체는 GPM 개체입니다. 이 개체는 GPMC 개체 모델의 루트 개체입니다. 이 GPM 개체는 다양한 기능을 사용할 수 있도록 하는 GPMC 인터페이스에 액세스하는 데 필요합니다. 예를 들어 Active Directory(AD) 도메인에 대한 참조를 만드는 데 사용할 수 있는 IGPMDomain 인터페이스에 액세스하려면 GPM 개체가 필요합니다. AD 도메인에 대한 참조를 만든 후 IGPMDomain의 GetGPO 메서드를 호출하여 IGPMGPO 인터페이스에 액세스할 수 있으며 관리할 특정 GPO에 대한 참조를 만들 수 있습니다. 여기에서는 IGPMGPO 인터페이스에 GPO 관리를 위한 메서드와 속성이 포함되어 있습니다. GPMC 개체 모델에 대한 자세한 내용은 Scripts 폴더에 있는 gpmc.chm 도움말 파일을 참조하십시오. http://msdn.microsoft.com/library/en-us/gpmc/gpmc/group_policy_management_console_reference.asp에 있는 그룹 정책 관리 콘솔 참조 자료에서도 개체 모델에 대한 자세한 정보를 얻을 수 있습니다.

일반적으로 사용되는 인터페이스에는 IGPMConstants도 있습니다. GPMC 스크립팅에서 특수한 인터페이스인 IGPMConstants는 GPMC 스크립트에서 흔히 필요한 GPO 관련 상수를 나타내는 속성 집합을 제공합니다. 예를 들어 GPO를 편집할 수 있는 사용자를 제어하기 위해 사용 권한을 설정해야 하는 경우 파일 시스템과 AD ACL의 복잡한 집합을 사용하여 편집 권한을 나타낼 수도 있습니다. 하지만 이렇게 하려면 많은 코드 작업이 필요하기 때문에 Microsoft는 이러한 작업을 수행할 IGPMConstants 인터페이스를 제공합니다. 이제 IGPMConstants 인터페이스의 PermGPOEdit 속성을 호출하기만 하면 적절한 사용 권한을 나타낼 수 있습니다. IGPMConstants 인터페이스에 액세스하려면 GPM 개체의 GetConstants 메서드를 사용해야 합니다. GetConstants 메서드를 사용하여 GPMConstants 개체에 대한 참조를 얻은 후에는 스크립트에 모든 종류의 GPMConstants 속성을 사용할 수 있습니다.

작업 1은 GPM 및 GPMConstants 개체를 만드는 데 사용하는 코드입니다. 이 코드를 기초로 작성하는 방법은 예제 스크립트 GetGPOPerms.vbs와 RSoPLogging.vbs에 나와 있습니다. 이 스크립트들이 가장 기본적인 것은 아니지만 Microsoft에서 제공하는 GPMC 스크립트와의 중복을 피하기 위해 두 스크립트를 예제로 사용합니다.

작업 1 GPM 및 GPMConstants 개체를 만드는 코드

BEGIN COMMENT
' Code that creates the GPM object.
END COMMENT
Set GPMC = CreateObject("GPMgmt.GPM")
BEGIN COMMENT
' Code that creates the GPMConstants object.
END COMMENT
Set Constants = GPMC.GetConstants()

GPO 사용 권한 검색

작업 2의 GetGPOPerms.vbs 스크립트에서는 몇 가지 GPMC 개체를 사용하여 테스트 도메인에서 GPO 사용 권한을 표시하는 방법을 보여 줍니다. GetGPOPerms.vbs에서는 GPM 및 GPMConstants 개체의 인스턴스화 작업으로 시작합니다. 그런 다음 도메인에 대한 정보를 검색하고 도메인에서 GPO를 관리할 수 있는 유용한 인터페이스인 IGPMDomain에 액세스합니다. IGPMDomain에 액세스하려면 GPM 개체의 GetDomain 메서드를 사용해야 합니다. 이 메서드는 GPMDomain 개체를 반환합니다. 작업 2의 callout A에서 볼 수 있듯이 GetDomain 메서드는 세 가지 인수를 사용합니다. 첫 번째 인수는 관리할 GPO를 저장하는 도메인의 이름입니다. 도메인 이름은 도메인의 DNS 이름(예: mycompany.net)이어야 합니다. callout A에서 볼 수 있듯이 스크립트에서 이 인수의 값을 하드 코딩할 수 있습니다. 또는, 스크립트 사용자가 스크립트를 시작할 때 명령줄에서 도메인 이름을 입력하도록 할 수도 있습니다.

두 번째 인수로 도메인에 연결하는 데 사용할 도메인 컨트롤러(DC)를 지정할 수 있습니다. null 문자열("")은 DC 기본 설정이 없으므로 GetDomain 메서드가 PDC 에뮬레이터를 사용한다는 것을 나타냅니다. 세 번째 인수의 경우 연결에 사용할 DC를 찾는 데 사용할 옵션을 지정할 수 있습니다. 옵션에는 GPM_USE_ANYDC(사용 가능한 DC 사용), GPM_USE_PDC(PDC 에뮬레이터 DC 사용) 또는 GPM_DONOTUSE_W2KDC(Windows 2003을 실행하는 DC 사용)가 있습니다. callout A에서 볼 수 있듯이 GetGPOPerms.vbs에서는 GPMConstants 개체의 UseAnyDC 속성을 사용하여 GPM_USE_ANYDC 옵션을 지정합니다.

도메인에 연결한 후 본격적인 작업이 시작됩니다. 작업 2의 callout B에 있는 코드에서 볼 수 있듯이 GPMDomain 개체의 GetGPO 메서드를 사용하여 사용 권한을 표시할 GPO를 나타내는 GPMGPO 개체를 검색합니다. GetGPOPerms.vbs를 사용하려면 도메인 이름 mycompany.net을 AD 도메인의 DNS 이름으로 바꿔야 합니다. GetGPO 메서드의 인수는 GPO의 이름이 아니라 GPO의 전역 고유 식별자(GUID)입니다. 이 스크립트에는 모든 AD 도메인에 있는 기본 도메인 정책의 GUID가 포함되어 있습니다. 이 GUID는 모든 AD 도메인에서 동일합니다.

스크립트의 사용자가 명령줄에서 필요한 GPO 정보를 제공하는 경우 입력하기 어려운 GUID 대신 GPO의 이름을 입력하게 하는 것이 적합합니다. GPO의 이름이 입력되면 Microsoft가 Scripts 폴더의 lib_commongpmcfunctions.js 파일에서 제공하는 GetGPObyName 함수를 사용하여 해당하는 GUID를 얻을 수 있습니다. GetGPObyName은 IGPMSearchCriteria 인터페이스를 사용하여 도메인에서 모든 GPO를 검색하고 입력한 이름이 일치하면 해당 GUID를 반환합니다. 그러면 스크립트가 이를 GetGPO로 전달합니다. 그러나 GetGPObyName은 JScript 함수입니다. VBScript를 사용하는 경우 GetGPObyName의 VBScript 버전을 작성하거나 Windows 2000 지원 도구에 포함된 IADsTools COM 개체의 GetGPO, GPOName 및 GPOGuid 메서드를 사용할 수 있습니다. 이러한 메서드에 대한 자세한 내용은 http://www.winnetmag.com에서 2003년 4월에 게시된 InstantDoc ID 38286, "IADsTools를 사용한 스크립팅"을 참조하십시오.

그 다음 작업으로 GPMGPO 개체의 GetSecurityInfo 메서드를 사용하여 GPO 사용 권한을 검색합니다. GetSecurityInfo 메서드는 스크립트에서 GPOSec 변수에 할당하는 GPMSecurityInfo 컬렉션 개체에 대한 참조를 반환합니다. GPMSecurityInfo 개체에는 GPO에 할당된 사용 권한 집합이 포함되어 있습니다. 스크립트에서는 컬렉션을 순환하면서 GPMSecurityInfo 개체의 Count 속성을 사용하여 컬렉션에 있는 사용 권한 항목의 수를 세고 반환합니다.

각 사용 권한 항목을 검색하기 위해 스크립트에서는 GPMPermission 개체에 대한 참조를 반환하는 GPMSecurityInfo 개체의 Item 속성을 사용합니다. 이 참조를 Ace 변수에 할당한 후에는 GPMPermission 개체의 Trustee 속성을 사용하여 GPMTrustee 개체에 액세스합니다. GPMTrustee 개체의 TrusteeName 속성을 호출하여 현재 사용 권한에 할당된 사용자나 그룹의 이름을 확인한 다음 이 이름을 PrincipalName 변수에 할당합니다.

작업 2의 callout C에 있는 코드에서는 Select Case 문을 사용하여 사용자나 그룹에 할당된 보안 권한을 확인합니다. GPO에는 IGPMConstants 인터페이스에 정의된 대로 다섯 가지 보안 권한이 있을 수 있으며 Select Case 문에 이러한 다섯 가지 권한이 포함되어 있습니다.

Select Case 문의 첫 번째 줄에서는 VBScript 런타임 엔진에게 Ace.Permission 값(즉, GPMPermission 개체의 Permission 속성 값)을 각 경우별로 비교하도록 지시합니다. Permission 속성 값이 다섯 가지 보안 권한 중 하나와 일치하면 이 사용 권한에 대한 이해하기 쉬운 설명이 Perm 변수에 할당됩니다. 마지막으로 스크립트에서는 WSH의 WScript.Echo 명령을 사용하여 사용자나 그룹의 이름과 사용 권한을 콘솔 화면에 출력합니다.

작업 2 GetGPOPerms.vbs

BEGIN COMMENT
' Create the GPM and GPMConstants objects, then connect to the domain.
END COMMENT
Set GPMC = CreateObject("GPMgmt.GPM")
Set Constants = GPMC.GetConstants()
‘ BEGIN CALLOUT A
Set GPMCDomain = GPMC.GetDomain("mycompany.net", "", 
Constants.UseAnyDC)
‘ END CALLOUT A
‘ BEGIN CALLOUT B
BEGIN COMMENT
' Create an object for the GPO for which you want to list the 
permissions.
END COMMENT
Set MyGPO = GPMCDomain.GetGPO("{31B2F340-016D-11D2-945F-00C04FB984F9}")
BEGIN COMMENT
' Get the permissions.
END COMMENT
Set GPOSec = MyGPO.GetSecurityInfo()
‘ END CALLOUT B
For indx=1 to GPOSec.Count
BEGIN COMMENT    ' Set the ACE to the Ace variable.
END COMMENT    Set Ace = GPOSec.Item(indx)
BEGIN COMMENT    ' Find out the username or group name for the ACE.
END COMMENT    Set UsrorGrp= Ace.Trustee    PrincipalName=UsrorGrp.TrusteeName
‘ BEGIN CALLOUT C
BEGIN COMMENT    ' Find out which permission the user or group has.
END COMMENT    Select Case Ace.Permission       Case Constants.permGPOApply          Perm="Read and Apply Group Policy"       Case Constants.permGPOEdit          Perm="Edit Group Policy"       Case Constants.permGPOEditSecurityAndDelete          Perm="Edit Group Policy, Modify Security and Delete 
Group Policy"       Case Constants.permGPORead          Perm="Read Group Policy"       Case Constants.permGPOCustom          Perm="Custom Permission"    End Select
‘ END CALLOUT C    WScript.Echo "The User or Group: " & PrincipalName & _       " has the following permission: " & Perm
Next

RSoP 보고서 얻기

GPMC의 유용한 점은 그룹 정책 로깅과 그룹 정책 계획이 가능하다는 것입니다. GPMC 인터페이스를 사용하여 프로그래밍 방식으로 그룹 정책 로깅과 그룹 정책 계획 세션에서 결과를 얻을 수 있습니다. 예를 들어, 그룹 정책 로깅 세션에서 결과를 얻으려면 RSoP WMI(Windows Management Instrumentation) 공급자를 사용해야 합니다.

작업 3의 RSoPLogging.vbs에서는 RSoP 인터페이스를 사용하여 로깅 쿼리를 실행하고 HTML 형식으로 로깅 보고서를 만드는 방법을 보여 줍니다. 스크립트의 처음 몇 줄에서는 GPM과 GPMConstants 개체를 만듭니다. 그런 다음 GPM 개체의 GetRSOP 메서드를 사용하여 GPMRSOP 개체의 인스턴스를 만듭니다. 이 메서드는 세 가지 매개 변수를 사용하는데 그 중 첫 번째 매개 변수는 RSoP 모드를 지정합니다. 작업 3의 callout A에 있는 코드에서 볼 수 있듯이 이 모드를 제공할 수 있는 한 가지 방법은 GPMConstants 개체의 RSOPModeLogging 속성을 사용하는 것입니다. RSoP 계획 세션을 수행하는 경우에는 RSOPModePlanning 속성을 대신 사용합니다. 두 번째 매개 변수는 이전 RSoP 데이터가 있는 WMI 네임스페이스의 경로를 지정합니다. 이 경우에는 이전 데이터가 없기 때문에 매개 변수는 null 문자열입니다. 마지막 매개 변수는 항상 0입니다.

GPMRSOP 개체의 인스턴스를 만든 후 스크립트에서는 RSoP 로깅 쿼리에 대한 GPMRSOP 개체의 LoggingComputer와 LoggingUser 속성을 설정합니다. LoggingComputer 속성은 대상 컴퓨터의 이름(이 경우에는 myworkstation)을 지정하고 LoggingUser 속성은 대상 사용자의 이름(이 경우에는 Darren)을 지정합니다. 그런 다음 매개 변수가 없는 GPMRSOP 개체의 CreateQueryResults 메서드를 호출하여 로깅 쿼리를 실행합니다.

마지막으로 스크립트는 두 가지 매개 변수를 사용하는 GPMRSOP 개체의 GenerateReportToFile 메서드를 호출합니다. 첫 번째 매개 변수는 생성할 보고서의 형식(HTML 또는 XML)을 지정합니다. 스크립트에서는 Constants 개체의 ReportHTML 속성을 사용하여 HTML 보고서를 지정합니다. XML 보고서를 받으려면 ReportHTML 속성 대신 ReportXML 속성을 사용하면 됩니다. 두 번째 매개 변수는 보고서의 경로 이름을 지정합니다.

GenerateReportToFile 메서드는 GPMResult 개체에 대한 참조를 반환할 수 있습니다. GPMResult 개체에는 보고서 실행을 마친 시기나 보고서 실행에 실패한 시기를 확인하는 데 사용할 수 있는 Result와 Status 속성이 있습니다. 그러나 RSoPLogging.vbs에서 보고서의 생성은 마지막 작업이므로 보고서가 완료된 시기를 알 필요가 없습니다. 스크립트 실행이 끝나면 보고서가 완료되었음을 알게 되므로 스크립트에서는 GPMResult에 대한 참조를 저장하지 않습니다.

작업 3 RSoPLogging.vbs

BEGIN COMMENT
' Create the GPM and GPMConstants objects.
END COMMENT
Set GPMC = CreateObject("GPMgmt.GPM")
Set Constants = GPMC.GetConstants()
‘ BEGIN CALLOUT A
BEGIN COMMENT
' Create a reference to an RSoP object.
END COMMENT
Set RSOP= GPMC.GetRSOP(Constants.RSOPModeLogging,"",0)
BEGIN COMMENT
‘ END CALLOUT A
' Set the RSoP logging session’s properties.
END COMMENT
RSOP.LoggingComputer="myworkstation"
RSOP.LoggingUser="darren"
BEGIN COMMENT
' Execute the RSoP logging query and send the results to an HTML file.
END COMMENT
RSOP.CreateQueryResults()
RSOP.GenerateReportToFile Constants.ReportHTML,"c:\reports\myrsop.html"