none
Получить данные о "шаре" из вкладки "Безопастность(Security)" RRS feed

  • Вопрос

  • Для получения данных о шаре использую функцию написанную Vadims  Podans

    function Get-Share ($computer = ".", $name) {
            if ($name) {
                $shares = gwmi Win32_Share -ComputerName $computer -Filter "name = '$name'"
            } else {
                $shares = gwmi Win32_Share -ComputerName $computer -Filter "type = 0"
            }
            $ShareInfo = @()
            foreach ($share in $shares) {
                $ShareSec = gwmi Win32_LogicalShareSecuritySetting -ComputerName $computer -filter "name='$($share.name)'"
                if ($shareSec) {
                    $SD = $sharesec.GetSecurityDescriptor()
                    $ShareInfo += $SD.Descriptor.DACL | % {
                        $_ | select @{e={$share.ClassPath.Server};n='Computer'},
                        @{e={$share.name};n='Name'},
                        @{e={$share.Path};n='Path'},
                        @{e={$share.Description};n='Description'},
                        AccessMask,
                        AceFlags,
                        AceType,
                        @{e={$_.trustee.Name};n='User'},
                        @{e={$_.trustee.Domain};n='Domain'},
                        @{e={$_.trustee.SIDString};n='SID'}
                    }
                } else {
                    Write-Warning "Specified share not exist or you may not have sufficient rights to access them!"
                }
        $ShareInfo
            }
        }

    Возникла необходимость дополнительно извлечь  данные о шаре из вкладки   «Безопастность(Securiry)».

    Подскажите, каким образом получить данные из этой вкладки?

Ответы

  • в тело if ($shareSec) {
    вставить кусок кода, типа get-acl \\$computer\$($share.name)
    [тут могла быть ваша реклама] http://www.sysadmins.lv
    • Помечено в качестве ответа Angel-Keeper 14 мая 2009 г. 4:48
  • Вот, что у меня получилось:
    function Get-Share ($computer = ".", $name) {
            if ($name) {
                $shares = gwmi Win32_Share -ComputerName $computer -Filter "name = '$name'"
            } else {
                $shares = gwmi Win32_Share -ComputerName $computer -Filter "type = 0"
            }
            $ShareInfo = @()
            foreach ($share in $shares) {
                $ShareSec = gwmi Win32_LogicalShareSecuritySetting -ComputerName $computer -filter "name='$($share.name)'"
                if ($shareSec) {
                    $ACL = get-acl \\$($share.ClassPath.Server)\$($share.name) -ErrorAction SilentlyContinue | select @{e={$_.access};n='Access'}
                    $AclInfo += $ACL.Access | % {
                            $_ | select @{e={$share.ClassPath.Server};n='Computer'},
                                        @{e={$share.name};n='ShareName'},
                                        @{e={$_.identityreference};n='logon'},
                                        @{e={$_.filesystemrights};n='AccessMask'}
                }
                    $SD = $sharesec.GetSecurityDescriptor()
                    $ShareInfo += $SD.Descriptor.DACL | % {
                        $_ | select @{e={$share.ClassPath.Server};n='Computer'},
                        @{e={$share.name};n='Name'},
                        @{e={$share.Path};n='Path'},
                        @{e={$share.Description};n='Description'},
                        AccessMask,
                        AceFlags,
                        AceType,
                        @{e={$_.trustee.Name};n='User'},
                        @{e={$_.trustee.Domain};n='Domain'},
                        @{e={$_.trustee.SIDString};n='SID'}
                    }
                } else {
                    Write-Warning "Specified share not exist or you may not have sufficient rights to access them!"
                }
        $AclInfo
        $ShareInfo
            }
        }
    • Помечено в качестве ответа Angel-Keeper 14 мая 2009 г. 5:00

Все ответы

  • в тело if ($shareSec) {
    вставить кусок кода, типа get-acl \\$computer\$($share.name)
    [тут могла быть ваша реклама] http://www.sysadmins.lv
    • Помечено в качестве ответа Angel-Keeper 14 мая 2009 г. 4:48
  • Вот, что у меня получилось:
    function Get-Share ($computer = ".", $name) {
            if ($name) {
                $shares = gwmi Win32_Share -ComputerName $computer -Filter "name = '$name'"
            } else {
                $shares = gwmi Win32_Share -ComputerName $computer -Filter "type = 0"
            }
            $ShareInfo = @()
            foreach ($share in $shares) {
                $ShareSec = gwmi Win32_LogicalShareSecuritySetting -ComputerName $computer -filter "name='$($share.name)'"
                if ($shareSec) {
                    $ACL = get-acl \\$($share.ClassPath.Server)\$($share.name) -ErrorAction SilentlyContinue | select @{e={$_.access};n='Access'}
                    $AclInfo += $ACL.Access | % {
                            $_ | select @{e={$share.ClassPath.Server};n='Computer'},
                                        @{e={$share.name};n='ShareName'},
                                        @{e={$_.identityreference};n='logon'},
                                        @{e={$_.filesystemrights};n='AccessMask'}
                }
                    $SD = $sharesec.GetSecurityDescriptor()
                    $ShareInfo += $SD.Descriptor.DACL | % {
                        $_ | select @{e={$share.ClassPath.Server};n='Computer'},
                        @{e={$share.name};n='Name'},
                        @{e={$share.Path};n='Path'},
                        @{e={$share.Description};n='Description'},
                        AccessMask,
                        AceFlags,
                        AceType,
                        @{e={$_.trustee.Name};n='User'},
                        @{e={$_.trustee.Domain};n='Domain'},
                        @{e={$_.trustee.SIDString};n='SID'}
                    }
                } else {
                    Write-Warning "Specified share not exist or you may not have sufficient rights to access them!"
                }
        $AclInfo
        $ShareInfo
            }
        }
    • Помечено в качестве ответа Angel-Keeper 14 мая 2009 г. 5:00
  • отлично. Маленькая поправка:
    -ErrorAction SilentlyContinue - этот ключ в Get-Acl не работает из-за бага, поэтому в случае чего он будет сыпать ошибками на экран. И учтите, что вы на выходе получите массив:
    $a = Get-Share
    и в $a[0] будет храниться ACL, а в $a[1] будет храниться ShareInfo.
    [тут могла быть ваша реклама] http://www.sysadmins.lv
  • отлично. Маленькая поправка:
    -ErrorAction SilentlyContinue - этот ключ в Get-Acl не работает из-за бага, поэтому в случае чего он будет сыпать ошибками на экран.
    Без указания ключа -ErrorAction SilentlyContinue командлет Get-Acl сыпит ошибки на экран, но с ключом нет.

    Еще такой вопрос. Можно ли с помощью gwmi эти данные получать?
  • хм, а у меня что есть ключ, что нету, всё равно сыпет. А получить - можно. Через класс Win32_Directory и метода GetSecurityDescriptor.


    [тут могла быть ваша реклама] http://www.sysadmins.lv
  • Через класс Win32_Directory и метода GetSecurityDescriptor.


    [тут могла быть ваша реклама] http://www.sysadmins.lv
    У этого класса нет метода GetSecurityDescriptor.
    Этот класс выгружает с дисков все дерево папок и файлов.
    А мне нужно, что бы выбирались папки из определенной "шары" с данными вкладки "Безопасность"
    т.к. структура сети содержит несколько доменов в разных регионах странны, то удобнее делать это ч\з WMI.
  • угу, прошу прощения, вам нужен класс: Win32_LogicalFileSecuritySetting. У него есть такой метод.


    [тут могла быть ваша реклама] http://www.sysadmins.lv