PSNetShare – Get ACL

W poprzednim artykule pisałem jak nadawać uprawnienia, niemniej jednak odczytanie uprawnień sprawia troszkę więcej problemów. Klasa Win32_Share posiada co prawda metodę GetAccessMask nie niej nie zwraca ona faktycznego stanu access listy.

$objNetShare = Get-WMIObject -class Win32_Share  -Filter "name='Test'"
$objNetShare.GetAccessMask()

Co w takim razie zrobić by sprawdzić kto ma dostęp do danego zasobu i z jakimi uprawnieniami? Do tego celu można posłużyć się klasą Win32_LogicalShareSecuritySetting.

Zanim jednak rozpoczniemy sprawdzanie uprawnień sprawdźmy czy dany zasób faktycznie jest udostępniony i czy jest to zasób prawidłowego typu, czyli Disk Drive.

$ShareName = "Test"
$objNetShare = Get-WMIObject -class Win32_Share  -Filter "name='$ShareName'"
if($objNetShare)
{
  Switch ($objNetShare.Type)
  {
    0 { $type = "Disk Drive" }
    1 { $type = "Print Queue" }
    2 { $type = "Device" }
    2147483648 { $type = "Disk Drive Admin" }
    2147483649 { $type = "Print Queue Admin" }
    2147483650 { $type = "Device Admin" }
    2147483651 { $type = "IPC Admin" }
  }
  $type
}

Jeśli wszystko jest poprawne możemy przystąpić do sprawdzania uprawnień.

$objShareSec = Get-WMIObject -Class Win32_LogicalShareSecuritySetting -Filter "name='$ShareName'"
$SD = $objShareSec.GetSecurityDescriptor().Descriptor

Dany zasób może posiadać wiele uprawnień dlatego posługujemy się pętlą foreach przy przeglądaniu wyniku.

foreach($ace in $SD.DACL)  { ... }

Sprawdzamy domenę oraz nazwę użytkownika czy są poprawnie zapisane jeśli nie to wykorzystujemy SID.

$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}

Ostatecznie generujemy listę uprawnień dla danego użytkownika.

[Array]$ACL += New-Object Security.AccessControl.FileSystemAccessRule($UserName, $ace.AccessMask, $ace.AceType)

Całość wygląda następująco.

$objShareSec = Get-WMIObject -Class Win32_LogicalShareSecuritySetting -Filter "name='$ShareName'"
$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)
}
$ACL

Źródła:
http://msdn.microsoft.com/en-us/library/aa394188(VS.85).aspx

Advertisements

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s