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

Download auf der TechNet Gallery: http://gallery.technet.microsoft.com/Export-and-Import-Group-c54d9914

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

8 comments to Export und Import GPO mit PowerShell

  • 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

  • Hallo,
    ich nehme das mal auf für die nächste Version.
    Danke

  • Benjamin Tietze

    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.

  • Benjamin Tietze

    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.

  • Benjamin Tietze

    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?

  • Jazz

    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

Leave a Reply

  

  

  

*