Netwrix 1Secureは、データとアイデンティティ全体にわたる統合された可視性を提供します。14日間の無料トライアルでフルアクセス可能です。無料トライアルを開始

リソースセンターブログ

グループ ポリシー オブジェクト(GPO)のバックアップと復元方法

グループ ポリシー オブジェクト(GPO)のバックアップと復元方法

Dec 18, 2024

グループ ポリシー オブジェクトは、Windows Server のインフラストラクチャを管理するうえで重要です。深刻なサービスの問題を避けるために、管理者は GPO を慎重に構成し、変更の前にバックアップしておき、必要に応じて変更内容をすばやく元に戻せるようにしておく必要があります。

Group Policy Refresher

グループ ポリシー オブジェクトのバックアップと復元に入る前に、GPO がどのように作成され、どのように使用されるのかについて、重要な詳細をいくつか確認しましょう。

GPO の構成要素

新しいグループ ポリシー オブジェクトを作成すると、GUID と呼ばれる一意の識別子が割り当てられます。各 GPO には次の 2 つの部分があります。

  • グループ ポリシー テンプレート(GPT) — GPT は、SYSVOL のファイル共有内にある一連のフォルダーで構成されます(「C:\WindowsSYSVOLdomainPolicies{GUID}」)。これらのフォルダーは、テンプレート、設定、スクリプト、MSI パッケージに関する詳細情報など、グループ ポリシー オブジェクトの内容の大部分を格納するために使用されます。GPT は、Windows のバージョンに応じて、ファイル レプリケーション サービス(FRS)または分散ファイル システム レプリケーション(DFSR)によって、そのドメイン内のすべての DC に複製されます。実際には、SYSVOL はドメイン内でのみ複製されるため、GPO は実質的にドメイン固有のものになります。
Restore GPO 1

  • グループ ポリシー コンテナー(GPC) — GPC は、CN=System,CN=Policies の下にあるドメイン名付けコンテキスト(domain naming context)内に配置された groupPolicyContainer オブジェクトです。この AD オブジェクトの属性は、GPO に関連する参照情報を格納するために使用されます。特に、gPCFileSysPath 属性が含まれており、これは SYSVOL 内の GPO の GPT へのパスを含みます。GPT とは異なり、GPC は構成されたレプリケーション コスト、スケジュール、および間隔に従って Active Directory Domain サービスによってレプリケートされます。
Restore GPO 2

GPO の関連付け

GPO を作成すると、それを 1 つ以上の Active Directory オブジェクト(組織単位[OU]、ドメイン、サイト)に関連付けできます。この関連付けは GPO によって維持されるのではなく、関連付けられた各 AD オブジェクトが gPLink 属性で維持します。オブジェクトの gPLink 属性の値は、そのオブジェクトが関連付けられている各 GPO の GPC パスの一覧です。GPO のオブジェクトへの関連付けが作成または削除されるときは、影響を受けるオブジェクトの gPLink 属性の値のみが変更されます。

重要な補足として、SYSVOL の複製によって GPO は実質的にドメイン固有になる一方で、GPO をサイト オブジェクトにリンクできるため、GPO 関連情報が必ずしもドメイン内に限定されるとは限りません。サイト オブジェクトは Active Directory の構成パーティションに保存され、このパーティションはフォレスト内のすべてのドメイン コントローラーに複製されます。その結果、gPLink 属性に含まれるグループ ポリシー オブジェクトの GPC へのパスが、Active Directory の複製の間にドメインの外へ「はみ出す」ことになります。

グループ ポリシーの処理順序

Active Directory は次の順序で GPO を適用します。

  1. ローカル GPO
  2. サイトにリンクされた GPO
  3. ドメインにリンクされた GPO
  4. OU にリンクされた GPO(ルートから処理されるため、ネストされた OU にリンクされた GPO は、その親 OU にリンクされた GPO よりも優先されます)

最後に適用されたポリシーが「勝ち」(「Enforce」オプションを使用する場合を除く。これにより、後から適用されるポリシーによってポリシーが上書きされるのを防止します)。

Restore GPO 3

ユーザーおよびコンピューターの構成

最後にもう1つ注意点があります。GPO には「コンピューターの構成」と「ユーザーの構成」の両方が含まれています。これらのサブグループには、ほぼ同一のポリシー設定のセットが含まれていますが、GPO の設定が適用されるタイミングが異なります。

コンピューターの構成の設定は起動中にコンピューターへ適用され、ユーザーの構成の設定はログオン中に適用されます。つまり、コンピューターの構成のオプションは関連するコンピューターに対して常に強制的に適用されますが、ユーザーの構成のオプションは関連するユーザー アカウントがコンピューターにログオンした場合にのみ強制的に適用されます。

ユーザーがコンピューターにログオンし、コンピューターの構成の設定とユーザーの構成の設定の間で競合が発生した場合、コンピューターの構成の設定が常に優先されます。

PowerShell を使用した GPO のバックアップと復元の手順

これらの重要な概念を十分に理解したうえで、GPO のバックアップと復元に進みます。

まず、Microsoft の Windows リモート サーバー管理ツールに含まれている、関連する 2 つの Group Policy PowerShell コマンドレットから始めます:

  • Backup-GPO — このコマンドレットを使うと、ドメイン内のすべての Group Policy オブジェクト、または 1 つの指定した GPO のスナップショットを非常に簡単に取得できます。
  • Restore-GPO — このコマンドレットを使うと、Backup-GPO コマンドレットによって作成されたバックアップでキャプチャされた状態に、Group Policy オブジェクトを復元できます。

すべての GPO のバックアップを作成する

以下の PowerShell スクリプトでは、Backup-GPO cmdlet の -All パラメーターを使用して、指定した DC を使い、指定したドメイン内のすべての GPO のバックアップを作成します:

      $BackupPath = '\HOSTNAMEGPOBackup'
$Domain = 'domain.local'
$DomainController = 'DC.domain.local'

$BackupFolder = New-Item -Path $BackupPath -Name (Get-Date -format yyyyMMddTHHmmss) -ItemType Directory
Backup-GPO -All -Domain $Domain -Server $DomainController -Path $BackupFolder
      

Backup-GPO cmdlet の出力は、各 GPO のバックアップ情報ごとに別々のサブフォルダーと、各サブフォルダーをそれぞれの GPO に関連付けるために必要な情報を含む manifest.xml ファイルで構成されます:

Restore GPO 4

サブフォルダーの1つの中を見てみると、各バックアップはフォルダーと3つの XML ファイルで構成されていることが分かります:

Restore GPO 5

フォルダーにはグループ ポリシー オブジェクトの GPT のコピーが含まれ、XML ファイルには、グループ ポリシーの GPC からのデータ、バックアップの実行に固有の情報、および GPO の内容を説明するレポートが含まれます。

Netwrix Identity Recovery

単一のスナップショットで AD と Group Policy オブジェクトをバックアップおよび復元

バックアップのバージョン管理

グループ ポリシー オブジェクトを 1 つの場所に繰り返しバックアップすることはサポートされていますが、このスクリプトの実行のたびに、出力用の一意なサブフォルダーが作成されます。サブフォルダー名は、cmdlet の実行中に生成されるバックアップ固有の GUID を使用して付けられるため、同一の場所への反復バックアップでの名前の衝突がほぼ起きません。

各実行の出力を一意なフォルダーに分離することは厳密には必須ではありませんが、Restore-GPO コマンドレットの動作により、そうすることでメリットが生まれます。Restore-GPO コマンドレットでは、すべての GPO を一度に復元できますが、manifest.xml で識別されている各グループ ポリシー オブジェクトの最新のバックアップを使用します。各バックアップ セットをそれぞれ独自のフォルダーに分けることで、各バックアップ セットに独自の manifest.xml が割り当てられることを保証できます。これにより、これらのバックアップ セットのいずれかに含まれるすべての GPO を 1 回の操作で復元できます。

Backup-GPO コマンドレットの -All パラメーターを使用することのデメリットは、変更されたものだけでなく、実行のたびにドメイン内のすべてのグループ ポリシー オブジェクトをバックアップしてしまう点です。この問題を回避する方法の1つは、以下のようなスクリプトを使用することです。スクリプトは、更新フォルダー(update folder)内にスクリプトが作成するファイルを Backup-GPO コマンドレットに使わせることで、スクリプトの最終実行時刻のタイムスタンプを保持します。ファイルが存在する場合、スクリプトはファイル内のタイムスタンプ以降に変更されたドメインの GPO をすべてバックアップします。ファイルが存在しない場合、スクリプトはファイルを作成し、タイムスタンプを設定して、ドメイン内のすべての GPO をバックアップします。

      $BackupPath = '\DCGPOBackup'
$Domain = 'domain.local'
$DomainController = 'DC.domain.local'

$BackupPathTracker = "$BackupPathLastBackup.txt"

if((Test-Path "$BackupPathTracker")) {
    $LastBackup = Get-Date (Get-Content -Path "$BackupPathTracker")
    Set-Content -Path "$BackupPathTracker" -Value (Get-Date)
    $GPOs = Get-GPO -All -Domain $Domain -Server $DomainController
    $GPOs | Where-Object { $_.ModificationTime -gt $LastBackup } | ForEach-Object {
        Backup-GPO -Guid $_.Id -Domain $Domain -Server $DomainController -Path $BackupPath
    }
} else {
    Set-Content -Path "$BackupPathTracker" -Value (Get-Date)
    Backup-GPO -All -Domain $Domain -Server $DomainController -Path $BackupPath
}
      

この方法では、不必要なバックアップを制限することで容量を節約できますが、実際に作成されたバックアップがすべて同じフォルダーに格納されるため、グループ ポリシー オブジェクトを特定の時点に復元することが難しくなります。

この2つのスクリプトそれぞれで採用しているアプローチを組み合わせれば、私たちのすべての問題が解決するはずですよね?

      BackupPath = '\HOSTNAMEGPOBackup'
$Domain = 'domain.local'
$DomainController = 'DC.domain.local'

$BackupPathTracker = "$BackupPathLastBackup.txt"
$BackupFolder = New-Item -Path $BackupPath -Name (Get-Date -format yyyyMMddTHHmmss) -ItemType Directory

if((Test-Path "$BackupPathTracker")) {
    $LastBackup = Get-Content -Path "$BackupPathTracker"
    Set-Content -Path "$BackupPathTracker" -Value (Get-Date)
    $GPOs = Get-GPO -All -Domain $Domain -Server $DomainController
    $GPOs | Where-Object { $_.ModificationTime -gt $LastBackup } | ForEach-Object {
        Backup-GPO -Guid $_.Id -Domain $Domain -Server $DomainController -Path $BackupFolder
    }
}
else {
    Set-Content -Path "$BackupPathTracker" -Value (Get-Date)
    Backup-GPO -All -Domain $Domain -Server $DomainController -Path $BackupFolder
}
      

実際には、各差分バックアップの結果をそれぞれ独自のフォルダーに分離してしまうと、かえってすべてが大幅に悪化します。このアプローチでは、各 manifest.xml ファイルもそれぞれ独自のフォルダーに隔離されるため、結果として、すべての GPO を一度に復元できる能力が実質的に失われるだけでなく、特定の Group Policy オブジェクトに関連するバックアップを見つけることも信じられないほど困難になります。

バックアップから GPO を復元する

実際には、これらのアプローチは Restore-GPO cmdlet の制限に突き当たります。Restore-GPO は、manifest.xml ファイルで参照されている最新のバックアップ、または指定されたバックアップから、特定の Group Policy オブジェクトを復元できます。 ただし、ドメイン内のすべての GPO を一度に復元することは、指定された manifest.xml ファイル内の最新バックアップを使用する場合に限られます。

      # Restore a single GPO from its most recent backup
Restore-GPO -Name 'GpoName' -Path '\HOSTNAMEGPOBackup' -Domain 'domain.local' -Server 'DC.domain.local'

# Restore a single GPO from a specific backup
Restore-GPO -BackupId 12345678-09ab-cdef-1234-567890abcdef -Path '\HOSTNAMEGPOBackup' -Domain 'domain.local' -Server 'DC.domain.local'

# Restore all of a domain’s GPOs from their most recent backup
Restore-GPO -All -Path '\HOSTNAMEGPOBackup' -Domain 'domain.local' -Server 'DC.domain.local'
      

バックアップから Group Policy オブジェクトを復元すると、復元プロセスの一環として GPO のバージョンがインクリメントされます。これにより、レプリケーションが復元された GPO のコピーを優先するよう強制します。

Restore GPO 6

バージョン番号が同期しなくなる仕組み

Restore-GPO コマンドレットの出力には、2種類のバージョン番号が含まれます。1つはコンピューター構成、もう1つはユーザー構成です。

GPT と GPC はそれぞれ独自のバージョン番号を維持する責任を持ち、個別の UserVersion と ComputerVersion の値は、それぞれユーザー構成のバージョン番号およびコンピューター構成のバージョン番号から計算されます。これは、バージョン番号がインクリメントされる方法によって可能です。GPO のコンピューター構成が変更されると 1 増加し、ユーザー構成が変更されるたびに 65536 増加します。

以上のすべてが必要なのは、前述したとおり、グループ ポリシー オブジェクトの GPT と GPC が異なるサービスによってそれぞれ別個にレプリケートされるためです。その結果、特定のドメイン コントローラー上での GPO の GPT と GPC のバージョン番号が同期していない状態になる可能性があり、その場合は処理されなくなります。

削除された GPO を復元する

Restore-GPO cmdlet には、ドキュメントで明示されている制限があります。削除された Group Policy オブジェクトの復元には使用できません。これは、Active Directory 内で GPO の GPC 部分を見つけられないためです。削除済みの GPO を復元しようとすると、次のようなエラーが発生します:

Restore GPO 7

ただし、まず GPC を復元できる場合は、Restore-GPO を使用して削除された GPO を復元できます。そのために、Restore-ADObject cmdlet を使って、GPO の Active Directory 側の要素を次の Active Directory Recycle Bin から完全に復元し、その後で Restore-GPO cmdlet が GPO を復元できるようにします:

Restore GPO 8

このプロセスによって削除された GPO を復元することはできますが、GPO が削除される前に存在していた gPLink の値は復元できません。これらの値は、リンクされているオブジェクト(linked objects)のみに存在していたためです。この制限を安全に回避する唯一の方法は、gPLink の値を含む Active Directory の外部バックアップを活用することです。

GPMC と AGPM を使用した GPO のバックアップと復元

Group Policy PowerShell cmdlet だけが、GPO のバックアップと復元の選択肢ではありません。Microsoft も Group Policy Management コンソール(GPMC)を提供しています。これは、Group Policy オブジェクトのバックアップと復元に使用できる MMC スナップインです。Backup-GPO cmdlet と同様に、単一の指定した GPO か、ドメイン内のすべての GPO をバックアップできます。Restore-GPO cmdlet とは異なり、1 回につき 1 つの GPO のみ復元できます。

GPMC には、バックアップから削除された GPO を復元する方法がありますが、実際には削除された GPO をそのまま復旧するわけではありません。新しい GPO を作成し、バックアップに含まれる情報を使ってその内容を設定するだけです。

GPMC のもう一つの利点は、GPO バックアップの内容をより把握しやすくなることです。ただし、バックアップ内の設定を、現在のライブ GPO の設定と比較するのは依然として難しいです。

Microsoft Desktop Optimization Pack の一部として利用できる Microsoft の Advanced Group Policy Management (AGPM) ツールは、バージョン管理機能によって GPMC を拡張し、バックアップの内容を確認して理解するのに役立ちます。ただし、AGPM のメリットは、主に次の 2 つの要因によって相殺されがちです。1 つは、あまりよくメンテナンスされていないように見えること、もう 1 つは、他のものとうまく連携しないことで評判があることです(たとえば、AGPM で管理されている GPO を AGPM の外で変更すると、AGPM データベースが破損する可能性があります)。とはいえ、必ずしも悪いツールというわけではありません。私は、運用環境に導入しようとする前に、ラボ環境でかなりいろいろ試してみることをおすすめします。

Netwrix はどのように役立ちますか?

Netwrix Identity Recovery は統一された Web インターフェイスを提供し、Active Directory オブジェクトとグループ ポリシー(Group Policy)オブジェクトを 1 つのスナップショットでバックアップできるほか、バックアップの検索・管理、ライブ オブジェクトへの属性変更のロールバック、さらに削除された GPO とそれに関連する gPLinks の復元まで可能にします。

Active Directory の監査とレポート

専門家のインサイトで、Active Directory のセキュリティを効率化

詳しくはこちら

よくある質問(FAQ)

バックアップから GPO を復元するには、どのコマンドを使えますか?

Windows PowerShell の cmdlet Restore-GPO は、単一の GPO またはすべての GPO を元のドメインに復元します。

ファイルから GPO をインポートするにはどうすればよいですか?

Advanced Group Policy Management (AGPM) で管理者として必要な権限を持ち、GPO を CAB ファイルにエクスポートしている場合は、提供されている手順に従って、GPO 設定を新しい GPO または既存の GPO にインポートできます こちら

共有する

もっと詳しく

著者について

Asset Not Found

Joe Dibley

セキュリティリサーチャー

Netwrix のセキュリティリサーチャーであり、Netwrix Security Research Team のメンバーです。Joe は Active Directory、Windows、およびさまざまなエンタープライズソフトウェアのプラットフォームとテクノロジーの専門家であり、新たなセキュリティリスク、複雑な攻撃手法、そしてそれに関連する緩和策と検知について研究しています。