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)
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.
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.