グループ ポリシー

Windows PowerShell を使用してグループ ポリシーの管理を自動化する

Darren Mar-Elia

この記事で提供している一部の情報は、プレリリース版ソフトウェアに基づいているため変更される可能性があります。

概要:

  • GPMC API を使用する
  • Windows PowerShell を使用してグループ ポリシー レポートを作成する
  • Windows 7 と Windows Server 2008 R2 に同梱されているコマンドレット

目次

GPMC の機能について
GPO のライフサイクルを自動化する
グループ ポリシー レポートの生成を自動化する
HTML ベースのレポートを生成する
XML ベースのレポートを生成する
RSoP ログのレポートを生成する
より簡単な方法

グループ ポリシーは強力なテクノロジですが、複雑なテクノロジでもあります。このテクノロジは、ほとんどの環境で、ある程度は使用されています。Windows 環境のセキュリティを確保し、ロック ダウンする手段として、グループ ポリシーに大きく依存している場合、グループ ポリシーはインフラストラクチャの要となります。

とは言うものの、多くの IT 組織では、グループ ポリシーの管理の自動化がほとんどなされていない点については、いつも驚きます。グループ ポリシー管理コンソール (GPMC) のリリース時に、マイクロソフトから、このコンソールを使用して実行するタスクを自動化する一連の API とサンプル スクリプトが提供されました。この API を使用して行えるタスクには、さまざまなものがあります。また、トラブルシューティングや診断など、グループ ポリシーの管理の他の側面を自動化することができます。そして、Windows PowerShell の登場により、このようなタスクには、さらに簡単に行えるようになったものもあります。

Thorbjörn Sjövold が執筆した記事「Windows PowerShell を使用してグループ ポリシーの管理を簡素化する」では、Windows PowerShell を使用して GPMC API を使用する方法を紹介しています。この記事では、上記の記事をベースに、グループ ポリシー環境の自動管理を強化する他の技法を紹介します。

GPMC の機能について

GPMC は、グループ ポリシー オブジェクト (GPO) 全体、GPO に関連付けられているアクセス許可、リンクなどに対して作用するようにデザインされています。GPMC には、GPO の設定を自動的に構成および管理する機能は備わっていませんが、グループ ポリシー環境における変更プロセスを管理する手段として、GPO 全体を自動化するのに役立ちます。たとえば、GPMC API を使用して、GPO のリンクを変更できます。新しい GPO を展開する必要がある場合は、スクリプトを使用して、GPO を作成したり、GPO の設定を構成した後のリンク設定を行ったりすることができます。また、スクリプトを使用して GPO のアクセス許可を変更することもできます。たとえば、GPO の対象となるセキュリティ グループや GPO を編集できるユーザーを変更できます。

もちろん、API を使用すると、変更を加えるだけでなく、GPO に関する情報を照会することもできます。たとえば、GPO の設定に関する HTML ベースのレポートや XML ベースのレポートを作成したり、リモート ワークステーションやサーバーのポリシーの結果セット (RSoP) レポートを生成して、グループ ポリシーが正常に適用されているかどうかを確認したりすることもできます。

Windows Vista SP1 と Windows Server 2008 に同梱されている更新された GPMC では、GPMC とグループ ポリシーで一般にサポートされる新機能の一部をサポートするように API が更新されたこともお知らせしておきましょう。たとえば、スターター GPO から新しい GPO を作成したり、GPO にコメントを追加したりできます。スターター GPO は、テンプレートのようなものです。スターター GPO を使用すると、管理用テンプレート ポリシーの設定を作成し、それを新しい GPO に適用して、一部の設定を事前に構成することができます。まず、GPO の作成、アクセス許可の設定、およびリンクの設定を自動化する方法を紹介してから、この自動化において、GPMC の新機能を活用する方法を紹介します。

GPO のライフサイクルを自動化する

GPO の作成と管理を自動化する方法を実証するため、ここでは Windows PowerShell と GPMC API を使用します。ここでは、TechNet Marketing Policy という名前の GPO を作成します。この GPO を作成する際には、User Lockdown Template という名前のスターター GPO をベースとして使用し、私が GPO の作成者であることを示すコメントを追加します。GPMC API を使用してスターター GPO を作成することも可能ですが、ここでは、このスターター GPO が既に作成されていることを想定しています。

次に自動化するのは、この GPO のアクセス許可の設定です。Marketing Users グループのユーザーのみがポリシーを処理できるように GPO のアクセス許可を設定し、GPO Admins というグループを追加して、このグループに GPO を編集するアクセス許可を与えます。最後に、この GPO を Active Directory ドメインの Marketing OU にリンクします。

Windows PowerShell スクリプト (gpoCreate.ps1) の全容については、図 1 を参照してください。行番号は参照する際に使用するために追加しました。

図 1 Windows PowerShell スクリプト (gpoCreate.ps1)

1. $gpmc = New-Object -ComObject GPMgmt.GPM
2. $constants = $gpmc.GetConstants()
3. $domain = $gpmc.GetDomain("cpandl.com",$null,$null)
4. $starter = $domain.GetStarterGPO("{CDFD6B94-BF4E-4D07-8D99-3D416EC7C9A0}")
5. $gpo = $domain.CreateGPOFromStarterGPO($starter)
6. $gpo.DisplayName = "Technet Marketing Policy"
7. $gpo.Description = "Created by Darren for Technet Demo"
8. $permissions = $gpo.GetSecurityInfo()
9. $permissions.RemoveTrustee("Authenticated Users")
10. $applyPermission = $gpmc.CreatePermission("Marketing Users",$constants.permGPOApply,$false)
11. $editPermission = $gpmc.CreatePermission("GPO Admins",$constants.permGPOEdit,$false)
12. $permissions.Add($applyPermission)
13. $permissions.Add($editPermission)
14. $gpo.SetSecurityInfo($permissions)
15. $som = $domain.GetSOM("OU=Marketing,DC=cpandl,DC=com")
16. $som.CreateGPOLink(1,$gpo)

1 行目のコードは、GPMC API を使用するために必要なものです。このコード行は、GPMC スクリプトで必ず必要になります。このコード行では、ベースとなる GPMC オブジェクトのインスタンスを作成し、このインスタンスを $gpmc 変数に代入しています。2 行目のコードも、ごく一般的なコマンドです。GPMC には、さまざまなタスクで特定の状態を示すために使用する便利な一連の定数が用意されています。この定数をスクリプトで使用する方法については後で紹介しますが、ここでは、定数を $constants 変数に代入していると説明するにとどめます。

3 行目のコードでは、操作対象となる Active Directory ドメインへの参照を取得する必要があります。ここでは、cpandl.com という名前のドメインが操作対象です。これには、$gpmc 変数で GetDomain メソッドを呼び出しています。2 つの $null パラメータは省略可能ですが、パラメータを使用すると、ドメインに接続する際に接続するドメイン コントローラを指定できます。これらのパラメータを null のままにすると、既定値が使用されます (既定値は、PDC エミュレータ DC です)。

4 行目のコードでは、スターター GPO (User Lockdown Template) への参照を取得する必要があります。GetStarterGPO メソッドでスターター GPO を呼び出すには GUID を指定する必要があるので、GPMC コンソールにアクセスして、GUID を確認する必要があります (この処理もスクリプトで行うことができます)。GetStarterGPO メソッドに渡しているのが、GPMC コンソールで確認した GUID です。

5 行目のコードでは、スターター GPO への参照を取得したので、この参照を使用して新しい GPO を作成しています。これには、$domain 変数で呼び出すことができる CreateGPOfromStarterGPO メソッドを使用しています。また、新しく作成した GPO を $gpo 変数に代入して、その後も使用できるようにしています。この時点では、GPO には名前がありません (もちろん、"新しいグループ ポリシー オブジェクト" という既定の名前は付いていますが、独自の名前はありません)。そのため、6 行目のコードでは、$gpo 変数の DisplayName プロパティを変更して、GPO に新しい名前を付けています。7 行目のコードでは、$gpo 変数の Description プロパティに値を設定することによって、GPO にコメントを追加しています。

GPO が作成できたので、次は、この GPO のアクセス許可を変更する必要があります。8 行目のコードでは、GPO で GetSecurityInfo メソッドを呼び出して、新しく作成した GPO の現在のアクセス許可の一覧を取得しています。GPO のアクセス許可を変更する方法は、GPO の現在のアクセス許可の一覧を取得し、必要に応じて、この一覧でエントリを追加および削除し、変更した一覧を GPO に再度適用するというものです。これを受けて、9 行目のコードでは、新しく作成した GPO から Authenticated Users の既定のアクセス許可を削除しています。

10 行目と 11 行目のコードでは、GPO に追加する 2 つの新しいアクセス許可を作成しています。これらのアクセス許可は $gpmc.CreatePermission メソッドを使用し、トラスティ名 (ユーザー グループ名) とそのグループに付与するアクセス許可を指定することで作成しています。アクセス許可の定義には、$constants 変数を使用しています。$constants.permGPOApply プロパティは、グループのメンバに GPO を処理する "グループ ポリシーの読み取りと適用" のアクセス許可を付与します。一方、permGPOEdit プロパティは、グループのメンバに GPO を編集するアクセス許可を付与します。CreatePermission メソッドの呼び出しの最後にある $false パラメータは、単にアクセス許可を継承しないことを指定しています。これは、GPO のアクセス許可の既定値です。

2 つのアクセス許可を作成したので、12 行目と 13 行目のコードでは、これを $permissions 変数に格納されているアクセス許可の一覧に追加し、14 行目のコードでは、GPO で SetSecurityInfo メソッドを呼び出して、新しいアクセス許可の一覧を GPO に再度適用しています。

最後の 2 行のコードでは、GPO を Marketing OU にリンクしています。15 行目のコードでは、$domain 変数で GetSOM メソッドを呼び出して、Marketing OU に接続しています (SOM は "scope of management (管理の範囲)" の頭文字です)。16 行目のコードでは、作成したばかりの $som オブジェクトで CreateGPOLink メソッドを呼び出して、2 つのパラメータを渡しています。1 つ目のパラメータでは、リンク先 OU での GPO の順序を指定しています (OU には複数の GPO をリンクすることができます)。1 つ目のパラメータとして指定している 1 という値は、この GPO を一覧の最初にリンクすることを示しています。2 つ目のパラメータ (この場合は、$gpo 変数) は、リンクする GPO への参照です。これで、自動化を使用して、GPO を正常に作成し、アクセス許可を設定し、リンクを設定することができました。その結果を図 2 に示します。

fig01.gif

図 2 新しく作成した GPO をコンソールで表示した状態

グループ ポリシー レポートの生成を自動化する

他にグループ ポリシーの管理で自動化できるものには、レポートの生成があります。GPMC で提供されるレポートには最低 2 種類あります。1 つ目は、GPO の設定に関するレポートを生成する機能です。この機能を使用すると、GPO で現在有効になっている設定を HTML または XML ベースのレポートとして生成できます (図 3 参照)。

fig02.gif

図 3 GPO の設定に関するレポート

2 つ目は、ポリシーの結果セット (RSoP) またはグループ ポリシーの結果レポートを生成する機能です。RSoP レポートには、RSoP ログと RSoP 計画の 2 種類のレポートがあります。ログ レポートは、リモート デスクトップ コンピュータやサーバーに対して実行するもので、そのリモート システムに対してどのようなポリシーが配信されているか、それらのポリシーが正常に適用されているかが示されます。一方、RSoP 計画レポートは、特定の OU、コンピュータ、またはユーザーに対して実行するもので、what-if 分析を実行して、適用するポリシーを特定することができます。ログ レポートと計画レポートの結果は、どちらも GPMC API と Windows PowerShell を使用して、HTML または XML ベースのレポートとして出力できます。

HTML ベースのレポートを生成する

Windows PowerShell で GPO の設定に関するレポートを生成する際には、まず、上記のスクリプトで使用した 2 つのなじみのある初期化コマンドを使用します。

1. $gpmc = New-Object -ComObject GPMgmt.GPM
2. $constants = $gpmc.GetConstants()

次に、レポートを作成する GPO への参照が必要なので、次のコマンドを実行します。

3. $domain = $gpmc.GetDomain("cpandl.com",$null,$null)
4. $gpo = domain.GetGPO("{31B2F340-016D-11D2-945F-00C04FB984F9}")

3 行目のコードではドメインに接続し、4 行目のコードでは、接続したドメインに対して GetGPO メソッドを使用して、レポートを作成する GPO への参照を取得します。ここでは、GPO の GUID を渡す必要があり、GPO は "既定のドメイン ポリシー" なので、その GUID を渡しました。

今度は、設定レポートを生成する必要があります。

5. $gpo.GenerateReportToFile($constants.ReportHTML,"c:\GPReports\DDPSettings.html")

ここでは、GPO で GenerateReportToFile メソッドを呼び出して、設定レポートを作成しています。1 つ目のパラメータでは $constants 変数を使用して、レポートの種類として HTML を指定しています。2 つ目のパラメータでは、レポートを保存する場所のパスを指定しています。

XML ベースのレポートを生成する

Windows PowerShell を使用して設定データにアクセスする方法として、Windows PowerShell に組み込まれている XML 解析機能と設定レポートを XML 形式で生成する機能を使用することもできます。そこで、上記スクリプトの 5 行目のコードを次のように変更しました。

[xml]$report = ($gpo.GenerateReport($constants.ReportXML)).Result

ここでは、GPO に対して GenerateReport メソッドという別のメソッドを使用しています。このメソッドでは、1 つのパラメータ (レポートの種類) を受け取ります。ただし、ここでは、メソッド呼び出しの出力を $report という名前の変数に代入し、この変数名の前には [xml] という Windows PowerShell の型アクセラレータを付けています。このアクセラレータは、$report 変数に格納した、このコマンドの出力を取得して、単なるテキスト ブロックではなく XML ドキュメントに変換するよう PowerShell に指示するものです。ただし、GenerateReport メソッドから返された実際の XML データを取得するには、この出力の Result プロパティを使用する必要があります。そのため、このステートメントの末尾で Result プロパティを指定しています。つまり、Result プロパティには XML ドキュメントの作成に使用する実際の XML データが格納されているということです。

$report 変数に XML データを代入したら、このデータを使用して、さまざまな処理を行えます。たとえば、次のコマンドについて考えてみましょう。

$report.GPO

このコマンドでは、レポートを作成する GPO の概要情報を提供するドキュメントの GPO 要素を返します。また、次のコマンドについて考えてみましょう。

$report.GPO.LinksTo

このコマンドでは、この GPO がリンクされているすべての場所の一覧を返します。

ただし、もっと興味深いのは、XML が構造化されているという特性を使用して、コマンドラインから GPO の設定を調査できることです。たとえば、これは、既定のドメイン ポリシー GPO なので、この GPO にはパスワード ポリシーに関するセキュリティ設定が含まれていることが予想されます。XML ファイルの表記どおりに GPO の名前空間を移動することによって、次のように、この設定に簡単にたどり着くことができます。

$report.GPO.Computer

このコマンドでは、GPO のコンピュータに関する情報を返します。この Computer プロパティのプロパティを確認すると、図4 に示すように ExtensionData プロパティに、複数のポリシー領域があることがわかります。

fig03.gif

図 4 XML データから GPO の設定を表示する

この GPO のコンピュータ側の設定には 2 つの拡張領域 (レジストリとセキュリティ) があります。そのため、ここでは次のコマンドを発行しました。

$report.GPO.Computer.ExtensionData[0].Extension

このコマンドを実行すると、セキュリティ ポリシー セクションに実装されているポリシー領域の一覧が返されます。Account および Security Options という 2 つのプロパティがあることが確認できたので、今度は、次のコマンドを実行します。

$report.GPO.Computer.ExtensionData[0].Extension.Account

このコマンドを実行すると、この GPO の各アカウント ポリシーの設定の一覧が返されます (図 5 参照)。

fig04.gif

図 5 GPO のアカウント ポリシー設定を確認する

図 5 では、値が表示されていない設定があることに注意してください。各設定は、Account プロパティのメンバとして返されます。たとえば、パスワードの長さの設定 (MinimumPasswordLength) を確認するには、次のようにコレクションのインデックスを指定する必要があります。

$report.GPO.Computer.ExtensionData[0].Extension.Account[4]

GPO 設定の XML 名前空間を移動するコツをつかむと、特定の設定にアクセスし、この機能を Windows PowerShell と組み合わせて使用して、GPO の設定を簡単に取得できるようになります。

RSoP ログのレポートを生成する

GPO の設定と同様に、特定のコンピュータに適用されたグループ ポリシーの設定に関する XML または HTML ベースのレポートを Windows PowerShell で生成することができます。ただし、アプローチが若干異なります。最初に 2 つの初期化コマンドを使用する点は同じですが、スクリプトの方向性が若干異なります。

1. $gpmc = New-Object -ComObject GPMgmt.GPM
2. $constants = $gpmc.GetConstants()
3. $rsop = $gpmc.GetRSOP($constants.RSOPModeLogging,$null,0)
4. $rsop.LoggingComputer = "xp2"
5. $rsop.LoggingUser = "cpandl\dpmtest"
6. $rsop.CreateQueryResults()
7. $rsop.GenerateReportToFile($constants.ReportHTML,"c:\gpreports\XP2Rsop.html")

1 行目と 2 行目のコードでプロセスを設定したら、3 行目のコードでは、$gpmc 変数で GetRSOP メソッドを呼び出して $rsop 変数を作成しています。このメソッドの呼び出しでは、RSoP 計画レポートではなく、RSoP ログ レポートを作成する必要があることを指定しています。4 行目と 5 行目のコードでは、$rsop オブジェクトのプロパティを設定し、RSoP データの収集対象となるコンピュータとユーザーを指定しています。6 行目のコードは、5 行目で指定したコンピュータに接続し、このクエリ用の RSoP 名前空間を生成しています。最終行である 7 行目のコードでは、クエリの結果を HTML ファイルに出力しています。

GPO の設定を取得した場合と同様に、RSoP オブジェクトには GenerateReport メソッドが用意されています。RSoP レポートを XML ドキュメントに出力し、Windows PowerShell で XML ドキュメント内を移動して、グループ ポリシーの観点から、リモート コンピュータで、どのようなことが行われているのかを特定できます。たとえば、GPO のコンピュータ側の設定の処理が正常に行われたかどうかを確認する必要があるとします。その場合は、上記スクリプトの 7 行目を次のように変更することで確認できます。

[xml]$rsopReport = 
  ($rsop.GenerateReport($constants.ReportXML)).Result

このコマンドを実行すると、RSoP レポートが XML ドキュメントに出力されます。

また、次のコマンドを実行して、XML 名前空間内を移動し、コンピュータのクライアント側拡張機能 (CSE) の状態を特定することもできます。

$rsopReport.Rsop.ComputerResults.ExtensionStatus

このコマンドを実行すると、コンピュータで処理された各 CSE の状態の一覧が返されます。

より簡単な方法

これまでに紹介したように、GPMC API を活用して、グループ ポリシーのライフサイクル、レポート生成、および診断タスクを自動化することで得られるメリットは多数あります。希望どおりの結果を手にするには、いくつかの手順を踏む必要がありますが、救済措置はありますし、この救済措置は今後拡大される予定です。

私は、GPMC の一般的な機能の大半を使いやすいコマンドレットにラップした 25 個の GPMC Windows PowerShell コマンドレットを作成し、無料で提供しています。これらの GPMC コマンドレットは、www.sdmsoftware.com/freeware からダウンロードしてご利用いただけます。この記事で最初に紹介した GPO を作成し、アクセス許可を設定し、リンクを設定するスクリプトと比較して、この簡略化された処理の例をご覧に入れましょう。私が作成した GPMC コマンドレットを使用すると、このスクリプトと同じ処理を実行できるだけでなく、少ない数のコマンドで実行できます。

$gpo = New-SDMgpo "Technet Marketing Policy" 
  -FromStarterGPO "User Lockdown Template" –native
$gpo.Description = 
  "Darren's Technet Demo GPO" Remove-SDMgpoSecurity 
$gpo.DisplayName -Trustee "Authenticated Users"  –PermApply
Add-SDMgpoSecurity $gpo.DisplayName 
  -Trustee "Marketing Users" –PermApply
Add-SDMgpoSecurity $gpo.DisplayName 
  -Trustee "GPO Admins" –PermEdit
Add-SDMgplink "Technet Marketing Policy" 
  -Scope "OU=Marketing,DC=cpandl,DC=com" -Location 1

さらに良いことには、Windows 7 と Windows Server 2008 R2 では、GPMC 対応の Windows PowerShell コマンドレットが組み込まれる予定です。たとえば、次のように 1 つの Windows PowerShell コマンドを実行するだけで、スターター GPO からコメント付きの GPO を作成できます。

new-gpo "Darren's Technet Policy" -starterGPOName 
 "User Lockdown Template" -Comment "Darren's Demo"

また、グループ ポリシー設定のサブセットを読み取ったり、書き込んだりするサポートも強化されます。具体的には、レジストリ設定をネイティブの管理者用テンプレート ポリシーや新しいグループ ポリシーの基本設定のレジストリ拡張への読み込みと書き込みがサポートされます。たとえば、グループ ポリシーの基本設定に新しいレジストリ値を書き込むには、次のコマンドを発行します。

Set-GPPrefRegistryValue "Darren's Technet Policy" 
  -key 'HKEY_LOCAL_MACHINE\Software\SDM Software' 
  -ValueName "Path" -Value "2" -Type String 
  -Context Computer -Action Update

ここでは、Set-GPPrefRegistryValue コマンドレットが、Darren's Technet Policy という名前の GPO に含まれるレジストリ ポリシー設定を HKEY_LOCAL_MACHINE\Software\SDM Software\Path= REG_SZ 2 レジストリ値に作成するために多数のパラメータを受け取っています。Context パラメータでは、このポリシーを GPO のコンピュータ側とユーザー側のどちらの設定として配置するのかを指定します。また、Action パラメータでは、レジストリ値を適用する方法を指定します。これは、GPP の UI で設定できるオプションに対応するもので、他には Replace、Create、および Delete を指定できます。

この記事の執筆時点では、Windows 7 と Windows Server 2008 R2 には、グループ ポリシーを管理するための 25 個のコマンドレットが同梱される予定です。これらのコマンドレットが利用できるようになれば、Windows PowerShell を使用してグループ ポリシーを管理する作業が、さらに簡単になります。

Darren Mar-Elia は、Microsoft グループ ポリシーの MVP です。グループ ポリシーに関する人気サイト (www.gpoguy.com) の制作者であり、『Microsoft Windows Group Policy Guide』(Microsoft Press、2005) の共著者でもあります。また、SDM Software Inc. の創立者で CTO を務めています。彼の連絡先は Darren@gpoguy.com (英語のみ) です。