Если пункт в общем списке - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть несколько вопросов о GenericLists в PowerShell.Приведенный ниже скрипт распечатывает все права доступа к общей папке для конкретного пользователя с его группами.Теперь я хочу добавить новую строку в мой GenericList, которая показывает, откуда (пользователь / группа) наследуется право.

$User = "Testumgebung\cbruehwiler"
$UserOhneDomain = "cbruehwiler"
$Path = "T:\"
$List = New-Object System.Collections.Generic.List[System.Object]
$Groups = Get-ADPrincipalGroupMembership $UserOhneDomain

$GroupArrayList = New-Object System.Collections.ArrayList
foreach ($Group in $Groups) {
    $GroupArrayList.Add($Group.Name) | Out-Null
}

# Fields we want in list, an array of calculated properties.
$OutputFields = @(
    @{name="Item" ;       expression={$_.Path.split(':',3)[-1]}}
    @{name="Rights" ;     expression={$Right.FileSystemRights}}
    @{name="AccessType" ; expression={$Right.AccessControlType}}
    @{name="From" ;       expression={$User}}
)
$FileSystemObjects = Get-ChildItem $Path -Recurse | ForEach-Object {Get-Acl $_.FullName}

foreach ($Item in $FileSystemObjects) {
    foreach ($Right in $Item.Access) {
        if ($Right.IdentityReference -eq $User) {
            $List.Add(($Item | Select-Object $OutputFields))
        }
    }
}

foreach ($Item in $FileSystemObjects) {
    foreach ($Right in $Item.Access) {
        foreach ($GroupArrayItem in $GroupArrayList){
            if ($Right.IdentityReference -eq ("TESTUMGEBUNG\" + $GroupArrayItem)) {
                $List.Add(($Item | Select-Object $OutputFields))
            }
        }
    }
}

$List | Out-File C:\Users\cbruehwiler\Desktop\PermissionCheck.txt

Результат выглядит следующим образом:

Item                                       Rights  AccessType  From
----                                       ------  ----------  ----
T:\TestFolder                         FullControl       Allow  Testumgebung\cbruehwiler
T:\TestFolder                   Read, Synchronize       Allow  Testumgebung\cbruehwiler
T:\TestFolder  Write, ReadAndExecute, Synchronize       Allow  Testumgebung\cbruehwiler

Последняя строка теперь печатает только мой пользователь.Однако он должен показывать пользователя или группу.

1 Ответ

1 голос
/ 29 апреля 2019

Вы можете даже объединить две петли в одну, например:

foreach ($Item in $FileSystemObjects) {
    foreach ($Right in $Item.Access) {
        foreach ($GroupArrayItem in $GroupArrayList) {
            # not needed; just for convenience 
            [string]$id = $Right.IdentityReference

            # test if the $Right.IdentityReference corresponds with the user name
            if ($id -eq $User) {
                $List.Add(($Item | Select-Object $OutputFields))
            }
            # test if the $Right.IdentityReference without the 'Domain\' part can be found in the list of groups
            elseif (($id.Split("\", 2)[-1]) -in $GroupArrayList) {
                # set the $User variable to the value of $Right.IdentityReference
                $User = "Group: $id"
                $List.Add(($Item | Select-Object $OutputFields))
            }
        }
    }   
}
...