Active Directoryで未リンクのGPOSを見つけて削除する方法

組織が成長するにつれて、Active Directory(AD)環境とグループポリシー(GP)インフラストラクチャも成長します。グループポリシーオブジェクト(GPO)はすぐに手に負えなくなり、数十ものリンクされていないGPOが環境を混乱させることになります。それを改善しましょう。

このチュートリアルでは、グループポリシー管理コンソール(GPMC)とPowerShellの両方を使用して、リンクされていないGPOを見つける方法を学びます。

さあ、始めましょう!

前提条件

この記事は実際の例を使用したチュートリアルです。一緒に進める場合は、以下の準備が必要です:

リンクされていない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で、フォレスト:<フォレスト名 —> ドメイン —> <ドメイン名>に移動し、ドメイン名を右クリックして検索をクリックします。この操作により、グループポリシーオブジェクトの検索ダイアログボックスが表示されます。

Search option in GPMC console

3. 検索アイテムドロップダウンをクリックし、GPO-linksを選択します。この検索アイテムはOUにリンクされたGPOを検索します。条件ドロップダウンをExist Inに変更し、ドメインをあなたのドメインにします。

以下のスクリーンショットでは、これらの設定の組み合わせでhomelab.localドメインの少なくとも1つのOUにリンクされたすべてのGPOを検索します。

完了したら、追加をクリックして基準を追加します。それはすべての検索条件セクションに表示されます。

Adding search item in “Search for Group Policy Objects” window

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

using search option in “Search for Group Policy Objects” window

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

Search results for linked GPOs

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

このタスクは時間がかかるため、次のセクションでPowerShellを使用してこのタスクを実行する方法を見ていきます。

Comparing search results with all the Group Policy Objects

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

Displaying linked GPO

PowerShellを使用して未リンクのGPOを検索する

GPOの一部をスキャンすることはいくつかのGPOに対してはうまくいくかもしれませんが、数百または数千のGPOで数千のエンドポイントを管理している場合は、苦労することになります。その場合、このプロセスを自動化し、便利なPowerShellツールを構築する時が来ました。

お使いのローカルドメインに参加したWindows PCにRSATがインストールされていると仮定します:

1. Windows PowerShellコンソールを開きます。

2. GroupPolicyモジュールをインポートします。GroupPolicyモジュールはRSATに含まれており、既にシステムにインストールされているはずです。このモジュールには、PowerShellでGPOを扱うために必要なすべてのコマンドが含まれています。

Import-Module GroupPolicy

3. Get-GPO PowerShellコマンドレットをAllパラメータを使用して実行します。このコマンドレットはADにクエリを実行し、見つかったすべてのGPOを返します。

Get-GPO -All
Get-Gpo cmdlet output

4. ドメイン内のすべてのGPOをクエリできるようになったので、次にアンリンクされたGPOを特定する必要があります。そのためには、Get-GPOReportコマンドレットを実行します。このコマンドレットを使用すると、名前と出力タイプを指定することができます。

Get-GPOReport -Name SomeGPO -ReportType XML

手動で、上記の手順で見つかったGPO名を1つコピーして貼り付け、このコマンドを実行します。すると、このコマンドレットがGPOのすべての設定のXMLレポートを返します。特に、以下に示すように、LinksToというセクションに注目してください。このセクションには、リンクされているOUへのパスを表すSOMPath XMLノードが含まれています。

Sample output containing LinksTo section

Get-GPOReportコマンドレットは一度に1つのGPOのレポートしか取得できません。このコマンドレットはドメインからの検索結果のみを含み、ADサイトからの検索結果は含まれません。

5. Get-GPOですべてのGPOを見つけ、それらがリンクされているかどうかを発見するためのGet-GPOReportコマンドレットを組み合わせる方法を知っている今、次は、以下のPowerShellコマンドをコンソールにコピーして貼り付けることでそれらを組み合わせます。

以下のコマンドは、ドメイン内のすべてのGPOをクエリします(Get-GPO)それらの各GPOに対してXMLレポートを生成します(Get-GPOReport)、レポートに<LinksTo>文字列が含まれていないものだけを返します(Select-String

Get-GPO -All | Where-Object {
     $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch "<LinksTo>"
 }

チュートリアルの環境では、以下の例に示すようにUnlinkedGPO1およびUnlinkedGPO2はどのOUにもリンクされていません。

Listing out unlinked GPO in the domain

Unlinked GPO PowerShellツールの構築

学んだことをすべて組み合わせて、実際の世界で使用できるPowerShellスクリプトを作成しましょう。

1. 好きなコードエディタを開いて、以下のPowerShellスクリプトをコピー/貼り付けてください。スクリプトをRemove-UnlinkedGPO.ps1として保存します。このスクリプト:

  • 現在の日付でフォルダを作成し、リンクされていないGPOのレポートを保存します。
  • AD内のすべてのリンクされていないGPOを検索します。
  • 各リンクされていないGPOに対してHTMLレポートを作成し、ディスクに保存します。
  • すべてのリンクされていないGPOのリストを作成し、テキストファイルに追加します。
  • Remove-GPOコマンドレットを使用して確認ステップで各リンクされていないGPOを削除します。

GitHubからRemove-UnlinkedGPO.ps1スクリプトをダウンロードすることもできます

Import-Module GroupPolicy
 $Date = Get-Date -Format dd_MM_yyyy
 $BackupDir = "c:\GPOBackup\$Date"
## GPOレポートを保存するディレクトリを作成します
 if (-Not(Test-Path -Path $BackupDir))  {
   New-Item -ItemType Directory $BackupDir -Force
 }
# XML形式のgpoレポートタイプを持つすべてのGPOおよびxmlレポート内のセクションを検索します
# セクションのないGPOのみを考慮します
 Get-GPO -All | Where-Object { $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch "<LinksTo>" } | ForEach-Object {
   # GPO、HTMLレポートのバックアップ、GPOの詳細をテキストファイルに保存することはオプションです
   Backup-GPO -Name $_.DisplayName -Path $BackupDir
    # レポートを実行してHTMLレポートとしてディスクに保存します
   Get-GPOReport -Name $_.DisplayName -ReportType Html -Path "$BackupDir\$($_.DisplayName).html"
   # バックアップフォルダ内のUnlinkedGPOs.txtというテキストファイルを作成および追加します
   # Get-GPOが返す各GPOオブジェクトを含む
   $_ | Select-Object * | Out-File "$BackupDir\UnLinkedGPOs.txt" -Append
   # GPOを削除しますが、削除する前にプロンプトを表示します
   $_.Displayname | Remove-GPO -Confirm
 }

2. Remove-UnlinkedGPO.ps1スクリプトを実行します。

3. リンクされていないGPOが見つかった場合、スクリプトはそれを削除するように促します。このプロンプトは、Remove-GPO cmdletを使用してConfirmスイッチを介して発生します。その単一のGPOの削除を確認するには、はいをクリックし、それ以外の場合はすべてにはいをクリックして、追加の確認なしですべてのリンク解除されたGPOを削除します。

GPO deletion confirmation prompt

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

Displaying Backup Folder

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

GPO HTML report

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

UnlinkedGPOs.txt GPO listing

結論

これで、GPMCとPowerShellを使用してAD環境でリンク解除されたGPOをすべて見つける方法を知っているはずです。

どちらが好みですか? PowerShellスクリプトを改善する方法は考えられますか?

Source:
https://adamtheautomator.com/unlinked-gpo/