Export und Import GPO mit PowerShell

PowerShell

Und wieder ein neuer Artikel mit PowerShell.

Diesmal war der Anlasse mir die unzähligen Domain Migration zu erleichtern. Ich war die letzten 2 Jahre sehr oft unterwegs und durfte mit verschiedenen Kunden Domainmigrationen planen und umsetzen, daraus entstand folgendes Script.

Dieses PowerShell Script hat 2 Funktionen, Import und Export.

Der Export speichert jedes GPO Element in ein eigenes Verzeichnis. Der Import importiert jedes GPO Element aus dem Export Ordner und kann optional noch einen Pre- oder Post Name hinzufügen.

Das Script

Das Script besteht aus mehreren Teilen die ich hier durchgehen, zum Schluss findet ihr einen Download zum Script.

Zu Beginn definieren die die Parameter, mit dem unser Script ausgeführt wird. Unser Schalter heißt “Mode” und bieten die Optionen Import und Export.

Mit “Mandatory=$True” muss dieser Schalter angegeben werden

Param(
[Parameter(Mandatory=$True)]
[ValidateSet(“Export”, “Import”)]
[string]$Mode #Possible Modes: Export, Import
)

Danach importieren wir unser PowerShell Module und setzen ein paar Variablen.

“$ExportFolder” und “$ImportFolder” definiere die beiden Ordner mit den wir arbeiten wollen.

“PreName” und “PostName” definieren Werte die beim Import vor oder nach dem GPO Namen hinzugefügt werden.

import-module grouppolicy
$ExportFolder=”c:\_GPO\”
$Importfolder=”c:\_GPO\”
$PreName=””
$PostName=””

Die Export Funktion lädt alle GPO’s in die Variable “$GPO” und erstellt danach im Export Ordner einen Unterordner mit dem Namen der GPO und macht danach den Export der GPO in diesen Ordner

function Export-GPOs {
$GPO=Get-GPO –All
foreach ($Entry in $GPO) {
$Path=$ExportFolder+$entry.Displayname
New-Item -ItemType directory -Path $Path
Backup-GPO -Guid $Entry.id -Path $Path
}
}

Die Import Funktion liest alle Unterordner aus dem Import Ordner, erstellt den Namen aus “$PreName + Ordnername + $PostName”, erstellt danach eine leer GPO mit dem gerade generierten Namen.

Danach wir ein Import der GPO gemacht und somit die soeben erstellt GPO befüllt.

function Import-GPOs {
$Folder=Get-childItem -Path $Importfolder -Exclude *.ps1
foreach ($Entry in $Folder) {
$Name=$PreName+$Entry.Name+$postname
$Path=$Importfolder+$entry.Name
$ID=Get-ChildItem -Path $Path
New-GPO -Name $Name
Import-GPO -TargetName $Name -Path $Path -BackupId $ID.Name
}

Zum Schluss wir mittels eines Switch-Befehls der Input der Variable $Mode ausgelesen und die richtige Funktion gestartet

switch ($Mode){
{$_ -eq “Export”}
{Export-GPOs
break}
{$_ -eq “Import”}
{Import-GPOs
break}
}

Der Aufruf

Nachdem ihr die “$Exportfolder” und “$Importfolder” Variable angepasst habt, könnt ihr das Script wie folgt aufrufen.

Master.ps1 –Mode Export

oder

Master.ps1 –Mode Import

Je nach Aufruf passiert dann folgendes

Der Export

Aufruf wie oben beschrieben starten und schon werden alle GPO’s exportiert, hier ein Screenshot wie das Ergebnis aussieht

image

Wie ihr sehen könnt, wird pro GPO ein Ordner erstellt und hier die GPO exportiert. Im PowerShell Fenster könnt ihr den Export verfolgen.

Danach eventuell nicht benötigte GPO Ordner aus dem Export löschen, alle Daten auf den Ziel DC kopieren und dort den Import starten.

Der Import

Aufruf wie oben beschrieben starten, wir haben uns noch dazu entschieden die Variable $PreName mit dem Wert “NewDomain_” zu befüllen.

Ich habe mich zusätzlich dazu entschieden,nur 2 GPO#s zu importieren, dazu einfach alle nicht benötigten Ordner gelöscht.

So sieht das Ergebnis aus

image

Find the Script on GitHub: GitHub – Seidlm/Active-Directory

Solltet ihr Fragen, Wünsche oder Probleme mit dem Script haben, schreibt mir ein Kommentar

Alle meine TechNet Gallery Downloads findet ihr hier: 1jrYQoA

BITTE BEWERTET MEINE DOWNLOADS IN DER TECHNET GALLERY UND SAGT MIR WAS IHR EUCH VON DER NÄCHSTEN VERSION WÜNSCHT.

Michael Seidl aka Techguy

23 thoughts on “Export und Import GPO mit PowerShell”

  1. Pashalis Batgidis

    Hallo Herr Seidl,

    vielen Dank für das Skript. Die Gruppenrichtlinien wurden exportiert und importiert das hat soweit geklappt. Nun habe ich das Problem das bei bestimmten GPOs Benutzer angegeben werden welche auf die andere Domäne hinweisen. Das bedeutet in der Importierten Domäne wird die User SID nicht gefunden. Da ich sehr viele GPOs auf diese Speziellen User habe müsste ich jetzt jede GPO durchgehen und diesen User mit der neuen Domäne eintragen. Leider sehr unübersichtlich und sehr viel Arbeit. Gibt es hier eine Möglichkeit dieses zu umgehen?

    MFG
    Batgidis

  2. Hallo, Super Script! Danke, spart wirklich Arbeit.
    Wäre es ggf. möglich damit auch UNC Pfade für die Softwareverteilung anzupassen auf die neuen Domäne?

  3. Hallo,

    ich bekomme den Fehler beim Import:

    Import-GPO : “System.Object[]” kann nicht in den Typ “System.Guid” konvertiert werden, der für den Parameter
    “BackupId” erforderlich ist. Die angegebene Methode wird nicht unterstützt.

  4. Hallo,

    ich bekomme beim Import den Fehler:

    Import-GPO : “System.Object[]” kann nicht in den Typ “System.Guid” konvertiert werden, der für den Parameter
    “BackupId” erforderlich ist. Die angegebene Methode wird nicht unterstützt.

  5. Hi
    danke für das Script. bekomme leider auf einem Server 2012R2 auch den Fehler:
    Import-GPO : “System.Object[]” kann nicht in den Typ “System.Guid” konvertiert werden, der für den Parameter
    “BackupId” erforderlich ist. Die angegebene Methode wird nicht unterstützt.
    In C:\tmp\ExportImportGPO\ExportImportGPO.ps1:66 Zeichen:52
    + Import-GPO -TargetName $Name -Path $Path -BackupId $ID.Name
    + ~~~~~~~~
    + CategoryInfo : InvalidArgument: (:) [Import-GPO], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.GroupPolicy.Commands.ImportGpoCommand

  6. Danke für das Script. Sie sollten unbedingt Ihre $Path-Variablen mit etwas wie “GetInvalidFileNameChars” säubern, damit es bei Namen mit Doppelpunkten oder sonstigen Sonderzeichen nicht abstürzt.

  7. An alle die den Fehler hier haben:
    Cannot convert ‘System.Object[]’ to the type ‘System.Guid’ required by parameter ‘BackupId’. Specified method is not Supported:
    Fügt einfach in Zeile 66 des Skripts am Ende ein “-Exclude *.xml” an dann sollte es Problemlos gehen. Ansosnten stehen im Object ID nämlich 2 Namen drin und wir wollen ja nur den Namen des Ordners haben der gleichzeitig die ID ist.
    Zeile 66 vorher: $ID=Get-ChildItem -Path $Path
    Zeile 66 nachher: $ID=Get-ChildItem -Path $Path -Exclude *.xml

  8. Ashraf Al Shalabi

    Hallo zusammen,
    die technet gallery gibts ja leider nicht… wo kann ich diesen Skript wieder herunterladen? Hat’s noch jemand? Wäre super geil 🙂

    Vielen Dank!!
    Ashraf

  9. Hallo,

    ich bekomme beim benutzen des Scripts folgende Meldung:

    Import-GPO : Die Daten sind unzulässig. (Ausnahme von HRESULT: 0x8007000D)
    In C:\Temp\GPO_Export-Import.ps1:56 Zeichen:1
    + Import-GPO -TargetName $Name -Path $Path -BackupId $ID.Name
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Import-GPO], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException,Microsoft.GroupPolicy.Commands.ImportGpoCommand

    Eine Idee woran es liegen könnte?

  10. Hallo Michael,
    Danke für Deine Arbeit und das Script.
    Leider bekomme ich auch beim Import diesen “BackupID” Fehler.
    Habe auch schon die Zeile wie oben beschrieben angepasst, Problem bleibt aber bestehen.
    Zeile 66 nachher: $ID=Get-ChildItem -Path $Path -Exclude *.xml
    Gibt es hierfür
    LG Peter

    Fehler:
    Import-GPO : Das Argument für den Parameter “BackupId” kann nicht überprüft werden. Das Argument ist NULL oder leer. Geben Sie ein Argument an, das nicht NULL oder
    leer ist, und führen Sie den Befehl erneut aus.
    In C:\ExportImportGPO.ps1:56 Zeichen:52
    + Import-GPO -TargetName $Name -Path $Path -BackupId $ID.Name
    + ~~~~~~~~
    + CategoryInfo : InvalidData: (:) [Import-GPO], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.GroupPolicy.Commands.ImportGpoCommand

  11. Sorry für die falsche Zeilennummer, habe bei mir natürlich die dementsprechende angepasst.
    LG Peter

  12. Hallo Michael,
    Danke für Deine Arbeit und das Script.
    Leider bekomme ich auch beim Import diesen “BackupID” Fehler.
    Habe auch schon die Zeile wie oben beschrieben angepasst, Problem bleibt aber bestehen.
    : $ID=Get-ChildItem -Path $Path -Exclude *.xml
    Gibt es eine Ansatz um das Problem zu beheben?
    LG Peter

    Fehler:
    Import-GPO : Das Argument für den Parameter “BackupId” kann nicht überprüft werden. Das Argument ist NULL oder leer. Geben Sie ein Argument an, das nicht NULL oder
    leer ist, und führen Sie den Befehl erneut aus.
    In C:\ExportImportGPO.ps1:56 Zeichen:52
    + Import-GPO -TargetName $Name -Path $Path -BackupId $ID.Name
    + ~~~~~~~~
    + CategoryInfo : InvalidData: (:) [Import-GPO], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.GroupPolicy.Commands.ImportGpoCommand

  13. Tolles Skript als grundlage, ich versuche nun schon seit längerzeit das hinzubekommen, jedoch möchte das Skript nicht wenn ich die daten auf einen anderen DC und Domäne nutze. In der Ursprungsdomäne keinerlei Probleme… Leider fehlt mir aktuell die Expertiese um die Fehlerquelle auszumachen.
    Import-GPO : Die Daten sind unzulässig. (Ausnahme von HRESULT: 0x8007000D)
    In C:\_GPO\GPO.ps1:36 Zeichen:1
    + Import-GPO -TargetName $Name -Path $Path -BackupId $ID.Name
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Import-GPO], COMException
    + FullyQualifiedErrorId :System.Runtime.InteropServices.COMException,Microsoft.GroupPolicy.Commands.ImportGpoCommand

    Mein Initial Test fand auch einem NICHT Lizensieren Server 2022 statt, der Import meiner Quell GPOs fand von einem Kunden Server 2022, natürlich mit Lizenz und normlaer DC mit DNS, DHCP AD….
    Der Fehler tritt reproduzierbar auf nicht Lizensierten Maschinen auf, das habe ich mit drei Geräten Testen können, in meinem fall 2022 sowie ein 2019 Server.
    Bei Servern 2019-2022 mit Lizenz läuft das Skript!
    Ich habe am Ende die Eingabe die ISE als Admin genutz, aber auch wie oben beschrieben, beide Methoden laufen.

    Fazit: Ist der Server Lizensiert, yay. Falls nicht lauft ihr da gegen eine Wand….

Leave a Comment

Your email address will not be published. Required fields are marked *

*