PowerShell を使ってグループポリシーを操作する

実行環境

実行環境は以下となります。

  • Windows Server 2019

PowerShell で用意されているグループポリシー関連のコマンド一覧

Windows Server 2019 のドメインコントローラー環境であれば、PowerShell を起動しただけで GroupPolicy のモジュールは読み込まれているので、昔みたいにわざわざ「Import-Module GroupPolicy」は実施しなくてもいいです。

GroupPolicy モジュールで用意されているコマンドレットの一覧は以下で確認可能です。

 

各コマンドレットの説明は以下です。

コマンドレット名 説明
Backup-GPO ドメイン内の1つのGPOまたはすべてのGPOをバックアップします。
Copy-GPO GPOをコピーします。
Get-GPInheritance 指定したドメインまたはOUのグループポリシーの継承情報を取得します。
Get-GPO ドメイン内の1つのGPOまたはすべてのGPOを取得します。
Get-GPOReport 指定されたGPOまたはドメイン内のすべてのGPOについて、XMLまたはHTML形式でレポートを生成します。
Get-GPPermission 指定したGPOの1つまたは複数のセキュリティプリンシパルのアクセス許可レベルを取得します。
Get-GPPermissions 指定したGPOの1つまたは複数のセキュリティプリンシパルのアクセス許可レベルを取得します。
Get-GPPrefRegistryValue コンピューターの構成またはユーザーの構成でレジストリ基本設定項目を取得します。
Get-GPRegistryValue コンピューターの構成またはユーザーの構成のいずれかで、1つ以上のレジストリベースのポリシー設定を取得します。
Get-GPResultantSetOfPolicy ユーザー、コンピューター、またはその両方のRSoP情報を取得してファイルに書き込みます。
Get-GPStarterGPO ドメイン内の1つのスターターGPOまたはすべてのスターターGPOを取得します。
Import-GPO バックアップされたGPOから指定されたGPOにグループポリシー設定をインポートします。
Invoke-GPUpdate 指定したコンピューターでグループポリシーを更新します。
New-GPLink GPOをサイト、ドメイン、またはOUにリンクします。
New-GPO GPOを作成します。
New-GPStarterGPO スターターGPOを作成します。
Remove-GPLink サイト、ドメイン、またはOUからGPOリンクを削除します。
Remove-GPO GPOを削除します。
Remove-GPPrefRegistryValue コンピューターの構成またはユーザーの構成から1つ以上のレジストリユーザー設定項目を削除します。
Remove-GPRegistryValue コンピューターの構成またはユーザーの構成のいずれかから1つ以上のレジストリベースのポリシー設定を削除します。
Rename-GPO GPOに新しい表示名を割り当てます。
Restore-GPO 1つ以上のGPOバックアップファイルから、ドメイン内の1つのGPOまたはすべてのGPOを復元します。
Set-GPInheritance 指定したドメインまたは組織単位の継承をブロックまたはブロック解除します。
Set-GPLink 指定したGPOリンクのプロパティを設定します。
Set-GPPermission ドメイン内の1つのGPOまたはすべてのGPOのセキュリティプリンシパルにレベルのアクセス許可を付与します。
Set-GPPermissions ドメイン内の1つのGPOまたはすべてのGPOのセキュリティプリンシパルにレベルのアクセス許可を付与します。
Set-GPPrefRegistryValue コンピューターの構成またはユーザーの構成でレジストリ基本設定項目を構成します。
Set-GPRegistryValue コンピューターの構成またはユーザーの構成のいずれかで、1つ以上のレジストリベースのポリシー設定を構成します。

使う頻度が高いコマンドレットの使用例

Backup-GPO

本番環境だとグループポリシーの設定を変更する前にバックアップを取って置きたいことがある。その時は、このコマンドを使えばすべての GPO のバックアップを取得することが可能です。

C:\work\GPOBackup フォルダ内にバックアップしたい場合には、以下のコマンドを実行。(フォルダは自動作成してくれないので存在するフォルダを指定する必要があります)

 

本番環境だと設定変更前と設定変更後に取得したいとなると思うので、以下のようなスクリプトにしておけば、日付/時間付きのフォルダを自動的に作成してバックアップ出来ます。

Get-GPOReport

GUI のグループポリシーの管理で HTML 形式で GPO の設定情報が取得できるけど、それがコマンドで取得可能。GUI の方だと全ての GPO の取得というメニューがなくて、GPO 1つずつ「右クリック」→「レポート保存」→ファイル名を指定して実行をひたすら繰り返すしかないという残念仕様なので、レポートの取得もスクリプト化しておくと便利。

 

ただ、PowerShell のコマンドも全部の GPO のレポート保存という機能はなく、以下のように GPO 名と保存する HTMLファイル名を指定する必要がある。

 

ということで、全ての GPO のレポートを取得するためには、以下のように Get-GPO コマンドと組み合わせてスクリプト化する必要がある。(HTMLファイル名に GPO 名を使ってるけど、GPO の仕様として Windows のファイル名として利用出来ない記号が利用可能で、その場合にはファイルの保存でエラーが出るので、そのような環境だと対象記号を削除するか違う文字に置換するなどの前処理が必要)

コマンドはワンライナーでも書けるけど、個人的にワンライナーってあまり好きじゃないので、こっちの書き方で。

Invoke-GPUpdate

これまで任意のタイミングでグループポリシーの更新をしたい時は、「gpupdate /force」コマンドを使ってきたけど、Windows Server 2012 から PowerShell にもコマンドレットが用意されています。

自身のグループポリシーを更新する場合。

 

別のコンピューターに対して更新を実行する場合。

 

VDI 環境とかで特定のプールとかに即時に適用したい場合。VDI 環境だとコンピューター名は先頭部分が固定+連番とかになっていると思うので、Get-ADComputer コマンドレットで、コンピューター名の先頭部分で抽出して適用させることも可能。