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
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
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
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
Hallo,
ich nehme das mal auf für die nächste Version.
Danke
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?
Hallo,
es gab schon mal eine ähnlich Anfrage, ich werde das mal auf meine Erweiterungsliste für die nächste Version setzen.
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.
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.
Hallo,
woher kommt das Verzeichnis des Imports, wurde dieser mit dem Script exportiert, wurde etwas am Verzeichnis geändert?
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
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.
Hallo,
läuft das Script auch unter Server 2019?
Hi, noch nicht getestet, aber ich denke ja, da sich die CMDlets nicht geändert haben sollten
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
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
Hi, here is the GitHub Repo: https://github.com/Seidlm/ACTIVE-DIRECTORY-Import-and-Export-GPO
This download also does not work: 404
can be found on GitHub:https://github.com/Seidlm/Active-Directory
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?
Hi,
ich habe das gleiche Problem wie Benjamin. Gibt es dafür schon eine Lösung?
Leider nein, konnte was Problem nicht nachstellen
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
Sorry für die falsche Zeilennummer, habe bei mir natürlich die dementsprechende angepasst.
LG Peter
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
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….