しばたテックブログ

気分で書いている技術ブログです。

PowerShellからグループポリシーを扱う方法について

このエントリはhttps://atnd.org/events/59220の10日目の記事になります。

はじめに

先月11/29に行われたCLR/H in Tokyo 第6回 AD+IDスペシャルデイ~ハンズオンもあるよ!?~PowerShellからグループポリシーを操作してみようというタイトルでLTをしてきました。
本エントリではこの内容をベースにしてPowerShellでグループポリシーを扱う方法について説明していきます。

GPMC Class Library

PowerShellからグループポリシーを扱うにはGroup Policy Management Console Class Library(GPMC Class Library)というライブラリを使います。
このライブラリは名前の通りGPMCの機能を.NET Frameworkのクラスライブラリから扱うものになり、主となるクラスライブラリ(Microsoft.GroupPolicy名前空間)とPowerShellのコマンドレット(Microsoft.GroupPolicy.Commands名前空間)から構成されています。

インストール方法

GPMC Class Libraryを扱うためにはGPMCをインストールする必要があります。
細かい手順はここに記載されていますが、基本的にサーバーOSであれば機能の追加からGPMCを追加、非サーバーOSであればRSATでGPMCを追加すればインストールは完了です。

  • サーバーOSの場合(Windows Server 2008 R2以降)

    PowerShellから以下のコマンドを実行します。

Add-WindowsFeature GPMC

ローカルグループポリシーを扱うには

GPMPおよびGPMC Class LibraryではActive Directory環境下での使用が前提となっているため、ローカルグループポリシーを扱うことが出来ません。
ローカルグループポリシーをプログラムから扱う場合、COMオブジェクトを、IGroupPolicyObjectを直接扱う必要があります。
PowerShellからCOMオブジェクトを扱う方法には詳しくないのですが、このへんの方法を応用すればIGroupPolicyObjectを扱えるのではないかと思われます(未検証です)。

また、IGroupPolicyObjectはGPMC Class Libraryの内部でも使用されているインターフェイスになります。

コマンドレットを使用するにあたって

GPMCをインストールした後はコマンドレットを使用することが出来る様になりますが、必ず最初にImport-Moduleする必要があります。

Import-Module -Name grouppolicy

また、各コマンドを実行するにはグループポリシーを扱うのに適切な権限を持ったドメインユーザーである必要があります。

コマンドの一覧

使用できるコマンドの一覧はGet-Commandで確認できます。OSのバージョンによって若干使えるコマンドに差異がある様です。*1

Get-Command -Module grouppolicy

主要なコマンドの一覧を以下に記載します。*2

コマンド 説明
Backup-GPO グループポリシーオブジェクト(GPO)をバックアップします。
Copy-GPO GPOをコピーします。
Get-GPInheritance 指定したOUに対するGPOの継承情報を取得します。
Get-GPO GPOの情報を取得します。
Get-GPOReport 指定したGPOのレポートをHTMLまたはXML形式で生成します。
Get-GPPermissions 指定したGPOのアクセス権を取得します。
Get-GPPrefRegistryValue 「基本設定」におけるレジストリベースのポリシーの設定値を取得します。
Get-GPRegistryValue レジストリベースのポリシーの設定値を取得します。
Get-GPResultantSetOfPolicy ポリシー結果セット(RSOP)をHTMLまたはXML形式で取得します。
Get-GPStarterGPO スターターGPOを取得します。
Import-GPO バックアップからGPOをインポートします。
Invoke-GPUpdate 指定のリモートホストに対してポリシーの更新(GPUPDATE)を強制します。
New-GPLink 新しいリンクを作成します。
New-GPO 新しいGPOを作成します。
New-GPStarterGPO 新しいスターターGPOを作成します。
Remove-GPLink GPOのリンクを削除します。
Remove-GPO 既存のGPOを削除します。
Remove-GPPrefRegistryValue 「基本設定」におけるレジストリベースのポリシーの設定値を削除します。
Remove-GPRegistryValue レジストリベースのポリシーの設定値を削除します。
Rename-GPO GPOの名前を変更します。
Restore-GPO バックアップしたGPOを復元します。
Set-GPInheritance 指定したOUに対してGPOの継承情報を設定します。
Set-GPLink リンクの有効、無効を変更します。
Set-GPPermissions GPOのアクセス権を変更します。
Set-GPPrefRegistryValue 「基本設定」におけるレジストリベースのポリシーの値を設定します。
Set-GPRegistryValue レジストリベースのポリシーの値を設定します。

各コマンドの詳細についてはこちらを参照してください。

コマンドの実行例

本エントリではすべてのコマンドについて説明するのは難しいのでLTで例示したコマンドについてその補足を行う形で説明します。

Backup-GPOコマンド

GPOを指定のディレクトリにバックアップします。
このコマンドはGPMCのGUIから行う「すべてバックアップ」および「バックアップ」に相当します。
バックアップの方法は-Allオプションを指定してすべてのGPOをバックアップする方法と-Nameまたは-Guidオプションを指定して個別のGPOをバックアップする2種類あります。 -Pathオプションでバックアップ先を指定、-Commentオプションでバックアップに対するコメントを付与できます。
バックアップには個別のGUID(バックアップID)が振られ、リストアの際に指定することができます。

実行例

Backup-GPO -All -Path "C:¥Temp" -Comment "全体バックアップ"
Backup-GPO -Name MyGPO –Path "C:¥Temp" –Comment "個別バックアップ"

Restore-GPOコマンド

バックアップしたGPOをリストアします。
GPMCのGUIから行う「バックアップから復元」に相当します。
リストアの方法は-Allオプションを指定してすべてのGPOをリストアする方法と-BackupID、-Name、-Guidオプションを指定して個別のGPOをリストアする2種類の方法があります。 -Pathオプションでバックアップ先を指定します。 BackupIDを指定しない場合で、バックアップ先に同一GPOに対する複数のバックアップがある場合は最新のバックアップが自動的に選択されます。 また、リストアしようとするGPOが削除済みの場合はこのコマンドの実行に失敗してしまいます。

実行例

Restore-GPO -All -Path "C:¥temp"
Restore-GPO -Name MyGPO -Path "C:¥temp"
Restore-GPO -Backupid 1df0cec1-f038-4eb3-80bf-1969db2b2887 -Path "C:¥temp"

Import-GPOコマンド

バックアップからGPOをインポートします。
GPMCのGUIから行う「設定のインポート」に相当します。 -BackupIdおよび-BackupGpoNameオプションでバックアップのGPOを、-TargetGuidおよび-TargetNameでインポート後のGPO名を指定することができます。
インポート先のGPOが存在しない場合は通常エラーとなりますが、-CreateIfNeededオプションを指定することでGPOが存在しない場合新規作成することができます。
また、-MigrationTableオプションで移行テーブルエディタで作成した移行テーブルを適用することもできます。

実行例

Import-GPO -CreateIfNeeded -BackupGpoName MyGPO -TargetName MyGPO -Path "C:¥Temp"
Import-GPO -CreateIfNeeded -BackupGpoName MyGPO -TargetName MyGPO -MigrationTable "C:¥Sample.migtable" -Path "C:¥Temp" 

New-GPOコマンド

GPOを新規作成します。
-StarterGpoGuid、-StarterGpoNameオプションでスターターGPOを指定することができます。
このコマンドの戻り値はMicrosoft.GroupPolicy.Gpoクラスの値を返し、他のコマンドにパイプラインで渡すこともできます。

実行例

New-GPO -Name MyGPO -Comment "新規ポリシー"
New-GPO -Name MyGPO -StarterGpoName "StarterGPO"
# MSDNのサンプルから
New-GPO -Name TestGPO | New-GPLink -target "ou=marketing,dc=contoso,dc=com" 

Set-GPRegistryValueコマンド

レジストリベースのポリシーの値を設定します。"レジストリベースのポリシー"とはMSDNの表現から用語を取ってきたのですが、これは、単純に各ポリシーと思っていただいて結構です。

基本的にグループポリシーはポリシーに応じたレジストリの設定をPOLファイルを経由して各コンピューターやユーザーに強制する仕組みになります。
このコマンドではそのレジストリの設定を直接指定することでポリシーの内容を更新する形をとっています。そのためレジストリで設定できないポリシー設定(たとえばログオンスクリプトの設定など)はこのコマンドから設定することはできません。

そして各ポリシーがどの様なレジストリ値を取るのかについては、

や、

からダウンロードできるExcelファイルを参照することである程度わかります。
(2014/12/12追記:上記の他にポリシーのadm/admxファイルをテキストエディタ等で直接参照することでもレジストリ値の情報を知ることができます。)

このコマンドについては以下の実行例を見てもらった方がイメージが伝わるかと思います。

実行例

# 「ログオン時にサーバーマネージャーを自動的に表示しない」の設定値を 1(=自動的に表示しない) に設定する場合
Set-GPRegistryValue -Name MyGPO -Key HKLM¥Software¥Policies¥Microsoft¥Windows¥Server¥ServerManager -ValueName DoNotOpenAtLogon -Type Dword -Value 1


ただ、注意事項としてこのコマンドで指定するレジストリのキー、キーの型、設定値は厳密に指定する必要があります。 どれか一つでも間違って設定した場合は独自のポリシー設定として扱われ、GPMCのGUIに反映されません。
このため、このコマンドを使う場合、事前にGPMIのGUI上でポリシーを一旦設定し、Get-GPRegistryValueコマンドを使って設定値の型と値を確認するといった事をしておいた方が良いでしょう。*3

また、このコマンドについては安納さんのこの記事も参考になります。

【2017/03/07追記】

ADMXファイルおよびPOLファイルを解析してレジストリ値を取る方法について以下のエントリにまとめましたので参考にしてください。

stknohg.hatenablog.jp

【追記ここまで】

New-GPLinkコマンド

GPOのリンクを作成します。
-TargetオプションでリンクするOUを識別名の形で指定します。
-Orderオプションを指定することでリンクの順序を指定することができます。 順序は1始まりでGPMCのGUIで確認できる「リンクの順序」に相当します。順序を指定しない場合は最後の順序にリンクされます。

New-GPLink –Name MyGPO -Target "ou=Domain Controllers,dc=contoso,dc=local"
New-GPLink –Name MyGPO -Target "ou=Domain Controllers,dc=contoso,dc=local" -Order 1

*1:たとえばWindows 2012 R2だとInvoke-GPUpdateコマンドが使える様になっている等

*2:参考 http://www.atmarkit.co.jp/ait/articles/0912/24/news114_2.html

*3:と、いうかそうしないと何を設定するべきなのか全然わからないのが正直なところです...