• Active Directory
    • AD Consulting
    • AD Design
      • Domain Name festlegen
      • Domain Struktur einrichten
      • Forest Struktur definieren
    • AD Management
    • AD Automation
      • Dynamic Access Control (DAC)
    • AD Federation Services
      • ADFS Betrieb
      • ADFS und Office365
      • ADFS und Cisco Unified Communications Manager
      • SAML und ADFS 2.0
  • Azure / M365
    • Azure AD
    • Microsoft 365 (O365)
  • Migration
    • Active Directory Migration
    • Exchange Migration
    • File Server Migration
    • Lotus Notes Migration
    • Novell Migration
  • Wissen
    • Alle Beiträge
    • Administration
    • PowerShell
    • Migration
    • Exchange
    • Tools
  • Kontakt
    • Wir über uns
    • Kontakt
  • EN
info@firstattribute.com
by FirstAttribute
Active Directory FAQActive Directory FAQ
  • Active Directory
    • AD Consulting
    • AD Design
      • Domain Name festlegen
      • Domain Struktur einrichten
      • Forest Struktur definieren
    • AD Management
    • AD Automation
      • Dynamic Access Control (DAC)
    • AD Federation Services
      • ADFS Betrieb
      • ADFS und Office365
      • ADFS und Cisco Unified Communications Manager
      • SAML und ADFS 2.0
  • Azure / M365
    • Azure AD
    • Microsoft 365 (O365)
  • Migration
    • Active Directory Migration
    • Exchange Migration
    • File Server Migration
    • Lotus Notes Migration
    • Novell Migration
  • Wissen
    • Alle Beiträge
    • Administration
    • PowerShell
    • Migration
    • Exchange
    • Tools
  • Kontakt
    • Wir über uns
    • Kontakt
  • EN

OUs einfach exportieren und importieren

Okt 20, 2020 (Letztes Update) | Posted by Steve König PowerShell |

 

OUs einfach exportieren und importieren

Wer kennt es nicht? Man braucht eine Kopie der Struktur des produktiven Active Directorys, um ein paar Tests oder Anpassungen zu machen. Die Struktur beginnt dabei mit den Organizational Units (OUs).

In manchen Fällen reicht es vielleicht aus, ein paar Daten per Hand anzulegen.
Was aber, wenn man komplexere Daten und Strukturen benötigt?

Inhaltsverzeichnis

  • 1 Exporte von OUs und Daten
    • 1.1 AD aufgeteilt in Länder > Städte > User
    • 1.2 OUs abfragen
    • 1.3 OUs exportieren
  • 2 OUs importieren
  • 3 Das komplette Skript

Exporte von OUs und Daten

OU- und Datenexporte funktionieren natürlich recht gut per PowerShell. Jedoch gibt es ein paar Stolpersteine. Wie man OUs einfach und schnell per Skript exportiert und wieder importiert, möchte ich hier kurz zeigen.

AD aufgeteilt in Länder > Städte > User

In unserem Beispiel handelt es sich um eine recht simple Teststruktur:
Unser AD ist aufgeteilt nach Ländern > Städte > User.

OUs einfach importieren & exportieren

Im ersten Schritt können wir folgendes probieren:

  • wir fragen einfach alle OUs unterhalb der Basis “Corp” ab,
  • lesen den Namen und den DistinguishedName aus und
  • schauen, was uns PowerShell (formatiert als Tabelle), dort zurückgibt.

OUs abfragen

Dafür benutzen wir folgenden Befehl:

PowerShell
1
Get-ADOrganizationalUnit -filter * -SearchBase "OU=Corp,DC=demofa,DC=net" | Select-Object Name,DistinguishedName | Format-Table

Wenn wir uns das Ergebnis anschauen, sieht das bereits recht gut aus:

Get-ADOrganizationalUnit

Man kann allerdings sehen, dass die Reihenfolge recht zufällig erscheint. Die FRA-OU sollte eigentlich in der Nähe der anderen deutschen OUs sein, wird aber erst ganz am Ende gelistet. Dabei kann es natürlich passieren, dass eine OU eher in der Tabelle (bzw. in der exportierten Datei) steht, als ihr Parent.

Das birgt beim Anlegen natürlich Probleme: Parents müssen zuerst angelegt werden.

Reihenfolge rekursiv auslesen

Um das zu lösen, müssen wir nicht die gesamte OU-Struktur auslesen, sondern Ebene für Ebene. Das machen wir mit Hilfe einer rekursiven Funktion. Diese liest alle OUs auf der darunterliegenden Ebene auf, formatiert diese und fügt sie der Ausgabe-CSV hinzu. Die Funktion dazu erkläre ich gleich. Als letztes ruft sie sich dann selbst für alle gefundenen OUs wieder auf.

PowerShell
1
2
3
4
5
6
7
8
9
function get-ous-recursive($distinguishedName){
 $ous = Get-ADOrganizationalUnit -filter * -SearchBase $distinguishedName -SearchScope OneLevel | Select-Object Name,DistinguishedName
 foreach($ou in $ous) {
   format-and-add-to-csv -ou $ou
}
foreach($ou in $ous) {
   get-ous-recursive $ou.DistinguishedName
}
}

Hier noch einmal veranschaulicht:

  • Zuerst wird die Ebene der Länder durchsucht,
  • dann sind alle Städte unter dem ersten Land dran (DE),
  • daraufhin die jeweiligen User-OUs unter den Städten.

OUs einfach importieren_Reihenfolge

Danach geht es mit den anderen Ländern im selben Verfahren weiter.

OUs formatieren

Da wir nun sichergestellt haben, dass die OUs in der richtigen Reihenfolge sind, formatieren wir sie noch ein wenig.

Wir lesen den Namen und den DistinguishedName der OU aus. Eigentlich brauchen wir den zweiten aber gar nicht. Uns interessiert nur, wie der Parent heißt. Deswegen gibt es noch die Funktion “format-and-add-to-csv”. Sie leitet aus dem DistinguishedName den Parent ab. Anschließend packt sie die beiden Eigenschaften in ein PSObject und fügt sie dann zu einer ArrayList hinzu. Diese exportieren wir am Ende als CSV.

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
function format-and-add-to-csv($ou){
  $parentNameList = New-Object System.Collections.ArrayList
  $parentNameList.AddRange($ou.DistinguishedName.Split(','))
  $parentNameList.RemoveAt(0)
  $parentName = $($parentNameList -join ",")  
  $csvou = New-Object PSObject -Property @{
    Name = $ou.name
    Parent = $parentName
  }
 
  $csvous.Add($csvou)
}

Nun haben wir alles, was wir brauchen! Fangen wir also mit dem eigentlichen Skript an.

AD Delegation - Anwendersicht

OUs exportieren

Als erstes initialisieren wir zwei Variablen: unsere ArrayList für den CSV-Export und unsere SearchRoot.

PowerShell
1
2
$csvous = New-Object System.Collections.ArrayList
$base = "OU=Corp,DC=demofa,DC=net"

Unsere rekursive Funktion deckt nicht die Root, die wir übergeben, mit ab (Corp in diesem Fall). Wenn wir diese noch mit zur CSV hinzufügen wollen, müssen wir das entweder händisch machen oder wir nutzen einfach die bereits bekannten Methoden.

PowerShell
1
2
$baseou = Get-ADOrganizationalUnit -filter * -SearchBase $base -SearchScope Base | Select-Object Name,DistinguishedName
format-and-add-to-csv -ou $baseou

Achtung, hier wird als SearchScope “Base” verwendet im Gegensatz zu dem anderen Aufruf.

Jetzt rufen wir unsere rekursive Funktion auf, die uns den Rest des Arrays füllen wird:

PowerShell
1
get-ous-recursive -distinguishedName $base

Und zu guter Letzt müssen wir das ganze natürlich noch in eine reale CSV-Datei exportieren:

PowerShell
1
2
$path = "C:\Export\ad_ou_export.csv"
$csvous | Export-Csv -Delimiter ";" -Path $path -NoTypeInformation -Encoding UTF8

Auch wenn es insgesamt vielleicht etwas kompliziert klingt, funktioniert es doch sehr gut, wie man auch am Ergebnis sehen kann:

OU Struktur_Parent_Name

Das Gute an dem Skript ist:
Man kann einfach die Variable $base austauschen und es funktioniert mit jeder beliebigen OU-Struktur wieder. Außerdem wird die Mühe, die man sich gemacht hat, beim Import auch gleich belohnt.

OUs importieren

Der geht nämlich denkbar einfach: Man liest die CSV ein, geht durch jede Zeile und legt die OU mit dem Namen und dem Parent an.

PowerShell
1
2
3
4
5
$ous = Import-Csv -Path "C:\Import\ad_ou_export.csv" -Delimiter ";" -Encoding UTF8
 
foreach($ou in $ous){
  New-ADOrganizationalUnit -Name $ou.name -Path $ou.parent -ProtectedFromAccidentalDeletion $False
}

Natürlich sind es noch die Original-Namen aus der Quelldomäne in der CSV. Sollte die Zieldomäne anders heißen, könnt ihr die CSV einfach mit einem Editor eurer Wahl öffnen. Weiter via Suchen & Ersetzen die entsprechenden Teile ändern (in meinem Beispiel wäre das “net” und “demofa”).

Das komplette Skript

Hier noch das Export-Skript in seiner Gänze:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function get-ous-recursive($distinguishedName){
 $ous = Get-ADOrganizationalUnit -filter * -SearchBase $distinguishedName -SearchScope OneLevel | Select-Object Name,DistinguishedName
 foreach($ou in $ous) {
   format-and-add-to-csv -ou $ou
}
foreach($ou in $ous) {
   get-ous-recursive $ou.DistinguishedName
}
}
 
function format-and-add-to-csv($ou){
  $parentNameList = New-Object System.Collections.ArrayList
  $parentNameList.AddRange($ou.DistinguishedName.Split(','))
  $parentNameList.RemoveAt(0)
  $parentName = $($parentNameList -join ",")
 
  $csvou = New-Object PSObject -Property @{
    Name = $ou.name
    Parent = $parentName
  }
 
  $csvous.Add($csvou)
}
 
$csvous = New-Object System.Collections.ArrayList
$base = "OU=Corp,DC=demofa,DC=net"
 
$baseou = Get-ADOrganizationalUnit -filter * -SearchBase $base -SearchScope Base | Select-Object Name,DistinguishedName
format-and-add-to-csv -ou $baseou
 
get-ous-recursive -distinguishedName $base
 
$path = "C:\Export\ad_ou_export.csv"
$csvous | Export-Csv -Delimiter ";" -Path $path -NoTypeInformation -Encoding UTF8

Viel mehr steckt nicht dahinter, so einfach exportiert ihr ganze Strukturen aus eurem AD.

 

Unterstützung benötigt?

Gerne stellen wir Ihnen unsere Leistungen und Lösungen in einem persönlichen Gespräch vor und würden uns über Ihre Kontaktaufnahme sehr freuen!

Artikel weiterempfehlen:
  • teilen
  • tweeten
  • sharen
  • xingen
  • mailen
Artikel erstellt am: 08.10.2018
Tags: format-and-add-to-csvGet-ADOrganizationalUnitGet-OUs-recursiveOUs exportierenOUs importierenPowerShell
0

You also might be interested in

active-directory-sites-mit-powershell-snip

Active Directory Sites mit Powershell automatisieren

Mrz 16, 2015

Am Ende dieses Artikels stelle ich ein fertiges Skript vor. Mit[...]

Powershell-zufaelliges-passwort

PowerShell – Zufälliges Passwort nach eigenen Vorgaben generieren

Mai 18, 2016

Passwörter sind immer Diskussionsthema in der IT-Sicherheit. Wie sind die[...]

Seltene AD Attribute setzen mit PowerShell

Seltene AD Attribute mit PowerShell setzen

Nov 20, 2018

Mit diesem Beitrag möchte ich ein bereits auf Active-Directory-Faq.de erschienenes[...]

Leave a Reply

<p>Danke für Ihre Anregungen, Fragen und Hinweise.<br/>Infos zum <a href="https://www.active-directory-faq.dekontakt/">Datenschutz</a></p>
Cancel Reply

Wer schreibt ?

Consultants und Entwickler der FirstAttribute arbeiten seit mehr als 20 Jahren in IAM-, Migrations- und Cloud-Transition-Projekten.
Zusammen verfügen Sie über einen umfangreichen, wertvollen Erfahrungsschatz im Bereich Active Directory und Azure AD und teilen diesen auf Active Directory FAQ.

Neueste Artikel

  • LastLogon vs. LastLogonTimestamp
  • Teams Benennungsrichtlinien definieren
  • Bitlocker-Recovery Password mit PowerShell auslesen
  • Neuen Exchange-Ordner im Postfach automatisch anlegen
  • AD Gruppenverwaltung delegieren


FirstAttribute

AD Identity Management | Jobs

Kontakt aufnehmen

Sie haben eine Frage oder Anmerkung? Schicken Sie uns schnell eine Nachricht.

Nachricht senden
Jetzt AD Tasks vereinfachen und delegieren: FirstWare IDM-Portal

Folgen Sie uns

Kontakt

  • FirstAttribute AG
  • Am Büchele 18, 86928 Hofstetten, Germany
  • +49 89 215 442 400
  • https://www.firstattribute.com

Schlagwörter

.Net ACL Active Directory AD LDS AD Objekt Berechtigung Berechtigungen Cloud cmdlets Delegation Domain Controller dynamicgroup dynamische Gruppen Exchange Exchange 2016 Exchange Migration Federation FirstWare Get-Mailbox Global Catalog Group Policy Gruppen Gruppenmitgliedschaft IDM-Portal LDAP lokale Gruppen Microsoft Azure Migration New-ADUser Novell NTFS O365 Office 365 PowerShell QMM QMM AD QMM Exchange Quest Migration Manager Schema Set-ADUser SID SID History Update Windows 10 Windows Server 2012 R2

Neueste Kommentare

  • Alex bei Powershell – Home Directory anlegen und Berechtigungen vergeben
  • Kupfer Küchenmischbatterie bei PowerShell – Gruppen-Manager Berechtigung setzen
  • Kevin bei Verschachtelung von Gruppen im AD
Login
Impressum
Datenschutzerklärung

© 2021 · Active-Directory-FAQ by firstattribute.com

Prev Next