Tags: PowerShell, Kommandozeile, Dateisystem, Rechteverwaltung
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.exedas 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 icaclsist 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.
Täglich Know-how für IT-Pros mit unserem Newsletter
Wir verwenden Ihre Mail-Adresse nur für den Versand der Newsletter.
Es erfolgt keine personenbezogene Auswertung.
Verwandte Beiträge
- Icacls, Takeown, PowerShell: Besitzer von Dateien unter NTFS ändern
- Ordner freigeben mit PowerShell
- NTFS-Rechte anzeigen, zuweisen und entfernen mit dem PowerShell-Modul NTFSSecurity
- Zugriffsrechte auf Freigaben anzeigen, ändern und entziehen mit PowerShell
- Freie Laufwerksbuchstaben finden mit PowerShell, WMI oder Batch-Dateien
Weitere Links
- Webinar: Prozesse mit PowerShell optimieren, automatisieren, delegieren und überwachen
- Technisches Webinar: Microsoft Teams effizient mit PowerShell verwalten
- Technisches Webinar: Azure-VMs, Ressource-Gruppen und Entra ID mit PowerShell verwalten
2 Kommentare
Detlef Bock (Besucher) sagt:
25. November 2015 - 11:54
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
- Antworten
Stefan (Besucher) sagt:
20. Mai 2022 - 9:15
Wenn man die Infos wie im Eigenschaften\Sicherheit Dialog sehen möchte,
hilft folgender Befehl weiter
Get-Acl *.txt |select path, AccessToString |fl
- Antworten