NTFS und icacls - Ordner mit geerbten ACL Rechten von solchen mit eigenen ACL Regeln unterschieden?



  • Bei Windows wird ja zur Konfiguration von ACLs das Kommandozeilentool icacls mitgeliefert.

    Wie kann ich damit einen Ordner und seine Unterordner so auflisten, dass in der Ausgabe nur diejenigen angezeigt werden, die eigene gesetzte ACL Regeln haben, also die nicht oder nicht nur aus geerbten ACL Regeln bestehen?

    Wenn ich bspw. einen Ordner Namens
    *C:\abc*
    mitsamt Unterordner
    *C:\abc\test_acl\
    C:\abc\test_acl\
    C:\abc\test_acl\humungus\
    C:\abc\test_acl\humungus\dfgdfg*

    habe, und für *C:\abc\test_acl\humungus* eine eigene, aber mit der von *C:\abc* identische ACL Regel anlege und dann die Berechtigung mit der geerbten Regel von *C:\abc\test_acl\humungus* entferne, so dass nur noch die eigene übrig bleibt, dann erhalten ich bei folgender Kommandozeilenoption folgenden Output:

    C:\abc>icacls test_acl /t
    test_acl rechner\computertrolls:(I)(OI)(CI)(F)
    
    test_acl\humungus rechner\computertrolls:(OI)(CI)(F)
    
    test_acl\humungus\dfgdfg rechner\computertrolls:(I)(OI)(CI)(F)
    
    test_acl\humungus\datei.txt rechner\computertrolls:(I)(F)
    
    4 Dateien erfolgreich verarbeitet, bei 0 Dateien ist ein Verarbeitungsfehler auf
    getreten.
    
    C:\abc>
    

    So weit so gut.
    Am Output kann man erkennen, dass alle Einträge, die ein (I) enthalten, was für "permission inherited from parent container" steht, eine geerbte und somit keine eigene ACL Regeln haben.

    Wie kann ich aber nun nur ausschließlich diejenigen auflisten, die mindestens eine oder mehrere eigene, also nicht geerbte ACL Regeln haben?
    Bei größeren Verzeichnissen mit vielen Dateien und Unterverzeichnissen wird nämlich obiges Kommando viel zu unübersichtlich, zumal der Pufferspeicher für das Fenster für die Eingabeaufforderung dann auch irgendwann überläuft.

    Im Prinzip geht es mir also auch darum, solche eigenen ACL Regeln aufzuspüren, so dass ich die einfach entfernen kann, sofern sie nicht notwendig sein sollten.



  • Schieß deine Programmausgabe zusätzlich noch durch grep oder ein ähnliches Programm (z.B. sls) und gebe jede Zeile aus, in der kein (I) vorkommt.



  • Ja, das wäre natürlich auch eine Möglichkeit.

    Grep gibt's aber nicht auf jedem Windows und mich hätte es jetzt interessiert, ob man das auch einfach mit icacls irgendwie angeben könnte.

    Vielleicht auch mit Bordmitteln der Powershell?



  • icacls test_acl /t | findstr /V "(I)"



  • Swordfish schrieb:

    icacls test_acl /t | findstr /V "(I)"

    Danke, das hat funktioniert.
    Sorry übrigens wenn ich erst jetzt antworte, ich hatte in den letzten Tagen viel anderes Zeugs zu tun.



  • Der Befehl hat nur einen kleinen Haken, er gibt neben dem Gesuchten auch dutzende leere Zeilen aus. Was logisch ist, da die Ausgabe von icacls auch leere Zeilen ausgibt und ja mit dem angehängten findstr Befehl nur diejenigen Zeilen unterdrückt werden, die kein (I) enthalten.

    Bei großen Verzeichnisbäumen hat man somit mehr leere Zeilen, als in den Puffer der Eingabeaufforderung passt.
    Kopiert man die Ausgabe in eine Textdatei, dann kann man das zwar auswerten, aber
    ist trotzdem sehr mühselig.

    Wenn ich den Befehl um folgendes erweitere:

    icacls test_acl /t | findstr /V "(I)" | findstr /v ""
    

    Dann erhalte ich die Fehlermeldung:
    FINDSTR: Keine Suchzeichenfolge

    Mit dem Suchparameter "" um leere Zeilen auszuschließen, scheint findstr nicht umgehen zu können.

    Hat jemand eine Lösung mit findstr?


  • Mod

    findstr /v "^$"

    Stichwort: Regular Expression support.

    MfG SideWinder



  • Ich habe jetzt

    icacls test_acl /t | findstr /V "(I)" | findstr /v "^$"

    icacls test_acl /t | findstr /V "(I)" | findstr /v "^$ "

    icacls test_acl /t | findstr /V "(I)" | findstr /v "^ $"

    icacls test_acl /t | findstr /V "(I)" | findstr /v "^[ ]$"

    icacls test_acl /t | findstr /V "(I)" | findstr /v "^ "

    icacls test_acl /t | findstr /V "(I)" | findstr /v "[^ ]"

    icacls test_acl /t | findstr /V "(I)" | findstr /v "[$ ]"

    icacls test_acl /t | findstr /V "(I)" | findstr /v "^[ ]"

    icacls test_acl /t | findstr /V "(I)" | findstr /v "^ *"

    icacls test_acl /t | findstr /V "(I)" | findstr /v "^[ ]*"

    und viele weitere Varianten probiert, aber irgendwie scheint das nicht zu funktionieren. Die leere Zeilen werden immer noch ausgegeben.

    Laut:
    https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/findstr

    steht $ für das Ende der Zeile. -> Line position: end of the line
    ^ für die Line position: beginning of the line

    Ein "^$" müsste also Anfang und Ende einschließen und demnach alle Zeilen ausfilter. Geht aber auch nicht.

    Ein "^[ ]" müsste meinem Verständnis nach dazu führen, dass die Zeile ausgefiltert wird, wenn sie mit der Klasse "Leerzeichen" beginnt.
    Das nach der Klasse gesucht werden soll, bestimmen die eckigen Klammern und das ^ steht für den Anfang der Zeile.
    Da es aber nicht funktioniert, dürfte diese Interpretation falsch sein.
    Andere Varianten, die ich getestet habe, siehe oben, gehen auch nicht.

    Seltsam finde ich auch, dass ein:
    icacls test_acl /t | findstr /V "(I)" | findstr /v /c:" "

    alle leere Zeilen auflistet. Der Parameter /v und /c: scheint wohl nicht kombiniert werden zu können.



  • Hast du denn '/R' angegeben? Steht alles, wenn du die Hilfe dazu aufrufst: "findstr /?"...


  • Mod

    Vielleicht ist die Zeile doch nicht leer sondern enthält viele Spaces und Tabs? Probier mal "^[ ]*$"

    MfG SideWinder


Anmelden zum Antworten