Ciao TheCrow,
benvenuto su powershell.it!
Con PowerShell è possibile recuperare facilmente le informazioni tramite WMI, comprese le condivisioni di rete ed i relativi permessi.
La classe WMI
Win32_Share, ad esempio, permette di ottenere gli share di rete della macchina (ho specificato un filtro per evitare di ottenere gli share predefiniti, come C$ e IPC$:
gwmi Win32_Share -filter "Type=0"
La classe WMI
Win32_LogicalShareSecuritySetting, invece, permette di recuperare le informazioni sui permessi. Combinando queste informazioni si può creare uno script come questo (devo ammettere che non è lo script più semplice, se devi iniziare a prendere mano con PowerShell!):
$shares = gwmi Win32_Share -filter "Type=0"
$sharesData = @{}
foreach ($share in $shares) {
$security = gwmi Win32_LogicalShareSecuritySetting -filter "Name='$($share.Name)'"
$shareData = @()
if ($security -eq $null) {
$shareData += @{ Everyone = 'FullControl' }
}
else {
$descriptor = $security.GetSecurityDescriptor()
foreach ($ace in $descriptor.Descriptor.DACL) {
$userName = $ace.Trustee.Name
if ($ace.Trustee.Domain -ne $null) {
$userName = "{0}\{1}" -f $ace.Trustee.Domain, $userName
}
$accessMaskDesc = switch($ace.AccessMask) {
{ $_ -band 0x1 } { 'FILE_READ_DATA' }
{ $_ -band 0x2 } { 'FILE_WRITE_DATA' }
{ $_ -band 0x4 } { 'FILE_APPEND_DATA' }
{ $_ -band 0x8 } { 'FILE_READ_EA' }
{ $_ -band 0x10 } { 'FILE_WRITE_EA' }
{ $_ -band 0x20 } { 'FILE_EXECUTE' }
{ $_ -band 0x40 } { 'FILE_DELETE_CHILD' }
{ $_ -band 0x80 } { 'FILE_READ_ATTRIBUTES' }
{ $_ -band 0x100 } { 'FILE_WRITE_ATTRIBUTES' }
{ $_ -band 0x10000 } { 'DELETE' }
{ $_ -band 0x20000 } { 'READ_CONTROL' }
{ $_ -band 0x40000 } { 'WRITE_DAC' }
{ $_ -band 0x80000 } { 'WRITE_OWNER' }
{ $_ -band 0x100000 } { 'SYNCHRONIZE' }
}
$aceTypeDesc = switch($ace.AceType) {
0 { 'Accesso consentito' }
1 { 'Accesso negato' }
2 { 'Audit' }
}
$shareData += @{ "$userName" = ("{0} -> ({1})" -f ($accessMaskDesc -join ', '), $aceTypeDesc) }
}
}
$sharesData[$share.Name] = $shareData
}
Dopo averlo eseguito, l'array associativo $sharesData contiene un elemento per ogni share trovato; a ciascuno è associato un array di permessi, formato a sua volta da elementi di tipo array associativo che contengono il nome dell'utente (come chiave) ed una stringa di descrizione dei relativi permessi (come valore).
Ok, più facile a farsi che non a dirsi... ;)
Successivamente puoi utilizzare questo codice per recuperare i nomi degli share trovati:
$sharesData.GetEnumerator() | select Name
Infine, puoi recuperare i permessi di un particolare share così:
$sharesData[<NomeDelloShare>]
es:
$sharesData["TestShare"]
Se qualcosa non è chiaro torna pure qui! :)
Ciao, a presto.