Powershell: список с ADusers - нужны группы, в которые входят пользователи - PullRequest
0 голосов
/ 31 октября 2019

У меня есть список пользователей (их CN), и я хочу список групп, членами которых они являются. У меня уже есть код, который почти добивается цели, но он показывает следующее:

Пользователь1 - группа1; группа2

Пользователь2 - группа1; группа2; группа3 и т. Д ...

Кроме того, группы показываются как различающееся имя (с контейнером и т. Д.), Поэтому очень длинное. Мне нужно только имя.

Я хочу показать его следующим образом:

Пользователь1 - группа1

Пользователь1 - группа2

Пользователь2 - группа1и т. д.

Код, который показывает группы, в которые входят пользователи, но не визуально, как мне нравится, приведен ниже:

Import-Csv -Path .\Input_CN.csv | 
ForEach-Object {
    $User = Get-ADUser -filter "CN -eq '$($_.CN)'" -properties memberof 
    [PSCustomObject]@{
        SourceCN = $_.CN
        MemberOf = $User.MemberOf -join ";"
    }
} | Export-Csv -Path .\Output.csv -Delimiter ";" -NoTypeInformation
.\Output.csv

У меня есть другой код из этого спискагруппы, как я хочу, но я не могу перечислить его на пользователя. И не удалось объединить его с вышеуказанным кодом.

get-aduser -filter {cn -eq "Testuser"} -properties memberof |
Select -ExpandProperty memberof |
ForEach-Object{Get-ADGroup $_} |
Select -ExpandProperty Name

Заранее спасибо:)

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Это немного неуклюже, но вы можете использовать вложенные циклы:

Import-Csv -Path .\Input_CN.csv | ForEach-Object {
    $user = Get-ADUser -filter "CN -eq '$($_.CN)'" -properties cn, memberof
        $user | ForEach-Object {
            $_.MemberOf |
                ForEach-Object {
                    [PSCustomObject]@{
                        SourceCN = $user.CN
                        MemberOf = $_.split('[=,]')[1]
                }
        }
    }
} | Where-Object {$null -ne $_.MemberOf} | 
        Export-Csv -Path .\Output.csv -Delimiter ";" -NoTypeInformation

ОБНОВЛЕНИЕ : Обновлено, чтобы отображать только часть 'CN' имени группы и фильтровать любыепользователи, которые не являются членами какой-либо группы.

1 голос
/ 31 октября 2019

Вы можете объединить обе части кода следующим образом:

Import-Csv -Path .\Input_CN.csv | 
ForEach-Object {
    $user = Get-ADUser -Filter "CN -eq '$($_.CN)'" -Properties MemberOf, CN -ErrorAction SilentlyContinue
    foreach($group in $user.MemberOf) {
        [PSCustomObject]@{
            SourceCN = $user.CN
            MemberOf = (Get-ADGroup -Identity $group).Name
        }
    }
} | Export-Csv -Path .\Output.csv -Delimiter ";" -NoTypeInformation

Редактировать

Хотя я никогда не видел пользователя AD, не имеющего членства в группевообще (должно быть хотя бы значение по умолчанию Domain Users в свойстве MemberOf), вы прокомментировали, что хотели бы иметь тест для этого, а также.

Import-Csv -Path .\Input_CN.csv | 
ForEach-Object {
    $user = Get-ADUser -Filter "CN -eq '$($_.CN)'" -Properties MemberOf, CN -ErrorAction SilentlyContinue
    if (!$user) {
        Write-Warning "No user found with CN '$($_.CN)'"
        # skip this one and resume with the next CN in the list
        continue
    }
    $groups = $user.MemberOf
    if (!$groups -or $groups.Count -eq 0) {
            [PSCustomObject]@{
                SourceCN = $user.CN
                MemberOf = 'No Groups'
            }
    }
    else {
        foreach($group in $groups) {
            [PSCustomObject]@{
                SourceCN = $user.CN
                MemberOf = (Get-ADGroup -Identity $group).Name
            }
        }
    }
} | Export-Csv -Path .\Output.csv -Delimiter ";" -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...