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.
| Aufgabe | PowerShell Befehl | Wirkung im AD |
|---|---|---|
| Benutzer suchen und Eigenschaften anzeigen | Get-ADUser | Lesend |
| Benutzer anlegen | New-ADUser | Ändernd |
| Benutzereigenschaften bearbeiten | Set-ADUser | Ändernd |
| Kontostatus untersuchen | Search-ADAccount | Lesend |
| Kennwort zurücksetzen | Set-ADAccountPassword | Ändernd |
| Kontosperre aufheben | Unlock-ADAccount | Ändernd |
| Konto aktivieren oder deaktivieren | Enable-ADAccount, Disable-ADAccount | Ändernd |
| Gruppen und Mitglieder anzeigen | Get-ADGroup, Get-ADGroupMember | Lesend |
| Gruppenmitgliedschaften eines Kontos abfragen | Get-ADPrincipalGroupMembership | Lesend |
| Mitglieder hinzufügen oder entfernen | Add-ADGroupMember, Remove-ADGroupMember | Ändernd |
| Computer und Organisationseinheiten anzeigen | Get-ADComputer, Get-ADOrganizationalUnit | Lesend |
| Gruppen oder Organisationseinheiten anlegen | New-ADGroup, New-ADOrganizationalUnit | Ändernd |
| Objekte verschieben oder Benutzer löschen | Move-ADObject, Remove-ADUser | Ändernd |
| Domäne und Domänencontroller untersuchen | Get-ADDomain, Get-ADDomainController | Lesend |

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
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
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
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
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
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
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.
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.
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.
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.
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.
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.

Neueste Kommentare