Tags: Dateisystem, Rechteverwaltung, PowerShell, NTFS
Während sich Hyper-V oder das Active Directory praktisch vollständig über PowerShell verwalten lassen, fällt die Unterstützung für das Management der NTFS-Zugriffsrechte immer noch mager aus. Diese Lücke schließt das Modul NTFSSecurity des Microsoft-Mitarbeiters Raimund Andrée mit insgesamt 36 Cmdlets.
Zum Lieferumfang von PowerShell gehören mit Get-Acl und Set-Acl zwei Cmdlets, die alle wesentlichen Anforderungen bei der Vergabe von Zugriffsrechten auf Dateien und Verzeichnisse bewältigen sollen. Hinzu kommen über 30 Methoden von AccessControl-Objekten.
Umständliches Hantieren mit eingebauten Funktionen
Auch wenn damit ein erheblicher Funktionsumfang bereitsteht, so ist die Nutzung dieser Mittel für die gängigen Aufgaben ziemlich umständlich.
Das Ändern von Zugriffsrechten mit Set-Acl setzt immer voraus, dass man eine Datei oder ein Verzeichnis mit Hilfe des Explorers oder icacls als Template konfiguriert.
Hat man dort alle erforderlichen Berechtigungen gesetzt, dann kann man ihre ACEs aus dem Security-Descriptor auf andere Dateien kopieren:
$acl = Get-Acl .\CSV.zip
Set-Acl .\Handle.zip -AclObject $acl
In diesem Beispiel liest Get-Acl die Dateiberechtigungen für CSV.zip ein und Set-Acl überträgt sie auf Handle.zip. Dagegen verfolgen die Cmdlets von NFTSSecurity einen direkten Ansatz für die jeweiligen Aktionen.
NTFSSecurity installieren
Im ersten Schritt muss das Modul installieren. Am einfachsten geht das mit dem Package Management von PowerShell, das zum Lieferumfang ab der Version 5 gehört. Es steht für Windows 7 und 8.1 bzw. ab Server 2008 R2 als separater Download zur Verfügung.
Dort führt man nur folgenden Befehl aus:
Install-Module NTFSSecurity
Wenn das Package Management nicht zur Verfügung steht, dann kann man das Modul als ZIP-Archiv von der PS-Gallery herunterladen und manuell einrichten.
Damit die Cmdlets von NTFSSecurity nutzbar sind, muss man das Modul noch importieren:
Import-Module NTFSSecurity
Nun kann man sich mit Hilfe von
Get-Command -Module NTFSSecurity
anzeigen lassen, welche Befehle es umfasst.
Rechte anzeigen mit Get-NTFSAccess
Zu den wichtigsten Aufgaben gehört sicherlich, die Berechtigungen für Dateisystemobjekte zu analysieren und diese zu ändern. Diesem Zweck dienen die Cmdlets Get-NTFSAccess, Add-NTFSAccess und Remove-NTFSAccess.
Ruft man Get-NTFSAccess ohne Parameter auf, dann zeigt es, welche Konten welche Berechtigungen auf das aktuelle Verzeichnis haben. Alternativ kann man den Parameter Path verwenden, um bestimmte Dateien oder Verzeichnisse spezifizieren. Dieser hat jedoch den Nachteil, dass er keine Wildcards akzeptiert.
Die naheliegende Lösung besteht darin, dass man die gewünschten Dateien mit Get-ChildItem filtert und sie über eine Pipe an Get-NTFSAccess übergibt. Get-ChildItem kennt allerdings eine Längenbegrenzung bei Pfadangaben von 260 Zeichen. Aus diesem Grund bringt NTFSSecurity das Cmdlet Get-ChildItem2 mit, das diese Limitierung aufhebt:
Get-ChildItem2 -Filter *.zip | Get-NTFSAccess | ? AccessRights -eq FullControl
Dieser Befehl würde nur anzeigen, welche Konten Vollzugriff auf bestimmte Dateien haben.
Get-NTFSAccess bietet zwei Schalter, um vererbte oder explizit gesetzte Berechtigungen auszublenden. Sie heißen ExcludeInherited und ExcludeExplicit. Darüber hinaus lässt sich die Anzeige auf bestimmte Konten einschränken. Folgender Aufruf würde nur die nicht vererbten Rechte anzeigen, die der User contoso\mmeier auf alle ZIP-Dateien im aktuellen Verzeichnis hat:
Get-ChildItem2 -Filter *.zip | Get-NTFSAccess -Account contoso\mmeier -ExcludeInherited
Berechtigungen hinzufügen mit Add-NTFSAccess
Das Cmdlet Add-NTFSAccess ist dafür zuständig, Zugriffsrechte an Benutzer oder Gruppen zu vergeben. Die wichtigsten Parameter dabei sind Account, AccessRights, AccessType und AppliesTo.
Mit Account teilt man dem Cmdlet mit, welche Konten Rechte erhalten sollen. Führt man hier mehrere an, dann trennt man sie durch ein Komma. Zulässige Werte sind der Name oder eine SID, unterstützt werden auch die eingebauten IDs. Domänenbenutzer müssen in der Notation <Domain\User> geschrieben werden.
Bei vordefinierten Prinzipalen ist zu beachten, dass man auf einem deutschen Windows die übersetzten Namen verwenden muss, also beispielsweise Vordefiniert\Administratoren anstatt Builtin/Administrators oder NT-Autorität\Authentifizierte Benutzer statt NT Authority\Authenticated Users.
Für die Zugriffsrechte hingegen bleibt es bei den englischen Bezeichnungen. Diese kann man sich anzeigen lassen, indem man nach dem Eintippen des Parameternamens AccessRights mit der Tab-Taste durch die Liste wandert. Bei aktivem PSReadline stellt STRG + Leertaste alle Optionen auf einmal dar.
Bei AccessType hat man die Auswahl zwischen Allow und Deny, also zwischen dem expliziten Einräumen und Verweigern der angegebenen Rechte. Lässt man diesen Parameter aus, dann ist Allow der Standard.
Schließlich gibt man mit AppliesTo den Bereich an, auf den sich der Befehl auswirken soll. Vorgabe ist ThisFolderSubfoldersAndFiles, alle anderen zulässigen Werte kann man ebenfalls über das Autovervollständigen von PowerShell erfragen.
Ein Aufruf könnte dann so aussehen:
Add-NTFSAccess -Account 'Vordefiniert\Administratoren' `
-Path .\test.zip -AccessRights FullControl
Zugriffsrechte entziehen mit Remove-NTFSAccess
Der Gegenspieler zu Add-NTFSAccess heißt Remove-NTFSAccess und entfernt Access Control Entries (ACEs) für die angegebenen Dateien und Verzeichnisse. Seine Verwendung folgt dem gleichen Muster wie die von Add-NTFSAccess, d.h., das Cmdlet akzeptiert die gleichen Parameter und dazugehörigen Werte.
Auch hier könnte man die Datei- bzw. Verzeichnisnamen über den Parameter Path spezifizieren oder diese von Get-ChildItem2 über eine Pipe an Remove-NTFSAccess übergeben. Eine weitere Option besteht darin, Berechtigungen für bestimmte Konten mit Get-NTFSAccess zu ermitteln und das Ergebnis an Remove-NTFSAccess zu übermitteln. In diesem Fall benötigt man für Letzteres keine weiteren Parameter mehr:
Get-NTFSAccess -Account 'Vordefiniert\Administratoren' `
-Path test.zip -ExcludeInherited | Remove-NTFSAccess
Dieser Aufruf würde den lokalen Administratoren alle explizit gewährten Berechtigungen auf die Datei test.zip entziehen, unter anderem auch jene, die wir ihnen im obigen Beispiel mit Add-NTFSAccess verliehen haben. Möchte man ihnen jedoch nur exakt diese wieder wegnehmen, dann könnte man das so tun:
Get-NTFSAccess -Account 'Vordefiniert\Administratoren' ` -Path .\test.zip | Remove-NTFSAccess -AccessRights FullControl
Will man in einem Verzeichnis alle Dateien auf die vererbten Berechtigungen zurücksetzen, dann würde folgender Befehl diese Aufgabe erledigen:
Get-ChildItem2 -Filter * | Get-NTFSAccess -ExcludeInherited |
Remove-NTFSAccess -PassThru
Nachdem Remove-NTFSAccess den Schalter WhatIf nicht unterstützt, sollte man zuerst unbedingt nur den Teil des Kommandos vor Remove-NTFSAccess ausführen:
Get-ChildItem2 -Filter * | Get-NTFSAccess -ExcludeInherited
Damit erhält man einen Überblick über die Berechtigungen, die im Ernstfall entfernt würden.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Ordner freigeben mit PowerShell
- NTFS-Berechtigungen über Gruppenrichtlinien anpassen
- FolderSecurityViewer 2.0: Reports für Verzeichnis- und Freigaberechte, Owner und User-Berechtigungen
- Test: Verzeichnis- und Freigabe-Berechtigungen analysieren mit dem (kostenlosen) FolderSecurityViewer
- Besitzer von Dateien und NTFS-Vererbung ändern mit PowerShell
Weitere Links