none
グループポリシーの設定値取得方法について

    質問

  • 小嶋と申します。
    長文すみませんが、以下について何かご教授いただけることがあればぜひお願いいたします。

    【環境】Windows Server 2008 R2 ドメインコントローラー

    【目的】
    設計書をもとに設定したGPOのポリシー設定について、
    正しく設定されているか検証したい。

    【直接的なやりたいこと】
    各グループポリシーオブジェクトで設定した個別のポリシー設定について、
    GPOごとにどういった設定がされているかをプログラムから取得したい。
    ※「プログラム」と言っているのは、現状PowerShellを想定しているので、
     PowerShellから利用できる形であれば良いと考えています。

    現状は、後述【現状】のところまでたどり着いている状況ですが、
    最終的な設定項目を保持するXMLの構造が画一的でないため、
    かなり労力がかかると感じています。

    そこで、
    オブジェクトとして統一的なインターフェースがないか、というところを、
    引き続き調査していますが見つけられていません。

    イメージとしては以下のようなプロパティを持つような感じでしょうか・・・
    ・Name
    ・DisplayName
    ・ValueType
    ・Value

    グループポリシーの各設定項目を扱う方法が何かありましたら、
    教えていただけると助かります。

    【現状】
    Microsoft.GroupPolicy.Management名前空間を使用し、各GPOオブジェクトを取得。
    GPOオブジェクトのBackUpメソッドの結果出力される、gpreport.xmlファイルに、
    何かしら設定した項目(未定義でない項目)については、出力されることを確認。

    <上記を実現しているサンプルソース>
    [void][reflection.assembly]::LoadwithPartialName("Microsoft.GroupPolicy.Management");
    
    $domain = New-Object Microsoft.GroupPolicy.GPDomain;
    
    $GPOs = $domain.GetAllGpos();
    
    foreach ($gpo in $GPOs)
    {
    	$gpo.Backup("C:\test", "");
    }
    

    ----XMLサンプル----
    <Computer>
    <VersionDirectory>12</VersionDirectory>
    <VersionSysvol>12</VersionSysvol>
    <Enabled>true</Enabled>
    <ExtensionData>
    	<Extension xmlns:q1="http://www.microsoft.com/GroupPolicy/Settings/Security" xsi:type="q1:SecuritySettings">
    		<q1:Account>
    		<q1:Name>MinimumPasswordLength</q1:Name>
    		<q1:SettingNumber>9</q1:SettingNumber>
    		<q1:Type>Password</q1:Type>
    		</q1:Account>
    		<q1:EventLog>
    		<q1:Name>MaximumLogSize</q1:Name>
    		<q1:Log>System</q1:Log>
    		<q1:SettingNumber>16384</q1:SettingNumber>
    		</q1:EventLog>
    	</Extension>
    	<Name>Security</Name>
    </ExtensionData>
    <ExtensionData>
    	<Extension xmlns:q2="http://www.microsoft.com/GroupPolicy/Settings/Auditing" xsi:type="q2:AuditSettings">
    		<q2:AuditSetting>
    		<q2:PolicyTarget>System</q2:PolicyTarget>
    		<q2:SubcategoryName>資格情報の確認の監査</q2:SubcategoryName>
    		<q2:SubcategoryGuid>{0cce923f-69ae-11d9-bed3-505054503030}</q2:SubcategoryGuid>
    		<q2:SettingValue>3</q2:SettingValue>
    		</q2:AuditSetting>
    		<q2:AuditSetting>
    		<q2:PolicyTarget>System</q2:PolicyTarget>
    		<q2:SubcategoryName>その他のアカウント管理イベントの監査</q2:SubcategoryName>
    		<q2:SubcategoryGuid>{0cce923a-69ae-11d9-bed3-505054503030}</q2:SubcategoryGuid>
    		<q2:SettingValue>1</q2:SettingValue>
    		</q2:AuditSetting>
    		<q2:AuditSetting>
    		<q2:PolicyTarget>System</q2:PolicyTarget>
    		<q2:SubcategoryName>ディレクトリ サービス レプリケーションの監査</q2:SubcategoryName>
    		<q2:SubcategoryGuid>{0cce923d-69ae-11d9-bed3-505054503030}</q2:SubcategoryGuid>
    		<q2:SettingValue>2</q2:SettingValue>
    		</q2:AuditSetting>
    	</Extension>
    	<Name>Advanced Audit Configuration</Name>
    	</ExtensionData>
    	<ExtensionData>
    	<Extension xmlns:q3="http://www.microsoft.com/GroupPolicy/Settings/Registry" xsi:type="q3:RegistrySettings">
    		<q3:Policy>
    		<q3:Name>既定のユーザー ログオン画像をすべてのユーザーに適用する</q3:Name>
    		<q3:State>Enabled</q3:State>
    		<q3:Comment>テストです。</q3:Comment>
    		<q3:Explain>
    		このポリシー設定では、管理者がシステム上のすべてのユーザー用ログオン画像を既定のユーザー画像に標準化することができます。ログオン画像を企業ロゴに標準化することは、このポリシー設定の適用の 1 つです。 注: 既定のユーザー画像は %PROGRAMDATA%\Microsoft\User Account Pictures\user.bmp に保存されています。既定のゲスト画像は %PROGRAMDATA%\Microsoft\User Account Pictures\guest.bmp に保存されています。既定の画像が存在しない場合、空のフレームが表示されます。 このポリシー設定を有効にすると、システム上のすべてのユーザーに対して既定のユーザー ログオン画像が表示され、カスタマイズは許可されません。 このポリシー設定を無効にした場合、または構成しなかった場合、ユーザーは自分のログオン画像をカスタマイズできます。
    		</q3:Explain>
    		<q3:Supported>Windows Vista 以降</q3:Supported>
    		<q3:Category>コントロール パネル/ユーザー アカウント</q3:Category>
    		</q3:Policy>
    	</Extension>
    	<Name>Registry</Name>
    </ExtensionData>
    </Computer>

    2012年6月6日 6:26

回答

  • Windows Server 2008 R2であれば、GroupPolicyモジュールのGet-GPRegistryValueコマンドレットを用いることで、「ポリシーオブジェクト名」と「設定を格納するレジストリキー名」を指定すれば、各ポリシー設定の「レジストリエントリ名」「値」「値のタイプ」を取得できるかと思います。

    ただしレジストリキー名を指定しないといけない(ワイルドカード不可)点と、ポリシーのDisplayName的なものが取得できないのが難点です。

    すべてのポリシー設定をチェックするには、レポートXMLを解析していくしかないのかもしれません。

    なおGroupPolicyモジュールのGet-GPOReportコマンドレットを用いることでレポートXMLを出力すること自体は容易です。

    Get-GPOReport -All -ReportType xml

    この出力を[xml]にキャストして、ノードを辿っていく感じになるのでしょうか。
    2012年6月6日 9:16

すべての返信

  • Windows Server 2008 R2であれば、GroupPolicyモジュールのGet-GPRegistryValueコマンドレットを用いることで、「ポリシーオブジェクト名」と「設定を格納するレジストリキー名」を指定すれば、各ポリシー設定の「レジストリエントリ名」「値」「値のタイプ」を取得できるかと思います。

    ただしレジストリキー名を指定しないといけない(ワイルドカード不可)点と、ポリシーのDisplayName的なものが取得できないのが難点です。

    すべてのポリシー設定をチェックするには、レポートXMLを解析していくしかないのかもしれません。

    なおGroupPolicyモジュールのGet-GPOReportコマンドレットを用いることでレポートXMLを出力すること自体は容易です。

    Get-GPOReport -All -ReportType xml

    この出力を[xml]にキャストして、ノードを辿っていく感じになるのでしょうか。
    2012年6月6日 9:16
  • 牟田口

    ありがとうございます。

    やはりXMLを地道に解析するしかないですよね・・・

    踏ん切りがつきました。(笑)

    XMLの構造からみても統一的なインターフェースはなかなか難しいのかな、とも思います。

    ---

    Get-GPOReportで簡単に出力できるのですね。

    自分が行っていたBackupメソッドの結果で取得できるものと同じもののようです。

    こちらのほうが圧倒的に簡単ですね。

    以下のような形で、構造が同じブロックごとにロジックを作りながらがんばってみます。

    $GPOs = Get-GPO -All;	# 全GPO取得
    
    foreach ($gpo in $GPOs)
    {
    	[xml]$report = Get-GPOReport -Name $gpoName -ReportType Xml;
    
    	$accounts = $rep.SelectNodes("//xsi:GPO/xsi:Computer/xsi:ExtensionData/xsi:Extension/q2:Account", $nsManager);
    	foreach ($accountNode in $accounts)
    
    	{
    		#ノードをたどってごにょごにょ
    	}
    }

    どうもありがとうございました。

    2012年6月7日 0:40