Tags: Active Directory, PowerShell
Wenn im Active Directory der Wert für bestimmte Attribute bei einer größeren Zahl von Objekten geändert werden soll, dann kann man diesen Vorgang mit PowerShell automatisieren. Während dies für einfache Werte ziemlich unkompliziert ist, muss man bei Multi-valued-Attributen mehr Aufwand betreiben.
Ein Update für bestimmte User-Attribute kann etwa fällig werden, wenn sich die Adresse der Firma oder einer Niederlassung ändert oder das Unternehmen intern umstrukturiert wird. Es gibt auch Fälle, wo vorhandene Werte eines Attributs in anderes kopiert werden soll. Das kommt zum Beispiel vor, wenn man bestimmte Telefonnummern in einem anderen Feld haben möchte.
displayName nach displayNamePrintable kopieren
Eine solche Anforderung ergibt sich ebefalls, wenn man bei Exchange für interne und externe Mails verschiedene Anzeigenamen verwenden möchte. Selbst wenn nur ausgewählte Benutzer in den Genuss dieses Features gelangen, so sollte man trotzdem sicherstellen, dass alle Konten einen Wert für das Attribut SimpleDisplayName erhalten.
Eine Lösung bestünde darin, den Inhalt von displayName nach SimpleDisplayName zu übernehmen. Das könnte man folgendermaßen bewerkstelligen:
Das Script liest mit Get-ADObject alle User-Konten aus der OU IT ein und prüft für jedes von ihnen, ob es bereits einen Wert für DisplayNamePrintable besitzt. Ist das nicht der Fall, dann schreibt es den Inhalt von displayName in dieses Attribut.
Im Attributeditor von Active Directory-Benutzer und -Computer kann man überprüfen, ob das Kopieren des Attibutwerts funktioniert hat.
Attribut- als Parameternamen von Set-ADUser
Anders als bei displayNamePrintable kann man bei vielen anderen Feldern zu einer einfacheren Lösung greifen. Das Cmdlet Set-ADUser bietet nämlich Parameter mit den jeweiligen Namen der Attribute, im folgenden Beispiel etwa StreetAddress:
Get-ADUser -Filter "StreetAddress -eq 'Marsstr. 3'"|
Set-ADUser -StreetAddress "Rosenweg 1"
Dieses Script würde den Adressbestandteil Straße bei allen Konten, bei denen bisher "Marsstr. 3" eingetragen ist, auf "Rosenweg 1" ändern.
Bearbeiten von Attributen vom Typ Multi-valued
Beim Zuweisen eines Werts zum Attribut displayNamePrintable wird man sich normalerweise davon überzeugen, dass ein eventuell schon vorhandener Inhalt nicht ungewollt überschrieben wird. Ist die Bahn frei, dann aktualisiert man diesen Anzeigenamen.
Im Gegensatz zu displayNamePrintable nehmen viele andere Attribute aber mehrere Werte auf. In diesem Fall würde eine Zuweisung wie im obigen Beispiel alle vorhandenen Inhalte zerstören. Wenn etwa unter otherHomePhone mehrere Telefonnummern hinterlegt sind, dann würde ein
$user.otherHomePhone = "+498912345"
Set-ADObject -Instance $user
alle dort gespeicherten Telefonnummern überschreiben.
Will man also eine weitere Nummer zu den bestehenden hinzufügen, muss man sich anderer Mittel bedienen. Sowohl Set-ADUser als auch Set-ADObject verfügen dafür über den Parameter Add:
In diesem Beispiel kopiert das Script den Wert aus dem Attribut homePhone nach otherHomePhone. Ein solcher Aufruf von Set-ADUser mit dem Add-Parameter funktioniert übrigens auch mit Attributen vom Typ SingeValued, aber dort kann man das gleiche Ergebnis einfacher haben, wie oben gezeigt.
Bei Attributen mit mehreren Werten muss man auch bei anderen Operationen so vorgehen, dass nur jene davon betroffen sind, die man tatsächlich ändern will. Das gilt etwa für das Entfernen bestimmter Einträge.
Dieses Script würde die Telefonnummer, die in homePhone gespeichert ist, aus otherHomePhone löschen.
Wenn man einen vorhandenen Wert durch einen neuen ersetzen möchte, dann könnte man ein Remove mit einem Add kombinieren. Beide Parameter sind innerhalb eines Aufrufs zulässig und das Entfernen wird grundsätzlich vor dem Hinzufügen ausgeführt.
Darüber hinaus verfügen die beiden erwähnten Cmdlets über einen Replace-Parameter. Dessen Aufgabe ist es aber nicht, einzelne Werte zu ersetzen, sondern den gesamten Inhalt eines Attributs. Dafür genügt bei einem Single-valued-Attribut eine einfache Hash-Tabelle:
Set-ADUser -Identity $user.DistinguishedName -Replace @{homePhone = "+498967890"}
Bei Attributen vom Typ multi-valued weist man diesen hingegen ein Array zu:
Set-ADUser -Identity $user.DistinguishedName `
-Replace @{otherHomePhone = @("+498967890", $user.HomePhone, "+4991101234")}
Attributwerte löschen
Falls man keinen Wert in ein Attribut schreiben, sondern dessen Inhalte löschen möchte, dann kann man das mit dem Clear-Parameter von Set-ADObject erreichen:
Dieses Beispiel zeigt das Vorgehen an einem Single-valued-Attribut, funktioniert aber auch für solche, die mehrere Werte speichern.
Attributtyp erkennen
Nachdem Single- und Multi-valued-Attribute verschiedene Operationen für das Entfernen, Hinzufügen und Ersetzen von Werten erfordern, stellt sich natürlich die Frage, wie man die beiden Typen erkennt. Über das simple Abfragen einer Eigenschaft lässt sich diese aber nicht klären.
Auf Microsofts TechNet findet sich ein Script, das alle Attribute eines AD-Objekts auflistet und dabei auch Auskunft darüber gibt, ob es nur einen oder mehrere Werte enthalten kann. Hier ändert man die Zuweisung in der ersten Zeile, um eines der Objekte einzusetzen, die man nachher bearbeiten möchte.
Bei erfolgreicher Ausführung öffnet es mit Out-GridView zwei Fenster, in denen die Spalte isSingleValued Aufschluss über den Typ des Attributs gibt.
Täglich Know-how für IT-Pros mit unserem Newsletter
Ähnliche Beiträge
- 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
- Wann haben Benutzer zuletzt ihr Passwort im Active Directory geändert?
Weitere Links