Экспортируйте все общие папки Windows с разрешениями «Общий доступ» и NTFS. - PullRequest
0 голосов
/ 21 апреля 2019

Я хочу экспортировать все общие ресурсы Windows (за исключением системных общих ресурсов, таких как (C $, D% и т. Д.) С разрешениями общего ресурса и NTFS, в файл Excel.

Я написал этот код, и мне нужна помощь, чтобы добавить разрешения NTFS и затем экспортировать его в удобный для восприятия формат Excel.

[cmdletbinding()]

param([Parameter(ValueFromPipeline=$True,
    ValueFromPipelineByPropertyName=$True)]$Computer = '.') 

$shares = gwmi -Class win32_share -ComputerName $computer | where {$_.name -notlike "*$"} | 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

1 Ответ

0 голосов
/ 22 апреля 2019

Следующий комментарий фрагмент кода может сделать эту работу:

  • Вдохновлен Горячее получение разрешений для общих папок с помощью скрипта powershell .
  • Применяется выше:
    • пропущен -Credential параметр, который может потребоваться для Get-WmiObject для нелокального компьютера (однако учетные данные пользователя нельзя использовать для локальных подключений);
    • сохранил исходные имена переменных для целей отладки, однако изменил значение свойства NTFS (оригинал 0 или 1 на новые '' и $ShareResource, соответственно).
  • Пропущен Try-Catch блок в части, где получают разрешения NTFS (пожалуйста, добавьте его при необходимости).
  • Функция GetFileSystemRightsExtended рассматривает возможные Общие права доступа в частности Маска доступа . Я встретил их в моей файловой системе, а затем приведение такого свойства AccessMask к [Security.AccessControl.FileSystemRights], как и метод New-Object Security.AccessControl.FileSystemAccessRule(….

Обновлен скрипт, HTH :

param([Parameter(ValueFromPipeline=$True,
    ValueFromPipelineByPropertyName=$True)]$Computer = $env:COMPUTERNAME) 

Function GetFileSystemRightsExtended ( [uint32]$access )
{
$accessMaskBase = [ordered]@{
    [uint32]'0x80000000' = '+GenericRead'          ### generic access rights
    [uint32]'0x40000000' = '+GenericWrite'
    [uint32]'0x20000000' = '+GenericExecute'
    [uint32]'0x10000000' = '+GenericAll'
    [uint32]'0x02000000' = '+MaximumAllowed'       ### unclear: reserved
    [uint32]'0x01000000' = '+AccessSystemSecurity' 
    #          ↑↑↑ ↑
    #          ||| ╘══════ bits  0..15  Object specific access rights
    #          ||╘════════ bits 16..23  Standard        access rights
    #          |╘═════════ bits 24..27  Reserved (bit 24 = AccessSystemSecurity)
    #          ╘══════════ bits 28..31  Generic         access rights
    #
    ###                    see also MSDN article "Access Mask Format"
    ### https://docs.microsoft.com/en-gb/windows/desktop/SecAuthZ/access-mask-format
    ###
}

    $accessAux = $access
    $accessGeneric = @()
    foreach ($accessMaskKey in $accessMaskBase.Keys ) {
        if ( $access -band $accessMaskKey) {
            $accessGeneric += $accessMaskBase.$accessMaskKey
            $accessAux = $accessAux -bxor $accessMaskKey
        }
    }
    if ( $accessAux -ne 0 ) {
        $accessFS = [array]($accessAux -as [Security.AccessControl.FileSystemRights])
    } else {
        $accessFS = @() 
    }
    ($accessGeneric + $accessFS) -join ', '
}

$shares = Get-WmiObject -Class win32_share -ComputerName $computer | 
    Where-Object {$_.name -notlike "*$"} | 
        Select-Object -Property Name, Path, Type

$acl = foreach ($shareObj in $shares) { 
    $share = $shareObj.Name
    $ShareResource = $ShareObj.Path
    Write-Host $share, $ShareResource -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 }     
            ## convert [FileSystemAccessRule] object
            ## to an auxiliary object of [PSCustomObject] type:
            $aux = New-Object Security.AccessControl.FileSystemAccessRule(
                $UserName, $ace.AccessMask, $ace.AceType) | 
                    ConvertTo-Csv -NoTypeInformation | ConvertFrom-Csv
            ## add desired properties (at least `Computer` and `Share`):
            $aux | Add-Member -MemberType NoteProperty -Name Computer -Value $objShareSec.PSComputerName
            $aux | Add-Member -MemberType NoteProperty -Name Share -Value $share
            $aux | Add-Member -MemberType NoteProperty -Name NTFS -Value ''
            ## return `$aux` object using desired order of properties:
            $aux | Select-Object Computer, Share, NTFS, FileSystemRights, 
                                AccessControlType, IdentityReference, 
                                IsInherited, InheritanceFlags, PropagationFlags

            } #end foreach ACE           
        } # end try 
    catch 
        { Write-Host "Unable to obtain permissions for $share" }
    # NTFS permissions
    if ( $shareObj.Type -eq 0 ) {
        $FolderPathEsc = $ShareObj.Path.Replace('\','\\')
       #$FolderPath = [regex]::Escape($SharedFolder.Path) ### this fails
        $SharedNTFSSecs = Get-WmiObject -Class Win32_LogicalFileSecuritySetting `
            -Filter "Path='$FolderPathEsc'" -ComputerName $Computer
        $SecDescriptor = $SharedNTFSSecs.GetSecurityDescriptor()
        $Objs = foreach( $DACL in $SecDescriptor.Descriptor.DACL )
        {  
            $DACLDomain = $DACL.Trustee.Domain
            $DACLName = $DACL.Trustee.Name
            if( $null -ne $DACLDomain ) { $UserName = "$DACLDomain\$DACLName" }
            else                        { $UserName = "$DACLName"             }
            $fsr = GetFileSystemRightsExtended -access $DACL.AccessMask
            #customize the property
            $Properties = @{
                'Computer'          = $objShareSec.PSComputerName
                'Share'             = $share
                'NTFS'              = $ShareResource
                'FileSystemRights'  = $fsr
                'AccessControlType' = [System.Security.AccessControl.AccessControlType]$DACL.AceType
                'IdentityReference' = $UserName
                'IsInherited'       = [bool]$($DACL.AceFlags -band [System.Security.AccessControl.AceFlags]::Inherited)
                'InheritanceFlags'  = [System.Security.AccessControl.AceFlags]$DACL.AceFlags
                'PropagationFlags'  = '' ### ???
            }
            $SharedNTFSACL = New-Object -TypeName PSObject -Property $Properties
            $SharedNTFSACL
        }
        $Objs | Select-Object Computer, Share, NTFS, FileSystemRights, 
                             AccessControlType, IdentityReference, 
                             IsInherited, InheritanceFlags, PropagationFlags

    } # end # NTFS permissions
} # end foreach $shareObj
$ACL  | ConvertTo-Csv -NoTypeInformation -UseCulture
## for import to Excel, create a CSV file as follows ():
#$ACL  | Export-Csv -NoTypeInformation -UseCulture -Encoding UTF8 <# -Append <##> -Path 'D:\PShell\DataFiles\55785608.csv'
...