martedì 27 agosto 2019

Trovare files e cartelle che hanno uno specifico permesso ACL NTFS (o non hanno)

Buongiorno a tutti e benvenuti ad un altro post.

In questo articolo vi voglio spiegare com'è possibile, da un elenco di cartelle e o di file, recuperare quelli che hanno oppure non hanno uno specifico permesso per uno specifico utente.

In sostanza, oggi mi sono trovato a dover testare alcune cartelle, per una anomalia sulle ACLs, tuttavia non sapevo QUALI avevano impostato il mio utente nelle ACLs direttamente e quali invece avevano il gruppo.

Ecco come ho fatto:

  • Ho "fatto DIR" con powershell (Get-ChildItem) e ho quindi ciclato su tutte le cartelle, ottenendo le loro ACLs.
  • Per ogni cartella ho semplicemente verificato che il mio nome utente non fosse presente nelle ACLs, testando la proprietà AccessToString (con un ulteriore LOOP sulla proprietà Access, che è una collection di oggetti*, invece, avrei potuto controllare puntualmente anche il tipo di permesso etc...)
  • Quindi, se il permesso non c'era, ho stampato a schermo il nome della cartella.

* collection di oggetti AuthorizationRuleCollection




Bando alle ciance: ecco lo script:


$FolderPath = Get-ChildItem -Directory -Path "E:\Personali"
$FolderPath|foreach{
    $acls=Get-Acl $_.FullName
    if($acls.AccessToString -notlike "*DOMINIO\nomeutente*"){
        write-host ("la cartella "+$_.FullName+" non ha nomeutente nelle ACLs")
    }
}

come vedete in questo caso ho filtrato SOLO le Directory (con il parametro -Directory)





La versione + "approfondita"

Con quest'altra versione, è possibile verificare per tutti i files e le cartelle, anche il TIPO di permesso ed altre cose. Più precisamente, riporto un esempio di una proprietà Access.

FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : BUILTIN\Administrators
IsInherited       : True
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : InheritOnly

e ecco lo script:


$FolderPath = Get-ChildItem -Directory -Path "E:\Personali"
$FolderPath|foreach{
    $acls=Get-Acl $_.FullName
    $printThis=$true
    foreach($e in $acls.Access){
    if($e.AccessControlType -eq "Allow" -and $e.IdentityReference -eq "DASITALIA\DiegoCA"){
            $printThis=$false;
    }
    }
    if($printThis){
        write-host ("la cartella "+$_.FullName+" non ha DiegoCA nelle ACLs")
    }
}

Ricorsione (Recursive, Recurse)
Se volete usare questi script in tutte le sottocartelle / sottodirectory, dovrete semplicemente abilitare la ricorsione sul primo comando!

$FolderPath = Get-ChildItem -Directory -Path "E:\Personali" -Recurse

Et-Voilà!


Spero di avervi stuzzicato la fantasia, anche oggi.

Happy Scripting a tutti!