Attribute (single- und multi-valued) im Active Directory ändern oder kopieren mit PowerShell

    Active Directory PowerShellWenn im Active Directory der Wert für bestimmte Attri­bute bei einer größeren Zahl von Objekten geän­dert werden soll, dann kann man diesen Vor­gang mit Power­Shell auto­matisieren. Während dies für ein­fache Werte ziem­lich unkom­pliziert ist, muss man bei Multi-valued-Attributen mehr Auf­wand be­treiben.

    Ein Update für bestimmte User-Attribute kann etwa fällig werden, wenn sich die Adresse der Firma oder einer Nieder­lassung ändert oder das Unternehmen intern umstruk­turiert wird. Es gibt auch Fälle, wo vorhandene Werte eines Attributs in anderes kopiert werden soll. Das kommt zum Beispiel vor, wenn man bestimmte Telefon­nummern 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 Anzeige­namen verwenden möchte. Selbst wenn nur ausgewählte Benutzer in den Genuss dieses Features gelangen, so sollte man trotzdem sicher­stellen, 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 folgender­maß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.

    Für alle User der OU IT den Wert von displayName nach displayNamePrintable kopieren, wenn dieses noch leer ist.

    Im Attributeditor von Active Directory-Benutzer und -Computer kann man überprüfen, ob das Kopieren des Attibutwerts funktioniert hat.

    Active Directory-Benutzer und -Computer zeigt, dass displayName und displayNamePrintable jetzt den gleichen Wert haben.

    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 normaler­weise davon überzeugen, dass ein eventuell schon vorhandener Inhalt nicht ungewollt überschrieben wird. Ist die Bahn frei, dann aktualisiert man diesen Anzeige­namen.

    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.

    Active Directory-Benutzer und -Computer zeigt, dass otherHomePhone mehrere Werte aufnehmen kann.

    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")}

    Um mehrere Werte in ein MultiValued-Attribut zu schreiben, übergibt man ihm ein Array.

    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.

    Das Script zeigt für ein bestimmtes Objekt, welche Attribute SingleValued sind.

    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

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Keine Kommentare