S-a întâmplat ca zilele acestea să fiu nevoit să verific dacă nu cumva pe mai multe server-e Windows 2008/2012 share-urile disponibile au sau nu inclus și grupul Everyone. În sine operația nu e foarte complicată și dacă numărul de share-uri e limitat poți să faci asta manual fără niciun fel de probleme.
Mai consumatoare de timp este situația în care ai de navigat prin mai multe share-uri, sigur nu vrei sa faci așa ceva manual. E momentul în care un script de PowerShell poate să salveze situația extrem de rapid. Îl poți crea tu dacă te pricepi sau poți apela la unele scrise deja de alții.
Soluția pe care o propun astăzi este un script gata făcut, denumit Get-Share Permissions, disponibil pentru download aici.
El arată așa:
<#
.SYNOPSIS
This script will list all shares on a computer, and list all the share permissions for each share..DESCRIPTION
The script will take a list all shares on a local or remote computer..PARAMETER Computer
Specifies the computer or array of computers to process.INPUTS
Get-SharePermissions accepts pipeline of computer name(s).OUTPUTS
Produces an array object for each share found..EXAMPLE
C:\PS> .\Get-SharePermissions # Operates against local computer..EXAMPLE
C:\PS> ‘computerName’ | .\Get-SharePermissions.EXAMPLE
C:\PS> Get-Content ‘computerlist.txt’ | .\Get-SharePermissions | Out-File ‘SharePermissions.txt’.EXAMPLE
Get-Help .\Get-SharePermissions -Full
#># Written by BigTeddy November 15, 2011
# Last updated 9 September 2012
# Ver. 2.0
# Thanks to Michal Gajda for input with the ACE handling.[cmdletbinding()]
param([Parameter(ValueFromPipeline=$True,
ValueFromPipelineByPropertyName=$True)]$Computer = ‘.’)$shares = gwmi -Class win32_share -ComputerName $computer | select -ExpandProperty Name
foreach ($share in $shares) {
$acl = $null
Write-Host $share -ForegroundColor Green
Write-Host $(‘-‘ * $share.Length) -ForegroundColor Green
$objShareSec = Get-WMIObject -Class Win32_LogicalShareSecuritySetting -Filter “name=’$Share'” -ComputerName $computer
try {
$SD = $objShareSec.GetSecurityDescriptor().Descriptor
foreach($ace in $SD.DACL){
$UserName = $ace.Trustee.Name
If ($ace.Trustee.Domain -ne $Null) {$UserName = “$($ace.Trustee.Domain)\$UserName”}
If ($ace.Trustee.Name -eq $Null) {$UserName = $ace.Trustee.SIDString }
[Array]$ACL += New-Object Security.AccessControl.FileSystemAccessRule($UserName, $ace.AccessMask, $ace.AceType)
} #end foreach ACE
} # end try
catch
{ Write-Host “Unable to obtain permissions for $share” }
$ACL
Write-Host $(‘=’ * 50)
} # end foreach $share
Și după cum vedeți e destul de ușor de înțeles, mai ales că e documentat bine.
Pe scurt ceea ce face este să preia identificatorul sistemului pe care e rulat script-ul PowerShell, să extragă share-urile și apoi pentru fiecare dintre ele să extragă lista celor ce au drept să îl acceseze.
Rezultatele se obțin rapid, mult mai rapid decât am sta să luăm la rând share-urile și să le verificăm.