icacls, Get-ACL: Dateirechte anzeigen auf der Kommandozeile und in PowerShell

Lässt sich beispielsweise eine Datei nicht löschen oder anlegen, dann liegt dies meist an fehlenden Rechten. Befindet man sich auf der Kommandozeile, dann ist unter cmd.exe das Dienstprogramm icacls das Mittel der Wahl, um die Dateirechte zu überprüfen. Unter PowerShell ist dafür das Cmdlet Get-Acl zuständig.

Hat man Zugriffsprobleme auf eine Datei, dann kann man es im einfachsten Fall mit dir /q versuchen. Der Befehl zeigt nur den Besitzer einer Datei, nicht aber die Rechte von Benutzern. Wenn man das Problem durch Übernahme des Besitzes lösen möchte, dann hilft das Dienstprogramm takeown.exe.

Dateirechte anzeigen mit icacls

Das für die Änderung von ACLs zuständige icacls bietet laut Online-Hilfe zwar keine Option, um Besitzer und Dateirechte anzuzeigen, tut dies aber, wenn man ihm einfach die Dateinamen ohne Verwendung eines Schalters übergibt:

icacls *.cmd

Dieser Aufruf listet User und Gruppen mit ihren Rechten an der jeweiligen Datei oder dem angegebenen Verzeichnis auf. Die Darstellung der Rechte erfolgt als Kürzel, die man durch Aufruf der Online-Hilfe auflösen kann.

Möchte man auch die ACLs von Dateien in Unterverzeichnissen auslesen, dann gibt es dafür den Schalter /t (aus unerfindlichen Gründen nicht /s oder /r). Wenn sich darunter solche befinden, für die man keine Zugriffsrechte hat, dann bricht icacls ab. Dies kann man durch die Option /c verhindern.

Cmdlet Get-Acl in PowerShell

Die PowerShell bietet mit Get-Acl eine einfache Möglichkeit, die Zugriffsrechte für Dateien und Registry-Schlüssel zu ermitteln. In der einfachsten Form übergibt man dem Cmdlet die Namen einer oder mehrerer Dateien, wahlweise als Komma-separierte Liste oder als Namen mit Wildcards. Hinzu kommt die Möglichkeit, die Auswahl durch die Parameter -include, -exclude und -filter weiter zu verfeinern.

Standardmäßig erfolgt die Anzeige des Ergebnisses in Tabellenform, die aber aufgrund des Rattenschwanzes von Zugriffsrechten ungünstig ist. Daher wird man in der Regel die Listenform bevorzugen. Vor der Wahl der Darstellung wird man zumeist noch gezielt die gewünschten Eigenschaften ausfiltern:

Get-Acl *.cmd | Select path, owner, group, access | fl

Dieses Beispiel liest die ACL-Informationen aller Dateien mit der Endung .cmd aus und extrahiert die Eigenschaften Pfad, Besitzer, Gruppe (des Besitzers) und die Zugriffsrechte. Die Formatierung als Liste übernimmt fl, es ist ein Alias für Format-List.

Dateien in Unterverzeichnissen einschließen

Im Gegensatz zu icacls ist Get-Acl nicht in der Lage, auch Unterverzeichnisse zu berücksichtigen. Wenn man das möchte, muss man sich die entsprechende Fähigkeit von Get-ChildItem zunutze machen:

gci -inc *.cmd -r | % {Get-Acl $_.FullName|select path, Owner} | fl

Dieses Beispiel verwendet das Alias gci für Get-ChildItem und wählt über die Parameter -inc und -r die .cmd-Dateien in allen Unterverzeichnissen aus. Die Liste gelangt über eine Pipe an eine Schleife, (ForEach-Object, Alias %), die jedes Element an Get-Acl übergibt. Ein direktes Durchreichen des gci-Ergebnisses an Get-Acl schlägt fehl, weil Letzteres dann ein Array erhält, aber ein Objekt vom Typ System.IO.FileInfo erwartet.

1 Kommentar

Bild von Detlef Bock
Detlef Bock (Besucher) sagt:

Ich weiß nicht, ob Sie auf PMs antworten, aber ein Versuch schadet ja nicht:
Ich habe eine Partition F: auf der seit XP meine User-Dateien gespeichert sind. Im Laufe der Zeit haben sich da bei den Zugriffsrechten alle möglichen Einträge angehäuft.
Inzwischen bei Win7 Pro angelangt, hat meine Installation ein paar Macken, so daß ich mich entschlossen habe, neu zu installieren.
Nach der Neuinstallation kann ich keine Daten über den I.E. "downloaden". Mein dafür umgebogenes Verzeichnis liegt auf F:\downloads und es stellt sich heraus, daß die Ursache an fehlenden Schreibrechten für das Download-Verzeichnis liegt. Mit "Sicherheit" das Verzeichnis überprüft kommt eine Meldung, daß die Zugriffsrechte "in der falschen Reigenfolge vorliegen". Win schlägt vor, das automatisch zu ändern, das tue ich und alles ist gut.
ABER: dabei sehe ich alle möglichen, inzwischen nicht mehr aktuellen Berechtigungen. Diese sind praktisch auf allen Dateien und Verzeichnissen auf F:. Ich würde nun gerne "Default-Werte" für die Rechte aller Verzeichnisse und Dateien auf F: erstellen. Dazu habe ich mit Robocopy versucht, alles ohne ACLs auf eine andere Platte zu kopieren mit dem Plan, nach Abschluß des Kopiervorgangs, alles wieder auf die vorher gelöschte F: Partition zurück zu kopieren. Das dauert aber Ewigkeiten (inzwischen schon >10 Std) und es gibt vielleicht eine elegantere Methode?
Ein erster Versuch auf F: mit ICACLS "verzeichnispfad" /reset /T hat nicht funktioniert, die "falschen" Einträge bleiben.
Kopieren mit Teracopy ist deutlich schneller als Robocopy, übernimmt aber die "falschen" Berechtigungen.
Die "Default-Berechtigungen" ohne ACLs sind bei mir JEDER, SYSTEM, ADMINISTRATOREN, BENUTZER (Rechnername\Benutzer).
Wie kann ich also diese Default-Einstellungen in einem Rutsch auf meinem F: Laufwerk erstellen, ohne die zeitraubende Kopieraktion (es wird ja nochmal jede Menge Zeit vergehen, wenn ich die "bereinigten" Daten wieder auf mein F: Laufwerk zurück kopiere.
Für Tipps wäre ich natürlich hocherfreut.

mfg
Detlef Bock

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht angezeigt. Wenn mit Ihrer angegebenen Mail-Adresse ein Gravatar verknüpft ist, dann wird dieser neben Ihrem Kommentar eingeblendet.
  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • Zulässige HTML-Tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Zeilen und Absätze werden automatisch erzeugt.
  • Mail-Adressen werden im Seitenquelltext unkenntlich gemacht, um sie vor dem automatischen Erfassen durch Spammer zu schützen.

Weitere Informationen über Formatierungsoptionen