GPO 管理タスクの自動化
グループ ポリシー管理コンソール (GPMC) のスクリプト インターフェイスを使用して、多くの共通する GPO 管理タスクを自動化する方法について説明します。このドキュメントは、「Windows & .NET Magazine」(英語)
の 2003 年 8 月号に掲載されたものです。
トピック
はじめに
GPMC
スクリプトの記述方法
GPO
のアクセス許可を取得する
RsoP
レポートの取得
GPMC
が提供する新しい可能性
はじめに
Microsoft は、4 月にグループ ポリシー管理コンソール (GPMC) をリリースしました。この GPMC では、Microsoft 管理コンソール (MMC)
をベースにしたユーザー インターフェイスを使用して、Windows Server 2003 および Windows 2000 のグループ ポリシーの管理を簡単に行うことができます。GPMCは
Windows 2000 のネイティブ ツールに比べてグループ ポリシー オブジェクト (GPO) の管理機能が飛躍的に進歩しました。Windows 2000
のネイティブ ツールでは、スクリプトを記述して GPO を管理することは困難でしたが、GPMC では、スクリプト インターフェイスを備えているので、多くの共通する
GPO 管理タスクを自動化できます。このスクリプト インターフェイスを使用して、グループ ポリシー環境を管理できるので、GPO 設定のレポート作成、GPO の作成およびコピー、リンクしていない
GPO の検索などを行うことができます。Microsoft は、スクリプトで処理する多くの共通するタスクを扱う GPMC のスクリプトを提供しています。また、ユーザー自身がスクリプトを作成して、カスタムの
GPO 管理タスクを実行することもできます。
GPMC は、Windows 2000 ドメイン ベースのグループ ポリシーを管理できますが、実行できるのは、Windows Server 2003 または Windows
XP Professional のコンピュータ上だけです。(GPMC の必要条件および機能の詳細については、http://www.microsoft.com/japan/windowsserver2003/gpmc/default.mspx
をご確認ください。)GPMC は、Microsoft ダウンロード センター (http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=0a6d4c24-8cbd-4b35-9272-dd3cbfc81887)
からダウンロードできます。GPMC をインストールすると、"Scripts" という名前のフォルダが作成され、あらかじめ用意されているすべての GPMC スクリプトが格納されます。Windows
Server 2003 クライアントまたは Windows XP クライアントでは、このフォルダが %programfiles%\gpmc ディレクトリに作成されます。主要な管理スクリプトには、.wsf
の拡張子が付けられています。この拡張子は WSH (Windows Script Host) に関連するファイル形式であることを表します。.wsf 拡張子のスクリプトは、XML
形式のファイルです。VBScript や JScript で記述された他のスクリプトを呼び出すので、1 つのスクリプトで VBScript スクリプト エンジンと
JScript スクリプト エンジンの両方の機能を利用できます。このドキュメントのスクリプトでは、.wsf ファイルを使用せず、VBScript のみを使用します。
GPMC インターフェイスは、%programfiles%\gpmc ディレクトリにある gpmgmt.dll に実装されています。GPMC の機能の自動化に加えて、GPO
の管理も目的として Microsoft はこれらのインターフェイスを作成しました。したがって、GPO の移行時にマッピング テーブルを作成するなどの GPMC
操作をスクリプトに記述することも、GPO を検索、修正することもできます。ただし、GPMC インターフェイスからは、GPO のポリシー設定を参照したり、構成したりできません。たとえば、GPO
の [[スタート] メニューから [ファイル名を指定して実行] を削除する] 管理用テンプレートのポリシーを有効にするスクリプトは作成できません。この制約があることは残念ですが、GPMC
インターフェイスを使用すると、相当の自動化を実現でき、従来より便利になります。それでは、まず、GPMC スクリプトの記述方法について説明し、次に、GPO のアクセス許可を取得する、ポリシーの結果セット
(RSoP) のレポートを取得するなど、さまざまな管理タスクを GPMC オブジェクトを使用して実行する方法について説明します。
GPMC スクリプトの記述方法
GPMC のスクリプトはすべて基本的な手順に従って同じように記述するので、習得は難しくありません。WSH 環境で使用する新しいオブジェクトと同様に、まず使用するオブジェクトのインスタンスを作成する
(インスタンス化) 必要があります。すべての GPMC スクリプトでも、GPM オブジェクトを最初にインスタンス化する必要があります。この GPM オブジェクトは、GPMC
オブジェクト モデルのルート オブジェクトです。他の GPMC インターフェイスにアクセスするために使用し、このインターフェイスからさらに別の機能にアクセスします。たとえば、まず
GPM オブジェクトから IGPMDomain インターフェイスにアクセスし、次に AD (Active Directory) ドメインへの参照を作成します。AD
ドメインへの参照を作成したら、IGPMDomain の GetGPO メソッドを呼び出して IGPMGPO インターフェイスにアクセスし、管理したい GPO への参照を作成します。この参照から、IGPMGPO
インターフェイスは管理対象の GPO のメソッドとプロパティを取得します。GPMC オブジェクトの詳細については、Scripts フォルダにあるヘルプ ファイル
(gpmc.chm) を参照してください。オブジェクト モデルの詳細については、Microsoft Developer Network (MSDN) の「Group
Policy Management Console Reference」(http://msdn.microsoft.com/library/aa814150.aspx)
(英語) を参照してください。
よく使う別のインターフェイスに、IGPMConstants があります。これは GPMC スクリプトの中でも特殊なインターフェイスで、GPMC スクリプトでよく使う
GPO に関連する定数を表すプロパティ セットを提供します。たとえば、GPO を編集するユーザーを管理するために、アクセス許可のセットが必要だと仮定します。以前は、ファイル
システムと AD ACL を複雑に組み合わせて編集アクセス許可を付与しましたが、この方法ではたくさんのコードを記述することになります。Microsoft が提供する
IGPMConstants インターフェイスを使用するとこの作業が簡単に行えます。IGPMConstants インターフェイスの PermGPOEdit プロパティを呼び出し、該当するアクセス許可を付与するだけです。IGPMConstants
インターフェイスにアクセスするには、GPM オブジェクトの GetConstants メソッドを使用します。GetConstants メソッドを使用して GPMConstants
オブジェクトへの参照を取得すると、スクリプト内ですべての GPMConstants プロパティが使用できます。
GPM オブジェクトと GPMConstants オブジェクトを作成するためのコードをリスト 1 に示します。その下の GetGPOPerms.vbs と RSoPLogging.vbs
のサンプル スクリプトもご覧ください。このコードの作成方法を示しています。これら 2 つのスクリプトは一般的ではありませんが、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 オブジェクトをインスタンス化します。次に、スクリプトが、IGPMDomain にアクセスします。IGPMDomain
は、ドメインの情報を取得したり、ドメインの GPO を管理したりする使いやすいインターフェイスです。IGPMDomain にアクセスするには、GPM オブジェクトの
GetDomain メソッドを使用します。このメソッドは GPMDomain オブジェクトを返します。リスト 2 の Callout A にあるように、GetDomain
メソッドは 3 つの引数を取ります。1 つ目の引数は、管理対象の GPO を保存するドメインの名前です。ドメイン名は、そのドメインの DNS 名である必要があります
(例 : mycompany.net)。Callout A で示すように、この引数の値はスクリプトにハード コーディングできますが、スクリプトを実行するときにユーザーがコマンド
ラインにドメイン名を入力する方法もあります。
2 つ目の引数は、ドメインに接続するために使用するドメイン コントローラ (DC) を指定します。NULL 文字列 ("") は、優先する DC がないことを示します。つまり、GetDomain
メソッドが PDC エミュレータを使用します。3 つ目の引数は、接続する DC を検出するために使用するオプションを指定します。オプションは 3 つあります。GPM_USE_ANYDC
(使用可能なすべて DC を使用する)、GPM_USE_PDC (PDC エミュレータ DC を使用する)、GPM_DONOTUSE_W2KDC (Windows
Server 2003 を稼動する DC を使用する) です。Callout A で示すように、GetGPOPerms.vbs で GPMConstants オブジェクトの
UseAnyDC プロパティを使用して、GPM_USE_ANYDC オプションを指定しています。
ドメインに接続したら、これからが本番です。リスト 2 の Callout B のコードにあるように、GPMDomain オブジェクトの GetGPO メソッドを使用して、GPMGPO
オブジェクトを取得します。このオブジェクトはアクセス許可を一覧する GPO を表します。GetGPOPerms.vbs を使用するには、ドメイン名の "mycompany.net"
を AD ドメインの DNS 名に置き換える必要があります。GetGPO メソッドの引数は、GPO の GUID (グローバル識別子) であり、GPO のフレンドリ名でないことに注意してください。このスクリプトには、すべての
AD ドメインを表す既定のドメイン ポリシーの GUID を含めました。この GUID は、どの AD ドメインでも同じです。
スクリプトのユーザーが GPO の必要な情報をコマンド ラインから入力する場合は、キー入力しにくい GUID を入力せずに、GPO のフレンドリ名を入力する方法があります。この方法では、GetGPObyName
関数を使用して、対応する GUID を取得できます。この関数は、Microsoft が提供する Scripts フォルダの lib_commongpmcfunctions.js
にあります。GetGPObyName は IGPMSearchCriteria インターフェイスを使用して、ドメイン内のすべての GPO を検索します。入力したフレンドリ名と一致すると、GUID
が返され、スクリプトが GetGPO に渡します。ただし、GetGPObyName は JScript 関数です。VBScript を使用する場合は、VBScript
バージョンの GetGPObyName を記述するか、IADsTools COM オブジェクトの GetGPOs メソッド、GPOName メソッドまたは GPOGuid
メソッドを使用してください。IADsTools COM オブジェクトは Windows 2000 サポート ツールに含まれています。これらのメソッドの詳細については、2003
年 4 月の InstantDoc ID 38286「Scripting with IADsTools」(http://www.winnetmag.com)
(英語) を参照してください。
次に、スクリプトで GPMGPO オブジェクトの GetSecurityInfo メソッドを使用して、GPO のアクセス許可を取得します。GetSecurityInfo
メソッドは、GPMSecurityInfo コレクション オブジェクトへの参照を返します。この参照は、GPOSec 変数に割り当てられます。GPMSecurityInfo
オブジェクトは GPO に割り当てるアクセス許可を含みます。スクリプトはこのコレクションを通じて繰り返し、GPMSecurityInfo オブジェクトの Count
プロパティを使用してこのコレクション内のアクセス許可エントリ数を割り出して、返します。
各アクセス許可エントリを取得するには、スクリプトで GPMSecurityInfo オブジェクトの Item プロパティを使用します。GPMPermission
オブジェクトへの参照が返されます。スクリプトでこの参照を Ace 変数に割り当てると、GPMPermission オブジェクトの Trustee プロパティを使用して、GPMTrustee
オブジェクトにアクセスします。GPMTrustee の TrusteeName プロパティを呼び出し、現在のアクセス許可を割り当てているユーザー名またはグループ名を決定し、その名前に
PrincipalName 変数を割り当てます。
リスト 2 の Callout C のコードでは、Select Case ステートメントを使用して、そのユーザー名またはグループ名に割り当てるセキュリティ権利を決定します。1
つの GPO は 5 つのセキュリティ権利を持ちます。IGPMConstants インターフェイスで定義します。Select Case ステートメントは、これら
5 つのセキュリティ権利を含みます。
Select Case ステートメントの 1 行目に VBScript ランタイム エンジンで Ace.Permission 値 (例 : GPMPermission
オブジェクトの Permission プロパティ値) と各ケースを比較するように記述します。Permission プロパティ値が 5 つのセキュリティ権利のどれかと一致したら、その
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 は、グループ ポリシー ロギングとグループ ポリシー プランニングの 2 つの使いやすい機能を備えています。GPMC インターフェイスを使用して、プログラムからグループ
ポリシーのロギング セッションとプランニング セッションの結果を取得できます。たとえば、グループ ポリシーのロギング セッションから結果を取得するには、RSoP
Windows Management Instrumentation (WMI) プロバイダを使用する必要があります。
RSoPLogging.vbs (リスト 3 を参照) に、RSoP インターフェイスを使用し、ロギング クエリを実行して HTML 形式のロギング レポートを作成する方法の例を示します。このスクリプトの初めの数行で
GPM オブジェクトと GPMConstants オブジェクトを作成します。次に、GPM オブジェクトの GetRSOP メソッドを使用して、GPMRSOP オブジェクトのインスタンスを作成します。このメソッドは
3 つのパラメータを取ります。1 つ目のパラメータは、RSoP モードを指定します。リスト 3 の Callout A のコードでは、RSoP モードを指定する一例として、GPMConstants
オブジェクトの RSOPModeLogging プロパティを使用しています。RSoP プランニング セッションを実行する場合は、RSOPModePlanning
プロパティを使用してください。2 つ目のパラメータで、WMI 名前空間にパスを指定します。このパスには、前の RSoP データがあります。この場合、前のデータがないので、パラメータは
Null 文字列になります。3 つ目のパラメータは常に 0 です。
GPMRSOP オブジェクトのインスタンスを作成したら、GPMRSOP オブジェクトの LoggingComputer プロパティと LoggingUser プロパティの
2 つを RSoP ロギング クエリに設定します。LoggingComputer プロパティでは、ターゲット コンピュータの名前を指定します。この場合は、myworkstation
です。LoggingUser プロパティでは、ターゲット ユーザーの名前を指定します。この場合は、Darren です。次に、ロギング クエリを実行するために、GPMRSOP
オブジェクトの CreateQueryResults メソッドを呼び出します。このメソッドはパラメータを持ちません。
最後に、GPMRSOP オブジェクトの GenerateReportToFile メソッドを呼び出します。このメソッドは 2 つのパラメータを持ちます。1 つ目のパラメータで、生成されるレポートの種類
(HTML または XML) を指定します。このスクリプトでは、Constants オブジェクトの ReportHTML プロパティを使用して、HTML 形式のレポートを指定します。XML
形式のレポートを指定する場合は、ReportHTML プロパティではなく ReportXML プロパティを使用します。2 つ目のパラメータに、レポートのパス名を指定します。
GenerateReportToFile メソッドは、GPMResult オブジェクトへの参照を返します。GPMResult オブジェクトは Result と
Status の 2 つのプロパティを持ちます。これらのプロパティで、レポートが実行を正常に終了したか、正常に実行できなかったかを判断します。ただし、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"
GPMC が提供する新しい可能性
GPMC インターフェイスは、柔軟性を持つ強力な新機能であり、Microsoft が提供するドキュメントも充実しています。このインターフェイスを使用すると、グループ
ポリシー インフラストラクチャを Windows 2000 ネイティブ ツールより簡単に制御できます。カスタム スクリプトを作成して、Microsoft が提供するスクリプトと組み合わせて使用すると、ほとんどの
GPO 管理タスクを自動化できます。
© 2003 Windows & .NET Magazine. All rights reserved.
「Windows & .NET Magazine」のサンプル版を
https://secure.pentontech.com/nt/windows/index.cfm?promocode=fs&Code=WI201XTN
から入手してください。
「Windows & .NET Magazine」(英語) は、Windows IT 技術者向けのニュースや情報が掲載されたニュースレターです。電子メールを使い、無料で配信いたします。購読のお申し込みは、http://windowsitpro.com/news/
でお受けしております。
ここに記載されている情報は、ユーザーに役立つことを目的として提供されています。ただし、このドキュメントに記載されている情報を使用するにあたっては、ユーザーが責任を負うものとします。すべての情報は
"現状のまま" 提供され、その正確さ、完全性、特定目的への適合性、権利侵害の有無については、明示的にも暗黙的にもなんら保証するものではありません。また、ここに引用されているサード
パーティ製品と情報はマイクロソフトの作成によるものではなく、マイクロソフトが推奨、サポート、保証するものでもありません。マイクロソフトでは、本文書の情報を基に行った操作による直接的、間接的、偶発的、派生的、あるいは特殊な損害に対して、本文中に損害の可能性が記載されている場合も含めて、一切の責任を負いません。記載されている製品の価格は、将来予告なしに変更されることがあります。