none
Получение списка ACL по дереву папок RRS feed

  • Вопрос

  • Здравствуйте, 

    Нужна помощь специалистов по powershell.

    Требуется получить список контроля доступа (ACL) для дерева папок, исключая некоторые учётные записи такие как Bullitin\Администраторы, NT AUTORITY\СИСТЕМА, СОЗДАТЕЛЬ ВЛАДЕЛЕЦ и т.п. задача осложняется тем что длина пути для некоторых папок превышает 256 символов. Я нашёл 2 скрипта которые полностью решают эту задачу, но так и не смог объеденить их в один. 

    1. получение ACL с дерева папок (не работает с длинными путями)

    $AllFolders = Get-ChildItem -Directory -Path "d:\tmp" -Recurse -Force
    $Results = @()
    Foreach ($Folder in $AllFolders) {
        $Acl = Get-Acl -Path $Folder.FullName
        foreach ($Access in $acl.Access) {
            if ($Access.IdentityReference -notlike "BUILTIN\Администраторы" -and $Access.IdentityReference -notlike "domain\Domain Admins" -and $Access.IdentityReference -notlike "CREATOR OWNER" -and $access.IdentityReference -notlike "NT AUTHORITY\СИСТЕМА") {
                $Properties = [ordered]@{'FolderName'=$Folder.FullName;'AD Group'=$Access.IdentityReference;'Permissions'=$Access.FileSystemRights;'Inherited'=$Access.IsInherited}
                $Results += New-Object -TypeName PSObject -Property $Properties
            }
        }
    }
    
    $Results  | Export-Csv -path "d:\Permissions - $(Get-Date -format MMyy).csv"


    2. Получение ACL с дерева папок (включает информацию о файлах и мусорные записи)

    #Define Source Path
    $SourcePath = "D:\tmp"
    
    #$LogFile = "C:\Temp\Logs\ACLInfo_Source_$((Get-Date).ToString("yyyy-MM-dd ddd_hhmm")).csv"
    $LogFile = "d:\ACLInfo_Source_.csv"
    
    function GetAcls
    {
    param ( [String]$Path, [string]$FPath=$null )
    $JPath = "c:\Temp\SL"
    # $JPath = $Env:temp + "\SL"
    $Results = @()
    
    if ( $FPath.length -eq 0 ) { $FPath = $Path }
    if ( $path.toLower().StartsWith($JPath.toLower() ) ) { $Jpath = ([System.IO.DirectoryInfo]$path).parent.fullname }
    
    $JPath = $JPath + '1'
    # Write-Host ">Creating Link  $jpath <==> $path"
    cmd /c "mklink /d `"$Jpath`" `"$Path`"" > $null
    
    if (Test-Path $JPath ) {
    
    ForEach ($folder in (dir $JPath | Where { $_.PSIsContainer })) {
        ForEach ($acl in (Get-Acl $folder.fullname )) {
    ForEach ( $ace in $acl.access ) {
        $Results += New-Object PSObject -Property @{
    Path   = $Fpath + "\" + $folder.name
    Owner   = $acl.Owner
    FileSystemRights  = $ace.FileSystemRights
    AccessControlType = $ace.AccessControlType
    IdentityReference = $ace.IdentityReference
    IsInherited       = $ace.IsInherited
    InheritanceFlags  = $ace.InheritanceFlags
    PropagationFlags  = $ace.PropagationFlags
        } # Properties for result PSO
    } # ForEach ace
        } # ForEach acl
    } # ForEach Folder
    
    $Results
    } # Test-path
    
    dir $Jpath | where { $_.PsIsContainer } | % { GetAcls -Path $($_.FullName) -FPath ($FPath +"\" + $_.name) }
    # Write-Host "<Removing       $jPath"
    cmd /c "rd $jPath"
    }
    
    GetAcls -Path $SourcePath| Select Path, Owner, IdentityReference, FileSystemRights, AccessControlType, IsInherited, InheritanceFlags, PropagationFlags | Export-Csv $LogFile -NoTypeInformation -Encoding unicode


    Буду признателен за помощь. 


    • Изменено Gleb666 10 февраля 2020 г. 6:27
    7 февраля 2020 г. 12:54

Все ответы