Tags: Active Directory, PowerShell
Das PowerShell-Modul für Active Directory enthält auch Cmdlets, mit denen sich Organizational Units (OU) analysieren und ändern lassen. Die drei wichtigsten sind dabei Get- / Set- / Remove- und New-ADOrganizationalUnit.
Speziell beim Reporting stoßen die grafischen RSAT-Tools in großen Verzeichnissen schnell an ihre Grenzen, so dass hier PowerShell eine interessante Alternative bietet. Ähnlich sieht es bei Bulk-Operationen aus, wenn zum Beispiel nach einem Umzug oder einer Restrukturierung einer Firma bestimmte Attribute vieler OUs angepasst werden müssen.
OUs filtern
Das wichtigste Cmdlet für die Analyse von Organisationseinheiten ist Get-ADOrganizationalUnit. Wie Get-ADGroup, sein Pendant für AD-Gruppen, erwartet es immer einen Parameter, der die Abfrage auf bestimmte OUs einschränkt. Das gilt auch dann, wenn man sämtlich OUs ausgeben möchte. In diesem Fall gibt man * als Wert für den Parameter Filter an.
Grenzt man eine OU über Identity ein, dann übergibt man ihren Namen typischerweise in Form eines Distinguished Name:
Get-ADOrganizationalUnit -Identity "ou=marketing,dc=contoso,dc=de"
Einfacher und flexibler ist fast immer der Parameter Filter, der im Gegensatz zu Identity auch Wildcards akzeptiert. Für obiges Beispiel ließe sich ein äquivalenter Aufruf so erzeugen:
Get-ADOrganizationalUnit -Filter "name -eq 'marketing'"
Möchte man alle OUs ermitteln, deren Name eine bestimmte Zeichenkette enthält, dann kann man für den Filterausdruck Wildcards mit dem Operator -like kombinieren:
Get-ADOrganizationalUnit -Filter "name -like 'mar*'"
Neben dem Attribut Name lassen sich beliebige andere in der Abfrage verwenden, und bei Bedarf kann man mehrere Vergleiche mit -and bzw. -or verknüpfen:
Get-ADOrganizationalUnit -Filter "telephoneNumber -like '1234*' -or managedBy -eq 'Acon'"
Dieser Befehl zeigt alle OUs an, deren Telefonnummer entweder mit "1234" beginnt oder die vom Benutzer Acon verwaltet werden.
Erweiterte Anzeige von Attributen
Welche Attribute für derartige Abfragen sonst noch zur Verfügung stehen, kann man dem Attribut-Editor in AD-Benutzer und -Computer oder dem AD-Verwaltungscenter entnehmen.
Alternativ liefert aber auch PowerShell diese Information, wenn man Get-ADOrganizationalUnit mit dem Parameter Property aufruft:
Get-ADOrganizationalUnit -Filter "name -like 'Domain*'" -Property *
Wenn man nur OUs erhalten möchte, die in bestimmten anderen OUs enthalten sind, dann kann man die Abfrage mit Hilfe des Parameters SearchBase entsprechend eingrenzen:
Get-ADOrganizationalUnit -Filter * -SearchBase "OU=sales,DC=contoso,dc=de"
Output an Set-ADOrganizationalUnit übergeben
Die Ergebnisse von Get-ADOrganizationalUnit kann man einfach nutzen, um sich einen Überblick über die OU-Struktur zu verschaffen. Sie eignen sich aber auch als Input für Set-ADOrganizationalUnit, wenn man bestimmte Attribute bei ausgewählten OUs ändern möchte.
Ziehen beispielsweise mehrere Abteilungen von der Rosenstraße 2 in den Nelkenweg 5 um, dann könnte man das Attribut street folgendermaßen in allen betroffenen OUs ändern:
Get-ADOrganizationalUnit -Filter "street -eq 'Rosenstraße 2'" |
Set-ADOrganizationalUnit -SteetAddress "Nelkenweg 5"
Wie man aus diesem Aufruf unschwer erkennen kann, bietet Set-ADOrganizationalUnit für das Ändern des Attributs street einen eigenen Parameter namens StreetAddress. Weitere derartige Parameter für spezifische Attribute sind:
- City
- Country
- Description
- DisplayName
- ManagedBy
- PostalCode
- ProtectedFromAccidentalDeletion
- State
Werte von Attributen als Hash-Tabelle
Möchte man ein Attribut ändern, das nicht durch einen eigenen Parameter repräsentiert ist, dann kann man dies über Replace nach diesem Muster tun:
Set-ADOrganizationalUnit -Identity "OU=Sales,DC=contoso,DC=de" -Replace @{Street="Nelkenweg 5"}
Dieser Befehl beschränkt sich auf die OU Sales, weil sie über den Parameter Identity angegeben wurde. Eine Abfrage mittels Filter unterstützt dieses Cmdlet nicht, so dass man ihm alternativ wieder die Ausgabe von Get-ADOrganizationalUnit über eine Pipe weiterleiten müsste.
Mit Hilfe von Replace lassen sich übrigens gleich mehrere Attribute auf einmal ändern, indem man weitere Paare vom Attribut=Wert durch Semikolon getrennt in die Hash-Tabelle einfügt:
Set-ADOrganizationalUnit -Identity "OU=Sales,DC=windowspro,DC=local" -Replace @{Street="Nekenweg 5"; WWWHomePage="http://www.contoso.de/sales"}
Gerade wenn von einer Schreiboperation mehrere OUs und Attribute betroffen sind, dann empfiehlt sich erst ein Aufruf mit dem Schalter WhatIf, um zu sehen, welche Konsequenzen der Befehl hätte.
OUs löschen
Das gilt umso mehr, wenn man mit Remove-ADOrganizationalUnit eine oder mehrere OUs entfernen möchte. Dieses Cmdlet kann die zu löschenden OUs ebenfalls nur über den Parameter Identity spezifizieren, so dass man ihm ansonsten die Ausgabe von Get-ADOrganizationalUnit via Pipe zukommen lassen kann.
OUs anlegen
Eine neue OU erstellt man schließlich mit New-ADOrganizationalUnit. Verpflichtend ist dabei die Angabe von Name, darüber hinaus benötigt man Path, wenn man die Position der neuen OU innerhalb der Baumstruktur spezifizieren will:
New-ADOrganizationalUnit -Name Aussendienst -Path "OU=Sales,DC=contoso,DC=de"
Diesem Aufruf kann man gleich die Werte für diverse Attribute mitgeben, unterstützt werden dabei die gleichen Parameter wie die bei Set-ADOrganizationalUnit genannten. All diejenigen, die dort nicht berücksichtigt sind, lassen sich über OtherAttributes mit Hilfe eines Hashtables setzen, und zwar über das gleiche Vorgehen wie oben für Replace beschrieben.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Security- und Health-Checks für Active Directory mit PowerShell-Scripts
- Split-brain DNS in Active Directory einrichten
- AD-Konten mit DES- und RC4-Algorithmus für Kerberos-Verschlüsselung finden
- UserAccountControl: Sicherheitseinstellungen für AD-Konten prüfen und ändern
- Gruppen in Azure Active Directory mit PowerShell verwalten
Weitere Links