PowerShell Befehle für Active Directory helfen Dir, Benutzer zu finden, Gruppen zu verwalten und wiederkehrende Verwaltungsaufgaben zu erledigen. Statt jedes Konto einzeln zu öffnen, kannst Du AD-Informationen abfragen, Berichte erstellen und vorbereitete Änderungen ausführen.

Diese Anleitung führt Dich von der Einrichtung des AD-Moduls bis zu praktischen Befehlen für Benutzer, Kennwörter, Computer und Organisationseinheiten. Dabei erfährst Du nicht nur, welcher Befehl funktioniert, sondern auch, wo seine Grenzen liegen und welche Prüfungen vor einer Änderung wichtig sind.

Was sind PowerShell Befehle für Active Directory?

PowerShell Befehle für Active Directory sind Verwaltungsbefehle des Moduls ActiveDirectory. Mit diesen sogenannten Cmdlets liest und bearbeitest Du Objekte in Active Directory Domain Services, kurz AD DS. Dazu gehören Benutzerkonten, Sicherheitsgruppen, Computerkonten, Organisationseinheiten und Informationen zur Domäne.

Active Directory speichert diese Informationen zentral auf Domänencontrollern. PowerShell liefert die abgefragten Daten als Objekte zurück. Du kannst deren Eigenschaften auswählen, Ergebnisse filtern und sie an weitere Befehle übergeben. Genau dadurch werden aus einzelnen Abfragen wiederverwendbare Verwaltungsabläufe.

Wichtig ist die Abgrenzung: Die folgenden Beispiele betreffen eine klassische Windows-Domäne. Sie verwalten weder lokale Windows-Benutzerkonten noch unmittelbar die Benutzer eines Microsoft-Entra-ID-Mandanten. Auch in einer hybriden Umgebung bleiben AD DS und Microsoft Entra ID unterschiedliche Verzeichnisdienste.

Das ActiveDirectory-Modul stellt die dafür benötigten Cmdlets bereit. Für komplexere Verzeichnisabfragen ist außerdem hilfreich, LDAP und seine Rolle im Active Directory zu verstehen.

Direkt zum passenden Bereich: Einrichtung, Benutzer, Kennwörter und Kontosperren, Gruppen, Computer, Organisationseinheiten, Berichte und CSV, Fehlerbehebung oder FAQ.

Die wichtigsten Active Directory PowerShell Befehle im Überblick

Die folgende Tabelle ordnet die zentralen Cmdlets nach Aufgaben. Lesende Befehle verändern keine AD-Objekte. Ändernde Befehle benötigen passende Berechtigungen und sollten zunächst mit einer Vorschau geprüft werden.

AufgabePowerShell BefehlWirkung im AD
Benutzer suchen und Eigenschaften anzeigenGet-ADUserLesend
Benutzer anlegenNew-ADUserÄndernd
Benutzereigenschaften bearbeitenSet-ADUserÄndernd
Kontostatus untersuchenSearch-ADAccountLesend
Kennwort zurücksetzenSet-ADAccountPasswordÄndernd
Kontosperre aufhebenUnlock-ADAccountÄndernd
Konto aktivieren oder deaktivierenEnable-ADAccount, Disable-ADAccountÄndernd
Gruppen und Mitglieder anzeigenGet-ADGroup, Get-ADGroupMemberLesend
Gruppenmitgliedschaften eines Kontos abfragenGet-ADPrincipalGroupMembershipLesend
Mitglieder hinzufügen oder entfernenAdd-ADGroupMember, Remove-ADGroupMemberÄndernd
Computer und Organisationseinheiten anzeigenGet-ADComputer, Get-ADOrganizationalUnitLesend
Gruppen oder Organisationseinheiten anlegenNew-ADGroup, New-ADOrganizationalUnitÄndernd
Objekte verschieben oder Benutzer löschenMove-ADObject, Remove-ADUserÄndernd
Domäne und Domänencontroller untersuchenGet-ADDomain, Get-ADDomainControllerLesend
Active Directory PowerShell einrichten - Schritt für Schritt
KI-generierte Darstellung, kein Original-Screenshot.

Active Directory PowerShell einrichten: Schritt für Schritt

1. Geeigneten Verwaltungscomputer und Berechtigungen prüfen

Du brauchst einen Windows-Verwaltungscomputer mit dem ActiveDirectory-Modul und eine funktionierende Verbindung zu Deiner Domäne. Unter Windows 11 eignen sich Pro und Enterprise mit installierten RSAT-Komponenten. Alternativ verwendest Du einen entsprechend vorbereiteten Windows Server.

Die Beispiele orientieren sich an Windows PowerShell 5.1. Das ActiveDirectory-Modul aktueller Windows-Systeme ist auch unter PowerShell 7 für Windows nativ nutzbar. Bei Problemen prüfst Du zunächst, welche Umgebung Du tatsächlich geöffnet hast:

$PSVersionTable.PSVersion
$PSVersionTable.PSEdition

Lokale Administratorrechte benötigst Du für die Installation der Verwaltungskomponenten. Für spätere AD-Abfragen und Änderungen zählen dagegen die Rechte Deines Domänenkontos. Ein lokal als Administrator gestartetes Fenster verleiht Dir keine zusätzlichen Rechte im Verzeichnis. Für viele Routineaufgaben reichen gezielt delegierte Berechtigungen, statt einer Mitgliedschaft bei den Domänen-Admins.

2. RSAT und das ActiveDirectory-Modul installieren

Öffne für die Installation Windows PowerShell als Administrator. Unter Windows 11 installierst Du die AD-Verwaltungskomponenten mit folgendem Befehl:

Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0'

Auf Windows Server verwendest Du stattdessen das passende Serverfeature:

Install-WindowsFeature -Name RSAT-AD-PowerShell

Führe nur die Variante für Dein Betriebssystem aus. In verwalteten Netzwerken können Richtlinien und die konfigurierte Bereitstellung optionaler Windows-Komponenten den Download beeinflussen. Die Installation der RSAT Active Directory Tools unter Windows 11 ist auch über die Windows-Oberfläche möglich.

3. Modul laden und verfügbare Befehle anzeigen

Öffne nach der Installation eine neue PowerShell-Sitzung und prüfe, ob das Modul vorhanden ist:

Get-Module -ListAvailable ActiveDirectory
Import-Module ActiveDirectory -ErrorAction Stop
Get-Command -Module ActiveDirectory

Die letzte Zeile zeigt die auf Deinem System verfügbaren AD-Cmdlets. Einzelne Funktionen können je nach Modulversion und Zielumgebung unterschiedlich verfügbar sein. Hilfe zu einem Befehl erhältst Du beispielsweise so:

Get-Help Get-ADUser -Examples
Get-Command Get-ADUser -Syntax

4. Domänencontroller und Beispielpfade festlegen

Die weiteren Beispiele verwenden gemeinsame Variablen. Ersetze den Servernamen durch einen erreichbaren, beschreibbaren Domänencontroller Deiner Umgebung. Die angegebenen Organisationseinheiten müssen bereits existieren oder durch Deine tatsächlichen OU-Namen ersetzt werden.

$Server = 'dc01.ad.example.com'
$Domain = Get-ADDomain -Server $Server -ErrorAction Stop
$DomainDn = $Domain.DistinguishedName

$UserOu = "OU=Benutzer,$DomainDn"
$ComputerOu = "OU=Computer,$DomainDn"
$GroupOu = "OU=Gruppen,$DomainDn"

$Domain | Select-Object DNSRoot, DistinguishedName, PDCEmulator
Get-ADOrganizationalUnit -Identity $UserOu -Server $Server

Die Domäne wird ausgelesen, während die letzte Zeile die beispielhafte Benutzer-OU prüft. Eine Fehlermeldung an dieser Stelle bedeutet nicht automatisch, dass die AD-Verbindung defekt ist. Häufig stimmt schlicht der OU-Pfad nicht.

Ein Pfad wie OU=Benutzer,DC=ad,DC=example,DC=com ist ein Distinguished Name, kurz DN. Die Bestandteile beginnen beim konkreten Objekt und führen zur Domäne. Beachte außerdem, dass der Standardcontainer CN=Users keine OU namens Benutzer ist. So kannst Du den vollständigen Active Directory Pfad eines Objekts abfragen.

Alle Servernamen, Benutzer und Gruppen in diesem Beitrag sind Platzhalter. Die Abschnitte sind einzelne Arbeitsbeispiele, kein Skript zum vollständigen Durchlaufen. Führe die Variablendefinitionen in derselben Sitzung aus, in der Du anschließend die passenden Beispiele verwendest.

AD-Befehle richtig lesen - Identity, Filter, Properties und WhatIf
KI-generierte Darstellung, kein Original-Screenshot.

AD-Befehle richtig lesen: Identity, Filter, Properties und WhatIf

Mit -Identity sprichst Du ein bestimmtes Objekt an. Bei Get-ADUser eignen sich dafür beispielsweise der SAM-Kontoname, der Distinguished Name, die GUID oder die SID. Ein Anzeigename ist kein verlässlicher eindeutiger Schlüssel. Einen UPN im Format Benutzer@Domäne suchst Du besser ausdrücklich über einen Filter.

-Filter grenzt Ergebnisse bereits bei der Verzeichnisabfrage ein. -SearchBase bestimmt den Startpunkt der Suche. -Properties fordert zusätzliche Eigenschaften an, die der Befehl nicht standardmäßig zurückliefert. Mit Select-Object legst Du anschließend fest, welche der geladenen Eigenschaften Du ausgeben möchtest.

Das Zeichen | heißt Pipeline und reicht Objekte an den nächsten Befehl weiter. Die Verwendung von PowerShell-Parametern ist deshalb wichtiger als das bloße Auswendiglernen langer Befehlszeilen.

Die schreibenden AD-Beispiele enthalten zunächst -WhatIf. Damit siehst Du die vorgesehene Aktion, ohne dass der betreffende Befehl sie durchführt. Entferne diesen Parameter erst nach Prüfung von Zielobjekt, Umfang und Freigabe. Eine Vorschau ist keine vollständige Prüfung aller Berechtigungen, Kennwortrichtlinien oder späteren Laufzeitfehler. Für eine zusätzliche Rückfrage bei der tatsächlichen Ausführung kannst Du bei unterstützten Cmdlets -Confirm verwenden.

Wichtig: WhatIf schützt nur die entsprechend ausgeführte Aktion. Andere Zeilen eines Skripts, beispielsweise ein Datei-Export, können trotzdem ausgeführt werden. Ebenso entsteht durch WhatIf kein automatischer Rückweg für später tatsächlich vorgenommene Änderungen.

PowerShell Befehle für Active Directory Benutzer

Ein Benutzerkonto mit Get-ADUser auslesen

Mit dieser Abfrage untersuchst Du ein bestimmtes Konto einschließlich Abteilung, E-Mail-Adresse und gespeichertem Anmeldedatum:

Get-ADUser -Identity 'anna.beispiel' -Server $Server -Properties DisplayName, EmailAddress, Department, LastLogonDate |
    Select-Object SamAccountName, DisplayName, Enabled, EmailAddress, Department, LastLogonDate

Eine leere Eigenschaft kann bedeuten, dass sie im AD nicht befüllt wurde. Fehlt sie schon bei der Abfrage unter Properties, liefert Select-Object ihren Inhalt nicht nachträglich nach. Weitere Beispiele zum Auslesen von Benutzerinformationen mit Get-ADUser helfen Dir beim Zusammenstellen eigener Abfragen.

Aktivierte Benutzer einer Abteilung und OU anzeigen

Das folgende Beispiel sucht aktivierte Konten der Abteilung IT innerhalb der angegebenen Benutzer-OU und ihrer Unter-OUs:

Get-ADUser -Filter {Enabled -eq $true -and Department -eq 'IT'} -SearchBase $UserOu -SearchScope Subtree -Server $Server -Properties Department |
    Select-Object Name, SamAccountName, Department, Enabled

Die Auswahl aktiviert bedeutet hier, dass das Konto nicht administrativ deaktiviert ist. Sie sagt nicht, dass der Benutzer gerade angemeldet ist oder zuletzt gearbeitet hat.

Mit -SearchScope OneLevel würdest Du nur die unmittelbar untergeordneten Objekte durchsuchen. Für Namensmuster verwendest Du beispielsweise Name -like 'Anna*'. Die passenden PowerShell-Vergleichsoperatoren helfen Dir, solche Bedingungen zu verstehen. Der AD-Filter unterstützt allerdings nicht jeden Ausdruck, den Du in einem normalen PowerShell-Skript verwenden kannst.

Benutzer anhand des UPN suchen

Wenn Du statt des SAM-Kontonamens nur den Anmeldenamen mit Domänensuffix kennst, nutze eine gezielte UPN-Abfrage:

Get-ADUser -Filter {UserPrincipalName -eq 'anna.beispiel@ad.example.com'} -Server $Server |
    Select-Object Name, SamAccountName, UserPrincipalName, DistinguishedName

So vermeidest Du, einen UPN fälschlich als unterstützten Identity-Wert zu behandeln. Bei größeren Domänen ist ein präziser Filter außerdem sinnvoller, als zunächst sämtliche Benutzer zu laden und sie anschließend lokal zu durchsuchen.

AD-Benutzer mit New-ADUser anlegen

Für ein neues Benutzerkonto legst Du zuerst die gewünschten Eigenschaften fest. Das Kennwort wird verdeckt abgefragt und nicht als Klartext in die Befehlszeile geschrieben:

$Kennwort = Read-Host 'Individuelles Startkennwort eingeben' -AsSecureString

$NeuerBenutzer = @{
    Name                  = 'Max Beispiel'
    GivenName             = 'Max'
    Surname               = 'Beispiel'
    DisplayName           = 'Max Beispiel'
    SamAccountName        = 'max.beispiel'
    UserPrincipalName     = "max.beispiel@$($Domain.DNSRoot)"
    Path                  = $UserOu
    AccountPassword       = $Kennwort
    Enabled               = $false
    ChangePasswordAtLogon = $true
    Server                = $Server
}

New-ADUser @NeuerBenutzer -WhatIf

Diese Schreibweise heißt Splatting: Du sammelst Parameter in einer Tabelle und übergibst sie gemeinsam. Das erleichtert die Kontrolle von längeren Befehlen.

Nach einer tatsächlichen Ausführung bleibt das Konto zunächst deaktiviert. Du kannst dadurch Eigenschaften und Gruppen in Ruhe vorbereiten und das Konto erst zum vorgesehenen Zeitpunkt aktivieren. Prüfe vorher, ob der SAM-Kontoname und der UPN bereits vergeben sind.

Beachte eine wichtige Besonderheit: Scheitert das Setzen des Kennworts an einer Richtlinie, kann das Benutzerobjekt trotzdem angelegt worden sein. Kontrolliere nach einem Fehler daher erst den Kontostand, statt den Anlagebefehl blind erneut auszuführen. Eine neue AD-Identität erhält außerdem nicht automatisch ein Exchange-Postfach oder eine Microsoft-365-Lizenz.

Benutzerattribute mit Set-ADUser ändern

Abteilung, Standort und Position lassen sich gemeinsam aktualisieren:

Set-ADUser -Identity 'anna.beispiel' -Department 'IT' -Office 'Muenchen' -Title 'Systemadministration' -Server $Server -WhatIf

Nach der tatsächlichen Änderung prüfst Du die Werte möglichst auf demselben Domänencontroller:

Get-ADUser -Identity 'anna.beispiel' -Server $Server -Properties Department, Office, Title |
    Select-Object SamAccountName, Department, Office, Title

Für Eigenschaften ohne eigenen Parameter unterstützt Set-ADUser unter anderem -Replace, -Add, -Remove und -Clear. Hier benötigst Du die tatsächlichen LDAP-Attributnamen. Das Ändern von AD-Benutzerinformationen mit Set-ADUser ist ein eigener Themenbereich, besonders bei mehrwertigen Attributen.

Gruppenmitgliedschaften verwaltest Du dagegen über die Gruppen-Cmdlets. Eine Änderung von EmailAddress bearbeitet nur das entsprechende AD-Attribut und ist keine vollständige Verwaltung eines Exchange-Empfängers.

AD-Kennwörter zurücksetzen und gesperrte Konten entsperren
KI-generierte Darstellung, kein Original-Screenshot.

AD-Kennwörter zurücksetzen und gesperrte Konten entsperren

Gesperrte Benutzerkonten finden

Ein gesperrtes Konto ist nicht dasselbe wie ein deaktiviertes Konto. Eine Sperre kann durch zu viele fehlerhafte Kennworteingaben entstehen. Eine Deaktivierung ist eine eigene administrative Einstellung.

Search-ADAccount -LockedOut -UsersOnly -SearchBase $UserOu -Server $Server |
    Select-Object Name, SamAccountName, DistinguishedName

Mit UsersOnly beschränkst Du die Ergebnisse auf Benutzer. Prüfe vor einer Entsperrung die Identität der anfragenden Person und den Anlass der Sperre.

Unlock-ADAccount -Identity 'anna.beispiel' -Server $Server -WhatIf

Wird das Konto kurz danach erneut gesperrt, suche nach gespeicherten alten Zugangsdaten, Diensten oder geplanten Aufgaben. Wiederholtes Entsperren beseitigt diese Ursache nicht. Die Fehlersuche bei gesperrten Active Directory Benutzerkonten sollte deshalb Teil des Ablaufs sein.

Ein AD-Kennwort mit PowerShell zurücksetzen

Für einen administrativen Kennwortreset verwendest Du Set-ADAccountPassword mit Reset. Das alte Kennwort wird dafür nicht benötigt, wohl aber die Berechtigung zum Zurücksetzen:

$NeuesKennwort = Read-Host 'Neues individuelles Kennwort eingeben' -AsSecureString

Set-ADAccountPassword -Identity 'anna.beispiel' -Reset -NewPassword $NeuesKennwort -Server $Server -WhatIf

Erst nachdem der tatsächliche Reset erfolgreich war, kannst Du für ein persönliches Benutzerkonto den Kennwortwechsel bei der nächsten Anmeldung vorbereiten:

Set-ADUser -Identity 'anna.beispiel' -ChangePasswordAtLogon $true -Server $Server -WhatIf

Diese Einstellung passt nicht zu jedem Kontotyp. Bei Dienstkonten kann ein erzwungener Kennwortwechsel Abläufe unterbrechen. Außerdem lässt sie sich nicht mit PasswordNeverExpires auf true kombinieren. Beim Ändern eines AD-Kennworts per PowerShell gehören daher auch Kontozweck, sicherer Übermittlungsweg und mögliche Anwendungsabhängigkeiten zur Vorbereitung.

Die wirksame Kennwortrichtlinie eines Benutzers prüfen

Für einzelne Benutzer können fein abgestufte Kennwortrichtlinien gelten. Deshalb reicht es nicht immer, nur die Standardrichtlinie der Domäne zu betrachten.

$Richtlinie = Get-ADUserResultantPasswordPolicy -Identity 'anna.beispiel' -Server $Server -ErrorAction Stop

if ($null -eq $Richtlinie) {
    $Richtlinie = Get-ADDefaultDomainPasswordPolicy -Identity $Domain.DNSRoot -Server $Server
}

$Richtlinie | Select-Object MinPasswordLength, MaxPasswordAge, LockoutThreshold, LockoutDuration

Liefert die erste Abfrage kein Richtlinienobjekt, zeigt das Beispiel die Standardkennwortrichtlinie der Domäne. Die Fine Grained Password Policies im Active Directory erklären, warum für unterschiedliche Benutzer verschiedene Anforderungen gelten können.

Active Directory Gruppen und Mitglieder mit PowerShell verwalten
KI-generierte Darstellung, kein Original-Screenshot.

Active Directory Gruppen und Mitglieder mit PowerShell verwalten

Gruppen finden und Mitgliedschaften richtig auswerten

Eine Sicherheitsgruppe bündelt und beinhaltet Konten, denen Du gemeinsam Berechtigungen zuweisen kannst. Diese Abfrage zeigt Gruppen mit dem Namensanfang GG_:

Get-ADGroup -Filter {Name -like 'GG_*'} -SearchBase $GroupOu -Server $Server |
    Select-Object Name, GroupScope, GroupCategory, DistinguishedName

Die unmittelbaren Mitglieder einer bestimmten Gruppe liest Du dann so aus:

Get-ADGroupMember -Identity 'GG_ProjektA' -Server $Server |
    Select-Object Name, SamAccountName, ObjectClass

Das Ergebnis kann Benutzer, Computer und weitere Gruppen enthalten. Um verschachtelte Gruppen aufzulösen und nur Benutzerkonten aufzulisten, verwendest Du:

Get-ADGroupMember -Identity 'GG_ProjektA' -Recursive -Server $Server |
    Where-Object ObjectClass -eq 'user' |
    Select-Object Name, SamAccountName

Recursive liefert eine aufgelöste Mitgliederliste, aber keinen vollständigen Mitgliedschaftspfad. Du siehst also nicht, über welche Zwischengruppe ein Benutzer aufgenommen wurde. Für Berechtigungsanalysen musst Du die Gruppenstruktur zusätzlich berücksichtigen.

Die umgekehrte Abfrage nach Gruppen eines Benutzers lautet:

Get-ADPrincipalGroupMembership -Identity 'anna.beispiel' -Server $Server |
    Select-Object Name, GroupScope, GroupCategory

Dieser Befehl benötigt einen erreichbaren globalen Katalog. Sein Ergebnis ist keine vollständige Prüfung der effektiven Zugriffsrechte. Auch das Benutzerattribut memberOf bildet nicht sämtliche verschachtelten Mitgliedschaften und nicht die primäre Gruppe ab. Für einfache Bestandslisten findest Du weitere Anregungen zum Exportieren von Active Directory Gruppen.

Eine Sicherheitsgruppe anlegen und Mitglieder bearbeiten

Das folgende Beispiel bereitet eine globale Sicherheitsgruppe in der vorhandenen Gruppen-OU vor:

New-ADGroup -Name 'GG_ProjektA' -SamAccountName 'GG_ProjektA' -GroupCategory Security -GroupScope Global -Path $GroupOu -Server $Server -WhatIf

Global eignet sich beispielsweise zum Zusammenfassen von Benutzerkonten derselben Domäne. Gruppenbereich und Verschachtelung sollten zu Deinem Berechtigungskonzept passen. Die Gruppe allein gewährt noch keinen Zugriff auf eine Freigabe, solange ihr dort keine Berechtigung zugeordnet wurde.

Bei einer bereits vorhandenen Gruppe fügst Du ein Konto so hinzu:

Add-ADGroupMember -Identity 'GG_ProjektA' -Members 'anna.beispiel' -Server $Server -WhatIf

Eine direkte Mitgliedschaft entfernst Du mit:

Remove-ADGroupMember -Identity 'GG_ProjektA' -Members 'anna.beispiel' -Server $Server -WhatIf

Behandle eine Gruppenänderung wie eine Berechtigungsänderung. Über einen anderen Mitgliedschaftspfad kann der Zugriff weiterhin bestehen. Außerdem wirken Änderungen nicht zwangsläufig sofort in bereits bestehenden Sitzungen. Eine erneute Anmeldung kann erforderlich sein, damit ein aktualisierter Sicherheitskontext verwendet wird.

AD-Computer mit PowerShell abfragen und einordnen
KI-generierte Darstellung, kein Original-Screenshot.

AD-Computer mit PowerShell abfragen und einordnen

Computerkonten und gespeicherte Betriebssystemdaten anzeigen

Mit Get-ADComputer untersuchst Du Computerobjekte innerhalb einer OU:

Get-ADComputer -Filter * -SearchBase $ComputerOu -Server $Server -Properties OperatingSystem, OperatingSystemVersion, LastLogonDate |
    Select-Object Name, Enabled, OperatingSystem, OperatingSystemVersion, LastLogonDate

Diese Werte stammen aus dem Verzeichnis. Die Abfrage kontaktiert nicht jeden Computer und ist deshalb weder eine Erreichbarkeitsprüfung noch eine aktuelle Hardware- oder Patchinventur. Ein aktiviertes Computerkonto bedeutet nicht, dass das Gerät eingeschaltet ist.

Warum LastLogonDate kein genauer Aktivitätsnachweis ist

LastLogonDate wird aus dem replizierten Attribut lastLogonTimestamp abgeleitet. Dessen Aktualisierung erfolgt nicht bei jeder Anmeldung. Bei Standardkonfiguration kann ein Aktualisierungsintervall von ungefähr 9 bis 14 Tagen entstehen. Das ist keine Aussage darüber, dass jede AD-Replikation so lange dauert.

Das Attribut lastLogon ist dagegen nicht zwischen den Domänencontrollern repliziert. Für den neuesten dort gespeicherten Anmeldewert müsstest Du alle zuständigen Domänencontroller abfragen und den höchsten Wert vergleichen. Auch damit erfasst Du nicht automatisch Offline-Anmeldungen oder reine Cloud-Aktivität.

Nutze Anmeldedaten deshalb als Hinweis für eine Prüfung, nicht als alleinige Löschentscheidung. Ein leerer Zeitstempel beweist ebenfalls nicht zuverlässig, dass ein Objekt niemals verwendet wurde.

Organisationseinheiten anlegen und AD-Objekte verschieben

Die OU-Struktur anzeigen und eine Test-OU vorbereiten

Organisationseinheiten strukturieren AD-Objekte und dienen unter anderem als Ansatzpunkt für Delegierungen und Gruppenrichtlinien. Vor einer Änderung verschaffst Du Dir einen Überblick:

Get-ADOrganizationalUnit -Filter * -SearchBase $DomainDn -Server $Server |
    Select-Object Name, DistinguishedName

Eine zusätzliche OU lässt sich mit ausdrücklich aktiviertem Schutz vor versehentlichem Löschen vorbereiten:

New-ADOrganizationalUnit -Name 'Testkonten' -Path $DomainDn -ProtectedFromAccidentalDeletion $true -Server $Server -WhatIf

Eine Test-OU ist nur eine organisatorische Trennung, keine eigenständige Sicherheits- oder Laborumgebung. Auch dort können geerbte Richtlinien und andere Domänenvorgaben gelten.

Einen Benutzer kontrolliert in eine andere OU verschieben

Prüfe bitte zuerst, ob die Ziel-OU existiert. Anschließend verwendest Du die eindeutige Objekt-GUID des ausgewählten Benutzers:

$ZielOu = "OU=Testkonten,$DomainDn"
Get-ADOrganizationalUnit -Identity $ZielOu -Server $Server -ErrorAction Stop

$Benutzer = Get-ADUser -Identity 'anna.beispiel' -Server $Server -ErrorAction Stop
Move-ADObject -Identity $Benutzer.ObjectGUID -TargetPath $ZielOu -Server $Server -WhatIf

Ein OU-Wechsel kann andere Gruppenrichtlinien und delegierte Verwaltungsrechte wirksam machen. In hybriden Umgebungen kann zusätzlich eine OU-basierte Synchronisationsauswahl betroffen sein. Prüfe diese Auswirkungen vor dem Verschieben. Hebe einen bestehenden Löschschutz nicht pauschal auf, nur um eine Fehlermeldung zu umgehen.

AD-Benutzer deaktivieren, aktivieren und sicher löschen

Bei einem Austritt ist die kontrollierte Deaktivierung häufig der erste technische Schritt. Die dazugehörige Vorschau lautet:

Disable-ADAccount -Identity 'anna.beispiel' -Server $Server -WhatIf

Das Deaktivieren verhindert nicht zuverlässig jede weitere Nutzung einer bereits aufgebauten Sitzung. Aktive Verbindungen, Cloud-Sitzungen, Anwendungen und weitere Zugangsmöglichkeiten musst Du im jeweiligen Austrittsprozess gesondert berücksichtigen.

Ein vorbereitetes oder zuvor deaktiviertes Konto aktivierst Du mit:

Enable-ADAccount -Identity 'max.beispiel' -Server $Server -WhatIf

Das endgültige Löschen eines Benutzers ist eine andere Entscheidung. Kläre zuvor Zuständigkeit, Aufbewahrung, Datenzugriffe und Wiederherstellbarkeit. Prüfe das Objekt noch einmal vollständig, bevor Du eine Löschung freigibst:

$Loeschkandidat = Get-ADUser -Identity 'anna.beispiel' -Server $Server -ErrorAction Stop
$Loeschkandidat | Select-Object Name, SamAccountName, Enabled, DistinguishedName, ObjectGUID

Remove-ADUser -Identity $Loeschkandidat.ObjectGUID -Server $Server -WhatIf

Verbinde eine Suche nach alten Konten nicht ungeprüft mit einem Löschbefehl. Eine Liste von Kandidaten, die fachliche Freigabe und eine einzelne nachvollziehbare Aktion sind deutlich besser kontrollierbar.

Active Directory Berichte erstellen und CSV-Dateien verwenden

Benutzerinformationen als CSV exportieren

Ein CSV-Bericht eignet sich zum Prüfen von Kontodaten oder als dokumentierter Ausgangsstand vor Attributänderungen. Dieses Beispiel erstellt einen Berichtsordner im Benutzerprofil und einen Dateinamen mit Zeitstempel:

$ReportDir = Join-Path $env:USERPROFILE 'AD-Berichte'
New-Item -Path $ReportDir -ItemType Directory -Force | Out-Null

$Zeitstempel = Get-Date -Format 'yyyyMMdd-HHmmss'
$Datei = Join-Path $ReportDir "AD-Benutzer-$Zeitstempel.csv"

Get-ADUser -Filter * -SearchBase $UserOu -Server $Server -Properties Department, Office, EmailAddress |
    Select-Object Name, SamAccountName, Enabled, Department, Office, EmailAddress |
    Export-Csv -Path $Datei -Delimiter ';' -NoTypeInformation -Encoding UTF8 -NoClobber

NoClobber verhindert, dass eine bereits vorhandene Datei gleichen Namens überschrieben wird. Das Semikolon passt zu vielen deutschen Excel-Umgebungen. Wähle beim Import in Excel bei Bedarf ausdrücklich das Trennzeichen und die Zeichencodierung.

Unter Windows PowerShell 5.1 schreibt UTF8 eine Byte-Reihenfolge-Markierung, kurz BOM. Unter PowerShell 7 wählst Du bei Bedarf -Encoding utf8BOM, wenn Excel die UTF-8-Datei beim direkten Öffnen sonst falsch erkennt.

Verwende vor Export-Csv niemals Format-Table oder Format-List. Diese Befehle erzeugen Formatierungsinformationen statt der gewünschten Datenobjekte. Mit Select-Object legst Du hingegen die tatsächlichen Spalten fest. Der Export einer AD-Benutzerliste in eine CSV-Datei lässt sich so gezielt an Deinen Bericht anpassen.

AD-Berichte enthalten oft personenbezogene Informationen. Speichere sie nur an vorgesehenen Orten, beschränke den Zugriff und lösche nicht mehr benötigte Arbeitskopien.

Inaktive Konten als Prüfliste zusammenstellen

Mit Search-ADAccount suchst Du nach Benutzerkonten, die anhand der ausgewerteten AD-Anmeldedaten seit mindestens 90 Tagen inaktiv erscheinen:

Search-ADAccount -AccountInactive -TimeSpan ([TimeSpan]::FromDays(90)) -UsersOnly -SearchBase $UserOu -Server $Server |
    Select-Object Name, SamAccountName, Enabled, LastLogonDate

Für Computerkonten verwendest Du stattdessen ComputersOnly und die passende Computer-OU:

Search-ADAccount -AccountInactive -TimeSpan ([TimeSpan]::FromDays(90)) -ComputersOnly -SearchBase $ComputerOu -Server $Server |
    Select-Object Name, Enabled, LastLogonDate

Die zuvor beschriebenen Grenzen der Anmeldezeitstempel gelten auch hier. Berücksichtige beispielsweise ausgeschaltete Reservegeräte, saisonal genutzte Konten und längere Abwesenheiten. Die Ergebnisse sind Kandidaten zur Überprüfung, keine automatische Bereinigungsliste.

Mehrere Benutzerattribute aus einer CSV-Datei ändern

Für eine kleine vorbereitete Sammeländerung kann die Eingabedatei so aussehen. Beide Benutzer müssen bereits existieren:

SamAccountName;Department;Office
anna.beispiel;IT;Muenchen
max.beispiel;Vertrieb;Berlin

Speichere diese Datei UTF-8-codiert als AD-Aenderungen.csv im zuvor angelegten Berichtsordner. Prüfe vorher die Spaltennamen und entferne doppelte Zeilen für denselben Benutzer. Das folgende Beispiel akzeptiert nur vollständig ausgefüllte Zeilen und sucht ausschließlich innerhalb der Benutzer-OU:

$Eingabe = Join-Path $ReportDir 'AD-Aenderungen.csv'
$Aenderungen = Import-Csv -Path $Eingabe -Delimiter ';' -Encoding UTF8 -ErrorAction Stop

foreach ($Zeile in $Aenderungen) {
    try {
        $Sam = [string]$Zeile.SamAccountName
        $Abteilung = [string]$Zeile.Department
        $Buero = [string]$Zeile.Office

        if ([string]::IsNullOrWhiteSpace($Sam) -or
            [string]::IsNullOrWhiteSpace($Abteilung) -or
            [string]::IsNullOrWhiteSpace($Buero)) {
            throw 'Mindestens ein Pflichtfeld fehlt.'
        }

        $Treffer = @(Get-ADUser -Filter {SamAccountName -eq $Sam} -SearchBase $UserOu -Server $Server -ErrorAction Stop)

        if ($Treffer.Count -ne 1) {
            throw 'Benutzer nicht eindeutig innerhalb der vorgesehenen OU gefunden.'
        }

        Set-ADUser -Identity $Treffer[0].ObjectGUID -Department $Abteilung -Office $Buero -Server $Server -WhatIf -ErrorAction Stop
    }
    catch {
        Write-Warning "Zeile fuer '$($Zeile.SamAccountName)' uebersprungen: $($_.Exception.Message)"
    }
}

Das Skript überspringt fehlerhafte Zeilen und setzt die Verarbeitung fort. Es ist keine gemeinsame Transaktion: Wenn Du WhatIf später entfernst, werden vorherige erfolgreiche Änderungen bei einem späteren Fehler nicht automatisch zurückgenommen. Exportiere deshalb zunächst die bisherigen Werte und vergleiche das tatsächliche Ergebnis nach der Ausführung mit Deiner freigegebenen Änderungsdatei.

Domänencontroller und AD-Replikation mit PowerShell prüfen
KI-generierte Darstellung, kein Original-Screenshot.

Domänencontroller und AD-Replikation mit PowerShell prüfen

Zur Orientierung kannst Du die Domänencontroller einschließlich Standort, globalem Katalog und Schreibschutz auflisten:

Get-ADDomainController -Filter * -Server $Server |
    Select-Object HostName, Site, IsGlobalCatalog, IsReadOnly

Gemeldete Replikationsfehler eines bestimmten Domänencontrollers fragst Du so ab:

Get-ADReplicationFailure -Target $Server -Scope Server -ErrorAction Stop |
    Select-Object Server, Partner, FailureCount, FirstFailureTime, LastError

Eine leere Ausgabe bedeutet, dass diese Abfrage keine entsprechenden Fehler zurückgeliefert hat. Sie ersetzt keine vollständige Zustandsprüfung des Active Directory. Wenn eine Änderung auf einem anderen Domänencontroller noch nicht sichtbar ist, helfen der Vergleich auf demselben Server und eine gezielte Untersuchung der Replikation.

Typische Fehler bei Active Directory PowerShell Befehlen lösen

Get-ADUser wird nicht als Befehl erkannt

Prüfe bitte mit Get-Module -ListAvailable ActiveDirectory, ob die Komponente in der geöffneten PowerShell verfügbar ist. Fehlt sie, kontrolliere die RSAT-Installation. Ist sie vorhanden, lade sie mit Import-Module. Das Windows-Modul ActiveDirectory installierst Du nicht über Install-Module aus einer beliebigen Paketquelle.

Der Server ist nicht erreichbar oder AD Web Services fehlen

Kontrolliere zuerst den eingetragenen Servernamen, die DNS-Auflösung und gegebenenfalls Deine VPN-Verbindung. Diese beiden Befehle prüfen die Namensauflösung und den TCP-Port der Active Directory Web Services:

Resolve-DnsName $Server
Test-NetConnection -ComputerName $Server -Port 9389

Ein erfolgreicher Porttest bestätigt nur die betreffende TCP-Verbindung. Für funktionierende AD-Abfragen müssen auch Anmeldung, Namensauflösung und weitere erforderliche Kommunikationswege stimmen. Deaktiviere deshalb nicht pauschal die Firewall.

Direkt auf dem betroffenen Domänencontroller kannst Du außerdem den Dienststatus prüfen:

Get-Service -Name ADWS

Auf einem gewöhnlichen Verwaltungs-PC ist dieser Serverdienst nicht zu erwarten. Der Befehl muss daher tatsächlich auf dem richtigen System ausgeführt werden. Mehr zur gezielten Dienstabfrage mit Get-Service findest Du in der passenden Anleitung.

Zugriff verweigert, Objekt nicht gefunden oder Änderung nicht sichtbar

Bei Zugriff verweigert prüfst Du das verwendete Domänenkonto, delegierte Rechte und den Schutz des Zielobjekts. Ein beschreibbarer Domänencontroller ist für Änderungen ebenfalls erforderlich. Ein zweites Administratorkonto testest Du bei Bedarf gezielt mit Get-Credential und dem unterstützten Parameter Credential, statt Kennwörter in Skripten zu speichern.

Wird ein Objekt nicht gefunden, kontrolliere den ausgewählten Server beziehungsweise die Domäne, den SAM-Kontonamen und den Suchbereich. Verwende für einen bekannten UPN die gezeigte Filterabfrage. Bei leeren Ausgaben prüfst Du zusätzlich, ob die Filterbedingungen tatsächlich zu Deinen AD-Daten passen.

Eine unveränderte Eigenschaft nach einem Schreibbefehl kann außerdem schlicht daran liegen, dass WhatIf noch aktiv war. Wurde die Aktion tatsächlich ausgeführt, lies das Ergebnis zunächst auf demselben Domänencontroller zurück, bevor Du eine Replikationsstörung vermutest.

Abfragen dauern lange oder liefern unübersichtliche Ergebnisse

Begrenze große Abfragen bereits im AD mit Filter und SearchBase. Fordere unter Properties nur die benötigten Attribute an. Properties mit einem Sternchen ist für eine gezielte Einzelanalyse hilfreich, aber kein sinnvoller Standard für jeden domänenweiten Bericht. Filtere außerdem nicht erst nachträglich mit Where-Object, wenn sich dieselbe Einschränkung direkt in der Verzeichnisabfrage ausdrücken lässt.

FAQ: Häufige Fragen zu PowerShell Befehlen für Active Directory

Kann ich mit Get-ADUser das Kennwort eines Benutzers auslesen?

Nein. Get-ADUser liefert kein vorhandenes Kennwort im Klartext zurück. Du kannst bestimmte Kennwort- und Kontoeigenschaften abfragen oder mit den passenden Berechtigungen ein neues Kennwort setzen, aber nicht das bisherige Kennwort anzeigen lassen.

Ist ein CSV-Export ein vollständiges Active Directory Backup?

Nein. Eine CSV-Datei enthält nur die ausgewählten und exportierten Werte. Sie sichert weder den vollständigen Verzeichniszustand noch Kennwörter und sämtliche Berechtigungen. Für die Wiederherstellung Deiner Domäne brauchst Du ein eigenständiges, überprüftes Sicherungs- und Wiederherstellungskonzept.

Liefert Get-ADUser höchstens 256 Benutzer zurück?

Nein. Die standardmäßige Seitengröße von 256 Objekten ist keine Gesamtbegrenzung. Der Befehl kann mehrere Ergebnisseiten abrufen. Eine ausdrücklich gesetzte Obergrenze steuerst Du über ResultSetSize, während ResultPageSize die Größe der einzelnen Ergebnisseiten bestimmt.

Warum steht in einem CSV-Bericht System.Object[] statt einer Liste?

Mehrwertige Eigenschaften können mehrere Einträge enthalten, die Export-Csv nicht automatisch zu einem gut lesbaren Text verbindet. Wandle solche Werte vor dem Export mit einer berechneten Eigenschaft und dem Operator -join in eine Zeichenfolge um. Wähle dafür ein geeignetes Trennzeichen innerhalb der Zelle.

Stellt ein neuer Benutzer mit demselben Namen ein gelöschtes Konto wieder her?

Nein. Ein neu angelegtes Konto erhält eine andere Sicherheitskennung und ist nicht dieselbe Identität. Alte Berechtigungszuordnungen werden dadurch nicht automatisch wiederhergestellt. Prüfe deshalb eine geeignete Wiederherstellung des ursprünglichen Objekts, statt es lediglich unter demselben Namen neu anzulegen.

Wie speichere ich wiederkehrende AD-Befehle als PowerShell-Skript?

Speichere zusammengehörige Befehle in einer Datei mit der Endung .ps1. Nimm den Modulimport und die benötigten Variablen in das Skript auf. Trenne reine Berichte von Änderungen und führe einen neuen Ablauf zuerst mit wenigen Testobjekten aus. Beachte dabei die Skriptausführungs- und Signaturvorgaben Deiner Organisation.

Fazit: Active Directory mit PowerShell gezielt und sicher verwalten

Die wichtigsten PowerShell Befehle für Active Directory decken in der Regel einen großen Teil der täglichen Arbeit mit dem AD ab. Wichtig ist, das richtige Objekt auszuwählen und die gewünschten Informationen auslesen oder verändern zu können.

Aus unserer Erfahrung heraus würden wir dazu raten, mit lesenden AD-Abfragen zu beginnen. Sobald Filter, OU-Pfade und Berechtigungen klar sind, kannst Du wiederkehrende Aufgaben automatisieren. Solltest Du im Umgang sicher sein, so stehen auch Änderungen im AD per PowerShell nichts mehr im Wege.