NTFS-Rechte anzeigen, zuweisen und entfernen mit dem PowerShell-Modul NTFSSecurity

    Berechtigungen für Dateien und VerzeichnisseWä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 Anfor­derungen bei der Vergabe von Zugriffs­rechten 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 Funktions­umfang bereitsteht, so ist die Nutzung dieser Mittel für die gängigen Aufgaben ziemlich umständlich.

    PowerShell verfügt über zahlreiche Methoden für das Management von Dateirechten, bloß ihre Verwendung ist 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 erfor­derlichen Berech­tigungen 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 Datei­berechtigungen 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

    Installation von NTFSSecurity über das PowerShell Package Management

    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 Dateisystem­objekte 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ängen­begrenzung 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.

    Der Schalter ExcludeInherited sorgt dafür, dass nur explizit zugewiesene Rechte angezeigt werden.

    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.

    Über das Autovervollständigen kann man sich eine Liste aller verfügbaren Rechte anzeigen lassen.

    Für die Zugriffsrechte hingegen bleibt es bei den englischen Bezeichnungen. Diese kann man sich anzeigen lassen, indem man nach dem Eintippen des Parameter­namens 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.

    Mögliche Geltungsbereiche für die erteilte Berechtigung.

    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. Verzeichnis­namen ü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

    Alle Dateien eines Verzeichnisses auf die vererbten Rechte zurücksetzen.

    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.

    Keine Kommentare