Powershell Basics im Active Directory Part 1

Viele der täglichen Arbeiten eines Administrators im Active Directory lassen sich mit der Powershell schneller erledigen als über viele Klick-Wege in der GUI. Allerdings besteht oftmals eine gewisse Angst davor Massen-Aktionen auszuführen. In diesem Artikel möchte ich allen interessierten schildern, wie man sich Schritt für Schritt der Verwaltung mit der Powershell nähern kann (bzw. aufzeigen wie ich mich selbst rangetastet habe). Etwas beruhigendes vorweg: Wir arbeiten im ersten Part nur mit „Get-“ Befehlen. Allgemein kannst du dir merken dass ein Get-Befehl keine Auswirkungen haben kann, solange nirgends in dem Befehl ein „Set-“ oder „Update-“ steht.

Hinweis: Dieser Text ist als Fließtext geschrieben, du kannst aber natürlich auch einfach zwischen den Code-Snippets und den Überschriften hin und her springen.

Anzeigen eines AD-Users

Nehmen wir als erstes Beispiel die Abfrage eines AD-Users. Üblicherweise auf einem Domaincontroller oder einem Computer auf dem die RSAT-Tools installiert sind, gibt es die Konsole „Active Directory Users & Computers“. In dieser GUI würde mich der Weg jetzt über mehrere Klicks und Suchen führen; und das obwohl ich sogar weiß dass der User den ich suche LLange heißt. Ich öffne also das Startmenü, suche nach „Active Directory Users & Computers“, klicke dort oben auf das Suchen Symbol und geben anschließend den Usernamen ein.

Sind die RSAT-Tools auf dem Computer installiert, oder handelt es sich um einen Domaincontroller, sind aber auch die Powershell-Module für die Active Directory Verwaltung installiert. In der Powershell kann ich also ebenfalls Infos zu einem User anzeigen. Das erledige ich mit dem einfachen Befehl „Get-ADUser“:

Get-ADUser -Identity "LLange"

Diesen Befehl kann ich sogar noch weiter kürzen:

Get-ADUser -Identity "LLange"

# den Schalter -Identity kann man weglassen, da es der Standard Input ist
Get-ADUser "LLange"

# Drückt man die TAB-Taste, kann man Befehle automatisch vervollständigen lassen. So tippe ich nur noch folgendes:

Get-ADU<#TAB-Taste#> "LLange"

Was wird mir nun angezeigt? Nur wenige Attribute des AD-Users (DistinguishedName, SAMAccountName, UserPrincipalName etc). In Wirklichkeit gibt es aber natürlich noch viel mehr Attribute eines Users, die ich natürlich ebenfalls explizit mit anzeigen kann. Dazu gebe ich den Parameter -Properties gefolgt von dem gewünschten Attribut mit. In diesem Beispiel lasse ich zusätzlich die Mailadresse und das Erstellerdatum des Users anzeigen:

Get-ADUser "LLange" -Properties mail, whencreated

Was aber tun, wenn man nicht weiß wie das gewünschte Feld heißt? In traditioneller Trial & Error Methode, lassen wir uns einfach alle Attribute des Users anzeigen:

# Das Stern-Symbol ist eine sogenannte Wildcard. Gibt man nichts außer dem Stern an, ist es gleichzusetzen mit "Alles" 
Get-ADUser "LLange" -Properties *

Jetzt sieht man natürlich einiges 🙂 Wir können aber einfach schauen welche Attribute für uns interessant sind und anschließend nur die für uns wichtigen Attribute anzeigen. Dazu nutzen wir die sogenannte Pipe | (Falls du das Symbol noch nicht genutzt hast, auf der deutschen Tastatur findest du es auf der Taste der spitzen Klammern < > ). Pipe heißt übersetzt Rohr und soll symbolisieren was dieses Symbol macht.

Pipe zum Weiterleiten von Befehls-Outputs

Im Normalfall geben wir etwas in eine Konsole ein und die Konsole gibt uns anschließend wieder etwas aus. Was aber wenn mich aber der Output dieses ersten Befehls nicht interessiert, sondern ich nur das was ich dort herausgefunden habe weiterverarbeiten möchten? In diesem Fall kann ich den Output eines Befehls mit der Pipe (dem Rohr) an einen weiteren Befehl weiterleiten. Ein sehr einfaches Beispiel ist hierbei der select Befehl:

Get-ADUser "LLange" -Properties * | select name, samaccountname, mail

Der Output des ersten Befehls war uns viel zu viel. Deshalb haben wir diesen Output nun weitergeleitet an den Befehl select und haben dort nur die 3 Attribute name, samaccountname und mail angegeben. Wir haben also alles angezeigt und anschließend davon nur 3 Dinge ausgewählt („selected“ auf englisch).

Schnelles Abrufen von versteckten Attributen

Du hast es vielleicht noch nicht gemerkt, aber du kannst bereits jetzt schon etwas viel schneller als vorher: Stell dir beispielsweise vor, du möchtest die PersonalNummer eines Users auslesen. Im Active Directory ist das Standard Feld dazu „employeeID„. In der GUI (Active Directory Users & Computers) findest du diese Information aber nicht ohne weiteres. Damit du sie anzeigen kannst, musst du als erstes unter View die Erweiterte Ansicht aktivieren

Anschließend reicht es nicht nach dem User zu suchen. Denn was wir brauchen ist der Attribut Editor. Diesen findest du aber nur, wenn du einen User direkt anklickst. Du musst dich also zuerst durch alle OUs hangeln, anschließend Rechtsklick/Eigenschaften machen, den Attribut-Editor auswählen und dort nach dem Feld „employeeID“ suchen.

Wie würdest du das jetzt in der Powershell erledigen? Du weißt bereits alles was du dazu benötigst:

Get-ADUser "LLange" -Properties * | select employeeid

Das war auf jeden Fall erheblich leichter und schneller als über die GUI, oder? Du zeigst dir einfach alle Attribute des Users an und selektierst anschließend nur das interessante, die employeeID.

Hilfe eines Befehls aufrufen um die Funktion zu verstehen

Was ist wenn ich beispielsweise nicht genau weiß wie der Username eines Benutzers ist? Der Befehl nimmt für den -Identity Parameter nur vorhandene Benutzernamen. In diesem Fall lohnt sich der Blick in die Hilfe des Befehls:

Get-Help "Get-ADUser"

Der Output verrät uns einiges über den Befehl, unter anderem die Syntax:

<#
SYNTAX
    Get-ADUser [-AuthType {Negotiate | Basic}] [-Credential <PSCredential>] [-Properties <String[]>] [-ResultPageSize <Int32>] [-ResultSetSize <Int32>] [-SearchBase <String>] [-SearchScope {Base | OneLevel | Subtree}] [-Server
    <String>] -Filter <String> [<CommonParameters>]

    Get-ADUser [-Identity] <ADUser> [-AuthType {Negotiate | Basic}] [-Credential <PSCredential>] [-Partition <String>] [-Properties <String[]>] [-Server <String>] [<CommonParameters>]

    Get-ADUser [-AuthType {Negotiate | Basic}] [-Credential <PSCredential>] [-Properties <String[]>] [-ResultPageSize <Int32>] [-ResultSetSize <Int32>] [-SearchBase <String>] [-SearchScope {Base | OneLevel | Subtree}] [-Server
    <String>] -LDAPFilter <String> [<CommonParameters>]

#>

Es gibt also die Möglichkeit den Parameter -Filter zu nutzen. Um einen Filter zu nutzen, müssen wir allerdings zuerst einen kleinen Ausflug zu den Operatoren machen.

Vergleichsoperatoren

Ein Operator wird genutzt um zu beschreiben wie etwas verglichen werden soll. Stell dir beispielsweise vor du möchtest einen User finden, dessen SAMAccountName „LLange“ ist. In diesem Fall nutzt du in Powershell den Operator „-eq„was für „equals“ steht:

Get-ADUser -Filter {SamAccountName -eq "LLange"}

Möchtest du etwas finden, das alles außer „LLange“ heißt, kannst du das Gegenteil benutzen (du ahnst es vielleicht schon) „-ne“ für „not equals„:

Get-ADUser -Filter {SamAccountName -ne "LLange"}

Je nachdem wie viele User es in deinem Active Directory gibt, ist jetzt eine ganz schön lange Liste vor dir abgelaufen 🙂 Du hast dir alle User angezeigt, die NICHT den SAMAccountName LLange haben.

Was machst du aber wie in unserem Beispiel, wenn du dir nicht sicher bist wie der SamAccountName ist? „Equals“ wäre in diesem Fall falsch, da es ganz genau stimmen muss. Für diese „ungenauen“ Abfragen gibt es in Powershell den Operator „-like„. Like muss zusammen mit Platzhaltern genutzt werden. Einen Platzhalter kennst du bereits, die Wildcard „*„:

Get-ADUser -Filter {SamAccountName -like "*Lange"}

Mir werden nun alle User angezeigt, die einen SAMAccountNamen haben, der mit lange endet. Möchte ich alle User haben die mit Lange beginnen, kann ich die Wildcard hinter den Suchbegriff setzen („Lange*“).

Es gibt viele weitere Operatoren auf die ich nun nicht genauer eingehen möchte, hier findet ihr aber trotzdem mal eine kurze Liste:

-eqequals
-nenot equals
-ltlower than
-gtgreater than
-lelower or equals
-gegreater or equals
-likeungefähre Übereinstimmung mit Platzhaltern
-matcheine Anzahl von Zeichen muss genau so vorkommen
-containsIn einer Liste muss ein Objekt übereinstimmen

Filtern mit mehreren Bedingungen

Möchten wir nun mehrere Bedingungen in unsere Abfrage einbauen, können wir das wie oben mit logischen UND und OR machen:

Get-ADUser -Filter {SurName -eq "Lange" -and GivenName -eq "Lukas"}

Jetzt werden mir nur diejenigen User angezeigt deren Nachname (SurName) Lange ist und gleichzeitig der Vorname (GivenName) Lukas ist. Gibt es also nur einen Lukas Lange im Active Directory, finde ich nur diesen einen User. Ist dagegen nur eins der beiden Dinge wichtig, kann ich ein OR verwenden:

Get-ADUser -Filter {SurName -eq "Lange" -or GivenName -eq "Lukas"}

Hier werden mir jetzt alle diejenigen User angezeigt die mit Nachnamen Lange heißen oder mit Vornamen Lukas. Gibt es also 3 User die mit Vornamen Lukas heißen und 2 User die mit Nachnamen Lange heißen, werden mir diese 5 User angezeigt.

Ich hoffe diese Informationen helfen dir etwas weiter und du traust dir nun zu einige Funktionen der Powershell zu nutzen.

Im nächsten Teil schauen wir uns dann an, was man mit den Usern sonst so anstellen kann.

Schreibe einen Kommentar