Получение вложенных папок ACL с помощью массива

#powershell

#powershell

Вопрос:

У меня есть скрипт, который проверяет разрешения ACL в папках и записывает их в файл CSV. Я хочу, чтобы результат при наследовании выглядел следующим образом:

 Allow  Full Control, this folder, subfolders and files (Inherited)
  

На данный момент он выводит только это:

 Allow FullControl,  (Inherited)
  

Может кто-нибудь посоветовать мне, пожалуйста, я просто хочу, чтобы отображался отсутствующий текст:

 $RootPath = "C:"

$Folders = dir $RootPath -recurse | where {$_.psiscontainer -eq $true}

$isInherited = @{
    $true  = 'Inherited'
    $false = 'Not Inherited'
}

$inheritance = @{
    0 = 'files only'
    1 = 'this folder and subfolders'
    2 = 'this folder and files'
    3 = 'subfolders and files'
}

$fldr = $Folder.FullName

$Folders | % {
    $fldr = $_.FullName
    Get-Acl $fldr | select -Expand Access |
        select @{n='Account';e={$_.IdentityReference}},
               @{n='Ace String';e={"{0} {1}, {2} ({3})" -f $_.AccessControlType,
                 $_.FileSystemRights, $inheritance[$_.InheritanceFlags],
                 $isInherited[$_.IsInherited]}},
               @{n='Object Path';e={$fldr}} |
        ConvertTo-Csv -NoTypeInformation |
        Select -Skip 1 | % {$_ -replace '"', ""} |
        Out-File $OutFile -Force -Encoding ascii -Append
}
  

Ответ №1:

При проверке System.Security.AccessControl.InheritanceFlags объекта:

    TypeName: System.Security.AccessControl.InheritanceFlags

Name        MemberType Definition
----        ---------- ----------
CompareTo   Method     int CompareTo(System.Object target)
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()
GetType     Method     type GetType()
GetTypeCode Method     System.TypeCode GetTypeCode()
ToString    Method     string ToString(), string ToString(string format, System.IFormatProvider provider), string To...
value__     Property   System.Int32 value__ {get;set;}
  

похоже, у объекта есть value__ свойство. Итак, измените строку

 $_.FileSystemRights, $inheritance[$_.InheritanceFlags],
  

Для

 $_.FileSystemRights, $inheritance[$_.InheritanceFlags.value__],
  

Это правильно передаст параметр типа [int] в $inheritance hash.

Комментарии:

1. Спасибо, это вызывает у меня головные боли со вчерашнего дня.