Dreaming Andy - Fotolia

Windows-Berechtigungen mit der PowerShell verwalten

Unter Windows lassen sich NFTS-Berechtigungen mit der PowerShell anpassen oder überprüfen. Das geht oft schneller als in der grafischen Oberfläche und lässt sich in Skripte packen.

Mit der PowerShell lassen sich Berechtigungen in Windows für NTFS und ReFS anzeigen und auch verwalten. Dazu kommen Möglichkeiten Probleme auf den Dateisystemen zu erkennen und korrupte Bereiche mit der PowerShell zu reparieren, um Datenverlust zu vermeiden. Um zum Beispiel zu überprüfen, ob das Laufwerk C in einem Rechner noch in Ordnung ist, kann der folgende Befehl zum Einsatz kommen:

Get-VolumeCorruptionCount -Verbose C

In der PowerShell können alle verfügbaren Rechte für Dateien und Verzeichnisse mit dem folgenden Befehl angezeigt werden:

[system.enum]::getnames([System.Security.AccessControl.FileSystemRights])

Abbildung 1: Die verfügbaren Berechtigungen für Ordner und Dateien in Windows mit der PowerShell anzeigen.
Abbildung 1: Die verfügbaren Berechtigungen für Ordner und Dateien in Windows mit der PowerShell anzeigen.

Berechtigungen auslesen und auf andere Objekte kopieren

Um zum Beispiel die Berechtigungen für einen Pfad anzuzeigen, kann das folgende Cmdlet zum Einsatz kommen:

Get-ACL -Path “Z:\vm”

Für die Anzeige der Berechtigungen muss nur der jeweilige Pfad angegeben werden. Die Anzeige lässt sich natürlich noch detaillierter darstellen, indem mit der Pipe die Ausgabe an das Cmdlet Format-List weitergegeben wird.

Get-ACL -Path “Z:\vm” |fl

Abbildung 2: Die Berechtigungen für ein Verzeichnis in der PowerShell auslesen.
Abbildung 2: Die Berechtigungen für ein Verzeichnis in der PowerShell auslesen.

Wenn ein Ordner mit umfassenderen Rechten konfiguriert ist, zeigt die PowerShell das ebenfalls mit dem oberen Cmdlet an. Durch diesen kurzen Befehl lassen sich daher auch komplexe Berechtigungsdaten auslesen und bei Bedarf auch in Variablen speichern. Das zeigen wir ebenfalls in den folgenden Abschnitten.

Abbildung 3: Die erweiterten Berechtigungen für einen Ordner ausgeben.
Abbildung 3: Die erweiterten Berechtigungen für einen Ordner ausgeben.

Neben dem Anzeigen von Berechtigungen mit Get-ACL bietet die PowerShell auch die Möglichkeit an Berechtigungen anzupassen. Dazu steht das Cmdlet Set-ACL zur Verfügung. Mit dem Befehl können zum Beispiel Berechtigungen einer Datei oder eines Verzeichnisses auf eine andere Datei oder für ein anderes Verzeichnis kopiert werden:

Get-Acl -Path "C:\datei1.txt" | Set-Acl -Path "C:\datei2.txt"

Im ersten Schritt liest Get-ACL die Berechtigungen aus und übergibt sie an Set-ACL zum Anpassen der Rechte auf dem Zielobjekt. Das funktioniert auch von Ordnern zu Ordnern oder von Ordnern zu Dateien.

Vererbung deaktivieren und manuell Rechte setzen

Mit Set-ACL ist es ebenfalls möglich erweiterte Rechte zu setzen und zu Beispiel die Vererbung der Berechtigungen für einen Ordner oder einer Datei zu deaktivieren. Standardmäßig erben Verzeichnisse in Windows die Rechte von übergeordneten Verzeichnissen. In der PowerShell können diese Möglichkeiten zum Beispiel dazu genutzt werden für eine Datei die Vererbung zu deaktivieren und explizite Rechte zu setzen. Dazu können verschiedene Systeme mit einander kombiniert werden.

Mit dem folgenden Befehl liest die PowerShell die Berechtigungen der Datei Daten.txt ein und speichert sie in einer Variablen:

$NewAcl = Get-Acl -Path "C:\Daten\Daten.txt"

Danach lassen sich die konfigurierten Rechte vor der Vererbung schützen, indem die folgende Variable gesetzt wird:

$isProtected = $true

Mit dem Wert $false kann die Vererbung aktiviert werden. Windows kann die geerbten Berechtigungen aber für die jeweilige Datei dennoch übernehmen, auch wenn die Vererbung deaktiviert ist. Auch das kann mit dem Setzen einer Variablen erfolgen:

$preserveInheritance = $true

Danach erfolgt die Umsetzung des Befehls auf Basis der definierten Variablen:

$NewAcl.SetAccessRuleProtection($isProtected, $preserveInheritance)

Set-Acl -Path "C:\Daten\Daten.txt" -AclObject $NewAcl

Der Befehl setzt die Berechtigungen vom Ordner C:\Daten auf die Datei Daten.txt und deaktiviert die Vererbung. Parallel dazu lassen sich auf diesem Weg aber auch Rechte direkt setzen. Auf ähnlichem Weg ist es auch möglich den Besitzer eines Ordners zu ändern, zum Beispiel mit:

$acl = Get-Acl c:\daten

$object = New-Object System.Security.Principal.Ntaccount("joos\thomas")

$acl.SetOwner($object)

$acl | Set-Acl c:\daten

Das Beispiel ändert den Ordnerbesitzer von C:\daten auf den Benutzer thomas der Domäne joos.

Berechtigungen setzen und entfernen

Im folgenden Beispiel setzen wir die Rechte des Benutzers joos\thomas für den Ordner Vertrieb auf FullControl (Vollzugriff) und Allow (Zulassen). Dazu werden die aktuellen Rechte zuerst in einer Variablen gespeichert:

$acl = Get-Acl \\fs1\shared\vertrieb

Danach werden die neuen Rechte ebenfalls in einer Variablen gespeichert:

$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("Joos\thomas","FullControl","Allow")

Anschließend setzen wir die neue Zugriffsregel und bearbeiten die Berechtigungen des Ordners:

$acl.SetAccessRule($AccessRule)

$acl | Set-Acl \\fs1\shared\vertrieb

Auf dem gleichen Weg lassen sich die gesetzten Rechte auch wieder entfernen:

$acl = Get-Acl \\fs1\shared\vertrieb

$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("joos\thomas","FullControl","Allow")

$acl.RemoveAccessRule($AccessRule)

$acl | Set-Acl \\fs1\shared\vertrieb

Neben FullControl stehen hier auch Read, Write und Modify zur Verfügung. Auch diese Rechte lassen sich hinzufügen oder entfernen. Um alle Einträge zu entfernen, zum Beispiel um diese neu zu setzen, kommen folgende Befehle zum Einsatz:

$acl = Get-Acl \\fs1\shared\vertrieb

$usersid = New-Object System.Security.Principal.Ntaccount ("joos\thomas")

$acl.PurgeAccessRules($usersid)

$acl | Set-Acl \\fs1\shared\vertrieb

Diese Befehle können natürlich für verschiedene Benutzerkonten, Gruppen und Freigaben oder Ordner zum Einsatz kommen. In einem weiteren Beispiel setzen wir die Rechte für den Benutzer thomas für die Datei geheim.txt im Verzeichnis D:\Daten auf Lesen.

$Rechte = Get-ACL -Path “D:\Daten\geheim.txt”

$NEURechte = New-Object System.Security.AccessControl.FileSystemAccessRule(“joos\thomas”,”Read”,”Allow”)

$Rechte.SetAccessRule($NEURechte)

$Rechte | Set-Acl -Path “D:\Daten\geheim.txt”

Auf die gleiche Art und Weise lassen sich auch Rechte für Ordner setzen oder auch andere Rechte, die wir in diesem Beitrag behandelt haben. Es ist auch möglich mehrere Rechte zu setzen, zum Beispiel mit:

$NEURechte = New-Object System.Security.AccessControl.FileSystemAccessRule(“joos\thomas”,”ReadData,WriteData“,”Allow”)

Abbildung 4: Rechte lassen sich auslesen und übersichtlich in einer Tabelle anzeigen.
Abbildung 4: Rechte lassen sich auslesen und übersichtlich in einer Tabelle anzeigen.

Die wichtigsten Eigenschaften, die sich setzen lassen, sind:

  • AppendData - Daten anhängen
  • ChangePermissions - Berechtigungen ändern
  • CreateDirectories - Ordner erstellen
  • CreateFiles - Datei erstellen
  • Delete - Löschen
  • FullControl - Vollzugriff
  • ListDirectory Ordner listen
  • Modify - Ändern
  • Read - Lesen
  • ReadAndExecute - Lesen, Ausführen
  • Write - Schreiben
  • WriteData - Schreiben

Rechte lassen sich auf diesem Weg dann auch auslesen, zum Beispiel für den Ordner Windows:

Get-Acl -Path „C:\Windows“ | Select-Object -ExpandProperty Access | Format-Table -Autosize

Erfahren Sie mehr über Desktop-Management