Problema posto: recuperare le ACL di tutte le cartelle contenute all’interno di una directory padre, esplodendo e fornendo in chiaro i membri dei gruppi eventualmente presenti e autorizzati in Read Only o Read and Write. Dato che l’utility DumpSec (ex-DumpACL, di Somarsoft) non è poi così infallibile e fatta per filtrare la singola cartella con poco sforzo, ho pensato di passare da Powershell e da un’ottima base fornita in questo articolo: my-powershell.com/export-backup-ntfs-permissions.
Ho quindi costruito un più articolato script intorno a quell’istruzione principale, che possa accettare parametri da riga di comando e permettervi di stabilire se fare un’analisi ricorsiva e su quale file CSV esportare il risultato:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################################################################ | |
# AD: NTFS DumpACL (Recursive) | |
#—————————————————————————————————————- | |
# Autore: – (modifiche: GSolone) | |
# URL Originale: http://www.my-powershell.com/export-backup-ntfs-permissions/ | |
# Versione: 0.1 | |
# Utilizzo: .\DumpACL.ps1 | |
# (opzionale, passaggio dati da prompt) .\DumpACL.ps1 \\server\folder | |
# (opzionale, passaggio dati da prompt) .\DumpACL.ps1 \\server\folder -Recursive N (esclude ricorsività) | |
# (opzionale, passaggio dati da prompt) .\DumpACL.ps1 \\server\folder -CSV C:\temp\acl.csv | |
# Info: http://gioxx.org/tag/powershell | |
# Ultima modifica: 26-02-2016 | |
# Modifiche: – | |
############################################################################################################################ | |
#Verifica parametri da prompt | |
Param( | |
[Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)] | |
[string] $Folder, | |
[Parameter(Position=1, Mandatory=$false, ValueFromPipeline=$true)] | |
[string] $Recursive, | |
[Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$true)] | |
[string] $CSV | |
) | |
#Verifica CSV, se passato da prompt | |
if ( [string]::IsNullOrEmpty($CSV) ) { | |
if( (Test-Path "C:\Temp") -eq 0 ) { mkdir "C:\Temp" } | |
$CSV = "C:\Temp\DumpACL.csv" | |
Write-Host "Percorso e nome CSV non specificato, utilizzo $CSV …" -f "Yellow" | |
} | |
#Verifico configurazione default | |
if ( [string]::IsNullOrEmpty($Recursive) ) { | |
Write-Host "Ricorsività non specificata, utilizzo default (ricorsivo) …" -f "Yellow" | |
} | |
#Verifica ricorsività | |
if ( [string]::IsNullOrEmpty($Recursive) ) { | |
"" | |
Write-Host "Dump ACL da: $folder (ricorsivo, salvo in $CSV)" | |
Get-Childitem -path "$folder" -recurse | Where-Object {$_.PSIsContainer} | Get-ACL | Select-Object Path -ExpandProperty Access | Export-CSV $CSV | |
} else { | |
"" | |
Write-Host "Dump ACL da: $folder (NON ricorsivo, salvo in $CSV)" | |
if ( $Recursive -eq "n" ) { Get-Childitem -path "$folder" | Where-Object {$_.PSIsContainer} | Get-ACL | Select-Object Path -ExpandProperty Access | Export-CSV $CSV } | |
} | |
Write-Host "Done." -f "Green" | |
"" | |
# Chiedo se visualizzare i risultati esportati nel file CSV | |
$message = "Devo aprire il file CSV $CSV ?" | |
$Yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "" | |
$No = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "" | |
$options = [System.Management.Automation.Host.ChoiceDescription[]]($Yes, $No) | |
$Excel = $host.ui.PromptForChoice("", $message, $options, 1) | |
if ($Excel -eq 0) { Invoke-Item $CSV } | |
"" |
Si ottiene in output un file CSV (già detto) che potrà essere aperto in Excel, così da riuscire poi a organizzare i dati in colonna (sono separati da virgola, nda) e vedere così i gruppi ai quali è stata data un’autorizzazione (sia essa in sola lettura o anche scrittura, o magari solo in Traverse folder). A questo punto basta e avanza una query lanciata da un prompt dei comandi, come questa:
dsquery group DC=contoso,DC=com -name $NOMEGRUPPO | dsget group -members
Dove occorrerà sostituire “contoso” e “com” con il proprio dominio, $NOMEGRUPPO con il vero nome del gruppo del quale si vogliono conoscere i membri, come spiegato in questo post: gohgarry.wordpress.com/2011/06/09/dsquery-export-ad-group-members-to-text.
Per chi se lo stesse chiedendo: si può sostituire l’utilizzo di Powershell con ICACLS. Ci ho provato ma i risultati ottenuti non erano presentabili a un utente che non è solito lavorare con questo tipo di tool. Ho quindi preferito Powershell per la possibilità di esportare in un CSV facilmente editabile e inviabile a mezzo posta elettronica.
Buon lavoro!
L'articolo potrebbe non essere aggiornato
Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)