Wie man nicht verknüpfte GPOS in Active Directory findet (und entfernt)

Wenn eine Organisation wächst, wächst auch ihre Active Directory (AD)-Umgebung und ihre Group Policy (GP)-Infrastruktur. Gruppenrichtlinienobjekte (GPOs) können schnell außer Kontrolle geraten, und bevor Sie es wissen, haben Sie Dutzende von nicht verknüpften GPOs, die Ihre Umgebung überladen. Das wollen wir ändern.

In diesem Tutorial lernen Sie, wie Sie mit der Group Policy Management Console (GPMC) und PowerShell alle diese nicht verknüpften GPOs entdecken können.

Los geht’s!

Voraussetzungen

In diesem Artikel handelt es sich um ein Tutorial mit praktischen Beispielen. Wenn Sie mitmachen möchten, stellen Sie sicher, dass Sie folgendes haben:

Woher kommen nicht verknüpfte GPOs?

Wenn Sie eine GPO erstellen und alle Einstellungen definieren, die Sie auf Client-Computer anwenden möchten, tut diese GPO eigentlich nichts. Um tatsächlich Client-Computer zu beeinflussen, muss die GPO an eine AD-Organisationseinheit (OU) verknüpft werden.

Im Laufe der Zeit, wenn mehr Admins GPOs erstellen, diese nicht verknüpfen, GPOs von OUs trennen, beabsichtigen, sie zu entfernen, es aber nie tun, können ungenutzte GPOs einfach herumliegen. Besonders in großen Organisationen können nicht verknüpfte GPOs zu Hunderten werden, wenn sie nicht ordnungsgemäß gewartet werden.

Auffinden von nicht verknüpften GPOs in der GPMC

Sie können nicht verknüpfte GPOs auf zwei Arten finden: über die GPMC oder über PowerShell. Wenn Sie nur eine Handvoll nicht verknüpfter GPOs haben, ergibt es möglicherweise mehr Sinn, die GPMC zu verwenden, anstatt ein PowerShell-Skript zu erstellen.

Um nicht verknüpfte GPOs über die GPMC zu finden:

1. Öffnen Sie die GPMC, indem Sie zum Startmenü gehen und „Gruppenrichtlinienverwaltung“ eingeben. Wenn das GPMC-Programm angezeigt wird, öffnen Sie es.

2. Gehen Sie im GPMC zu Forest: <Ihr Forest-Name> —> Domains —> <Ihr Domänenname>, klicken Sie mit der rechten Maustaste auf den Domänennamen und wählen Sie Suchen. Diese Aktion öffnet das Dialogfeld Nach Gruppenrichtlinienobjekten suchen.

Search option in GPMC console

3. Klicken Sie auf das Dropdown-Menü Suchelement und wählen Sie die Option GPO-Verknüpfungen aus. Mit diesem Suchelement werden GPOs gesucht, die mit einer OU verknüpft sind. Ändern Sie das Dropdown-Menü Bedingung in Existiert in und die Domäne in Ihre Domäne.

In der untenstehenden Abbildung werden bei dieser Kombination von Einstellungen alle GPOs gesucht, die mindestens einer OU in der Domäne homelab.local zugeordnet sind.

Wenn Sie fertig sind, klicken Sie auf Hinzufügen, um das Kriterium hinzuzufügen. Es wird unter dem Abschnitt Alle Suchkriterien angezeigt.

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

4. Klicken Sie nun auf die Schaltfläche Suchen, um alle GPOs zu finden, die den Suchkriterien entsprechen.

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

5. Wie im untenstehenden Screenshot gezeigt, werden nur verknüpfte GPOs in den Suchergebnissen angezeigt.

Search results for linked GPOs

6. Um die nicht verknüpften GPOs zu finden, vergleichen Sie jetzt manuell alle GPOs mit den verknüpften GPOs, wie unten gezeigt. Auf dem Screenshot unten werden nur drei GPOs verknüpft. Wenn Sie unter dem Knoten Gruppenrichtlinienobjekte nachsehen, sehen Sie, dass zwei der GPOs nicht angezeigt werden (UnlinkedGPO1 und UnlinkedGPO2). Das bedeutet, sie sind nicht verknüpft.

Diese Aufgabe wird zeitaufwändig sein und deshalb werden Sie sehen, wie Sie diese Aufgabe im nächsten Abschnitt mithilfe von PowerShell ausführen können.

Comparing search results with all the Group Policy Objects

Verknüpfte GPOs werden einen Link haben, wenn sie einem AD-Objekt wie einer OU zugewiesen sind, wie unten gezeigt. Wenn Sie nur eine Handvoll GPOs haben, können Sie nach GPOs suchen, die einen Link haben, und nach denen, die keinen haben. GPOs, die keinen Link haben, sind nicht verknüpfte GPOs.

Displaying linked GPO

Das Auffinden nicht verknüpfter GPOs mit PowerShell

Durchsuchen der GPOs in der GPMC kann für einige GPOs funktionieren, aber Sie werden kämpfen, wenn Sie Hunderte oder Tausende von GPOs verwalten, die Tausende von Endpunkten steuern. In diesem Fall ist es Zeit, diesen Prozess zu automatisieren und ein praktisches PowerShell-Tool zu erstellen.

Vorausgesetzt, Sie befinden sich auf Ihrem lokalen domänengebundenen Windows-PC mit RSAT installiert:

1. Öffnen Sie eine Windows PowerShell-Konsole.

2. Importieren Sie das GroupPolicy-Modul. Das GroupPolicy-Modul wird mit RSAT geliefert und sollte bereits auf Ihrem System installiert sein. Dieses Modul enthält alle erforderlichen Befehle zum Arbeiten mit GPOs in PowerShell.

Import-Module GroupPolicy

3. Führen Sie das Get-GPO-PowerShell-Cmdlet mit dem All-Parameter aus. Dieses Cmdlet fragt AD ab und gibt alle gefundenen GPOs zurück.

Get-GPO -All
Get-Gpo cmdlet output

4. Jetzt, da Sie alle GPOs in der Domäne abfragen können, müssen Sie herausfinden, welche nicht verknüpft sind. Führen Sie dazu das Get-GPOReport-Cmdlet aus. Dieses Cmdlet ermöglicht es Ihnen, einen Namen und einen Typ des zurückzugebenden Ausgabewerts anzugeben.

Get-GPOReport -Name SomeGPO -ReportType XML

Kopieren und fügen Sie manuell einen der oben gefundenen GPO-Namen ein und führen Sie diesen Befehl aus. Sie werden sehen, dass das Cmdlet einen XML-Bericht über alle Einstellungen zurückgibt, die die GPOs hat. Beachten Sie insbesondere den Abschnitt namens LinksTo, wie unten gezeigt. Dieser Abschnitt enthält den XML-Knoten SOMPath, der den Pfad zum verknüpften OU darstellt.

Sample output containing LinksTo section

Das Get-GPOReport-Cmdlet kann nur einen Bericht für eine einzelne GPO auf einmal abrufen. Dieses Cmdlet enthält nur Suchergebnisse aus Domänen und nicht aus AD-Standorten.

5. Jetzt, da Sie wissen, wie Sie alle GPOs mit Get-GPO finden und das Cmdlet, um herauszufinden, wozu sie verknüpft sind (Get-GPOReport), kombinieren Sie sie, indem Sie den PowerShell-Befehl unten in Ihre Konsole kopieren und einfügen.

Der Befehl unten fragt alle GPOs in der Domäne ab (Get-GPO) und generiert dann für jede von ihnen einen XML-Bericht (Get-GPOReport), wobei nur diejenigen zurückgegeben werden, die keinen <LinksTo>-String im Bericht haben (Select-String).

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

In der Umgebung des Tutorials können Sie im folgenden Beispiel sehen, dass UnlinkedGPO1 und UnlinkedGPO2 mit keinem OU verknüpft sind.

Listing out unlinked GPO in the domain

Erstellen eines PowerShell-Tools für nicht verknüpfte GPOs

Lassen Sie uns jetzt alles, was Sie gelernt haben, zusammenfügen und ein PowerShell-Skript erstellen, das Sie in der realen Welt verwenden könnten.

1. Öffnen Sie Ihren bevorzugten Code-Editor und kopieren Sie den folgenden PowerShell-Befehl hinein. Speichern Sie das Skript als Remove-UnlinkedGPO.ps1. Dieses Skript:

  • Erstellt einen Ordner mit dem aktuellen Datum, um nicht verknüpfte GPO-Berichte zu speichern.
  • Findet alle nicht verknüpften GPOs in AD.
  • Erstellt einen HTML-Bericht für jede nicht verknüpfte GPO und speichert ihn auf der Festplatte.
  • Erstellt und fügt einer Textdatei eine Liste aller nicht verknüpften GPOs hinzu.
  • Entfernt jede nicht verknüpfte GPO mit einem Bestätigungsschritt unter Verwendung des Remove-GPO-Cmdlets.

Sie können auch das Skript Remove-UnlinkedGPO.ps1 über GitHub herunterladen.

Import-Module GroupPolicy
 $Date = Get-Date -Format dd_MM_yyyy
 $BackupDir = "c:\GPOBackup\$Date"
## Erstellt ein Verzeichnis zum Speichern der GPO-Berichte
 if (-Not(Test-Path -Path $BackupDir))  {
   New-Item -ItemType Directory $BackupDir -Force
 }
# Ruft alle GPOs mit dem GPO-Berichtstyp XML ab und sucht auch nach dem Abschnitt im XML-Bericht.
# Berücksichtigt nur die GPOs, die keinen Abschnitt haben.
 Get-GPO -All | Where-Object { $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch "<LinksTo>" } | ForEach-Object {
   # Das Sichern der GPO, das HTML-Bericht und das Speichern der GPO-Details in einer Textdatei sind optional.
   Backup-GPO -Name $_.DisplayName -Path $BackupDir
    # Führt den Bericht aus und speichert ihn als HTML-Bericht auf der Festplatte
   Get-GPOReport -Name $_.DisplayName -ReportType Html -Path "$BackupDir\$($_.DisplayName).html"
   # Erstellt und fügt eine Textdatei namens UnlinkedGPOs.txt im Sicherungsordner an, die
   # jedes GPO-Objekt enthält, das Get-GPO zurückgibt
   $_ | Select-Object * | Out-File "$BackupDir\UnLinkedGPOs.txt" -Append
   # Entfernt die GPO, aber fordert zuerst zur Bestätigung auf
   $_.Displayname | Remove-GPO -Confirm
 }

2. Führen Sie das Skript Remove-UnlinkedGPO.ps1 aus.

3. Wenn eine nicht verknüpfte Gruppenrichtlinie gefunden wird, wird das Skript Sie auffordern, sie zu entfernen. Diese Aufforderung stammt vom Remove-GPO-Cmdlet, das den Confirm-Schalter verwendet. Um die Entfernung dieser einzelnen Gruppenrichtlinie zu bestätigen, klicken Sie auf Ja, andernfalls klicken Sie auf Ja, alle entfernen, um alle nicht verknüpften Gruppenrichtlinien ohne weitere Bestätigung zu entfernen.

GPO deletion confirmation prompt

Nach Abschluss des Skripts, wenn mindestens eine nicht verknüpfte Gruppenrichtlinie gefunden wurde, sollten Sie im C:\GPOBackup\<Datum>-Ordner den Inhalt der Gruppenrichtlinien als GUID-Ordner zusammen mit den HTML-Berichten und der Datei UnlinkedGPOs.txt sehen.

Displaying Backup Folder

4. Öffnen Sie nun einen der GPO-HTML-Berichte mit einem Webbrowser. Sie können unten sehen, dass der Bericht alle in dieser Gruppenrichtlinie definierten Einstellungen enthält. Im folgenden Beispiel enthält die Gruppenrichtlinie UnlinkedGPO1 Einstellungen für die Ausführungsrichtlinie von PowerShell.

GPO HTML report

5. Öffnen Sie schließlich die Datei UnlinkedGPOs.txt. Sie sehen unten, dass sie die gleiche Ausgabe wie das Get-GPO-Cmdlet enthält.

UnlinkedGPOs.txt GPO listing

Fazit

Sie sollten nun wissen, wie Sie alle diese nicht verknüpften Gruppenrichtlinien in Ihrer AD-Umgebung mithilfe des GPMC und PowerShell finden können.

Welchen Weg bevorzugen Sie? Können Sie eine Möglichkeit zur Verbesserung des abgedeckten PowerShell-Skripts vorschlagen?

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