組織が成長するにつれて、Active Directory(AD)環境とグループポリシー(GP)インフラストラクチャも成長します。グループポリシーオブジェクト(GPO)はすぐに手に負えなくなり、数十ものリンクされていないGPOが環境を混乱させることになります。それを改善しましょう。
このチュートリアルでは、グループポリシー管理コンソール(GPMC)とPowerShellの両方を使用して、リンクされていないGPOを見つける方法を学びます。
さあ、始めましょう!
前提条件
この記事は実際の例を使用したチュートリアルです。一緒に進める場合は、以下の準備が必要です:
- Active Directoryドメイン。この記事では、HomeLab.Localというドメインを使用します。
- A Windows computer joined to the AD domain. This tutorial will use Windows 10.
- Windowsコンピュータには、リモートサーバー管理ツール(RSAT)パッケージがインストールされている必要があります。
リンクされていないGPOはどこから来るのでしょうか?
GPOとすべての設定が定義されたとき、クライアントコンピュータに適用するためには、実際にはGPOをADの組織単位(OU)にリンクする必要があります。
時間が経つにつれて、さらに多くの管理者がGPOを作成し、リンクを忘れ、OUからGPOをリンク解除し、削除するつもりであっても実際には削除しない場合、何もしないで放置されるGPOが増える可能性があります。特に大規模な組織では、リンクされていないGPOは適切にメンテナンスされない場合、数百にまで増える可能性があります。
GPMCでリンクされていないGPOを見つける
GPMCまたはPowerShellを使用して、次の2つの方法でリンクされていないGPOを見つけることができます。リンクされていないGPOがわずかしかない場合は、PowerShellスクリプトを作成する代わりにGPMCを使用する方が合理的かもしれません。
GPMCを使用してリンクされていないGPOを見つけるには:
1. スタートメニューで「グループポリシー管理」と入力して、GPMCを開きます。
2. GPMCで、フォレスト:<フォレスト名 —> ドメイン —> <ドメイン名>に移動し、ドメイン名を右クリックして検索をクリックします。この操作により、グループポリシーオブジェクトの検索ダイアログボックスが表示されます。

3. 検索アイテムドロップダウンをクリックし、GPO-linksを選択します。この検索アイテムはOUにリンクされたGPOを検索します。条件ドロップダウンをExist Inに変更し、ドメインをあなたのドメインにします。
以下のスクリーンショットでは、これらの設定の組み合わせでhomelab.localドメインの少なくとも1つのOUにリンクされたすべてのGPOを検索します。
完了したら、追加をクリックして基準を追加します。それはすべての検索条件セクションに表示されます。

4. 今度は、検索ボタンをクリックして、検索条件に一致するすべてのGPOを見つけます。

5. 下のスクリーンショットに示すように、検索結果にはリンクされたGPOのみが表示されます。

6. リンクされていないGPOを見つけるには、以下に示すようにすべてのGPOを手動で比較します。下のスクリーンショットでは、リンクされたGPOは3つしか表示されません。Group Policy Objectsノードの下を見ると、2つのGPO(UnlinkedGPO1およびUnlinkedGPO2)が表示されないことがわかります。つまり、それらはリンクされていません。
このタスクは時間がかかるため、次のセクションでPowerShellを使用してこのタスクを実行する方法を見ていきます。

リンクされたGPOは、OUなどのADオブジェクトに割り当てられたときにリンクが表示されます。GPOが少数しかない場合は、リンクがあるかどうかを確認し、リンクがないものを見つけることができます。リンクがないGPOは未リンクのGPOです。

PowerShellを使用して未リンクのGPOを検索する
GPOの一部をスキャンすることはいくつかのGPOに対してはうまくいくかもしれませんが、数百または数千のGPOで数千のエンドポイントを管理している場合は、苦労することになります。その場合、このプロセスを自動化し、便利なPowerShellツールを構築する時が来ました。
お使いのローカルドメインに参加したWindows PCにRSATがインストールされていると仮定します:
1. Windows PowerShellコンソールを開きます。
2. GroupPolicyモジュールをインポートします。GroupPolicyモジュールはRSATに含まれており、既にシステムにインストールされているはずです。このモジュールには、PowerShellでGPOを扱うために必要なすべてのコマンドが含まれています。
3. Get-GPO
PowerShellコマンドレットをAll
パラメータを使用して実行します。このコマンドレットはADにクエリを実行し、見つかったすべてのGPOを返します。

4. ドメイン内のすべてのGPOをクエリできるようになったので、次にアンリンクされたGPOを特定する必要があります。そのためには、Get-GPOReport
コマンドレットを実行します。このコマンドレットを使用すると、名前と出力タイプを指定することができます。
手動で、上記の手順で見つかったGPO名を1つコピーして貼り付け、このコマンドを実行します。すると、このコマンドレットがGPOのすべての設定のXMLレポートを返します。特に、以下に示すように、LinksTo
というセクションに注目してください。このセクションには、リンクされているOUへのパスを表すSOMPath
XMLノードが含まれています。

Get-GPOReportコマンドレットは一度に1つのGPOのレポートしか取得できません。このコマンドレットはドメインからの検索結果のみを含み、ADサイトからの検索結果は含まれません。
5. Get-GPO
ですべてのGPOを見つけ、それらがリンクされているかどうかを発見するためのGet-GPOReport
コマンドレットを組み合わせる方法を知っている今、次は、以下のPowerShellコマンドをコンソールにコピーして貼り付けることでそれらを組み合わせます。
以下のコマンドは、ドメイン内のすべてのGPOをクエリします(Get-GPO
)それらの各GPOに対してXMLレポートを生成します(Get-GPOReport
)、レポートに<LinksTo>
文字列が含まれていないものだけを返します(Select-String
)
チュートリアルの環境では、以下の例に示すようにUnlinkedGPO1およびUnlinkedGPO2はどのOUにもリンクされていません。

Unlinked GPO PowerShellツールの構築
学んだことをすべて組み合わせて、実際の世界で使用できるPowerShellスクリプトを作成しましょう。
1. 好きなコードエディタを開いて、以下のPowerShellスクリプトをコピー/貼り付けてください。スクリプトをRemove-UnlinkedGPO.ps1として保存します。このスクリプト:
- 現在の日付でフォルダを作成し、リンクされていないGPOのレポートを保存します。
- AD内のすべてのリンクされていないGPOを検索します。
- 各リンクされていないGPOに対してHTMLレポートを作成し、ディスクに保存します。
- すべてのリンクされていないGPOのリストを作成し、テキストファイルに追加します。
Remove-GPO
コマンドレットを使用して確認ステップで各リンクされていないGPOを削除します。
GitHubからRemove-UnlinkedGPO.ps1スクリプトをダウンロードすることもできます。
2. Remove-UnlinkedGPO.ps1スクリプトを実行します。
3. リンクされていないGPOが見つかった場合、スクリプトはそれを削除するように促します。このプロンプトは、Remove-GPO
cmdletを使用してConfirm
スイッチを介して発生します。その単一のGPOの削除を確認するには、はいをクリックし、それ以外の場合はすべてにはいをクリックして、追加の確認なしですべてのリンク解除されたGPOを削除します。

スクリプトが完了し、少なくとも1つのリンク解除されたGPOが見つかった場合、C:\GPOBackup\<date>フォルダにはGUIDフォルダとHTMLレポート、UnlinkedGPOs.txtファイルが含まれているはずです。

4. これで、WebブラウザでGPO HTMLレポートの1つを開きます。以下の例では、UnlinkedGPO1 GPOにはPowerShell実行ポリシーの設定が含まれています。

5. 最後に、UnlinkedGPOs.txtファイルを開きます。以下では、それがGet-GPO
cmdletから受け取った出力と同じであることがわかります。

結論
これで、GPMCとPowerShellを使用してAD環境でリンク解除されたGPOをすべて見つける方法を知っているはずです。
どちらが好みですか? PowerShellスクリプトを改善する方法は考えられますか?