【问题标题】:Powershell: List with ADusers - need groups the users are memberofPowershell:列出 AD 用户 - 以及用户所属的组
【发布时间】:2019-10-31 08:58:14
【问题描述】:

我有一个用户列表(他们的 CN),我想要一个他们所属的组的列表。 我已经有一个几乎可以解决问题的代码,但它显示如下:

用户 1 - 组 1;组 2

User2 - group1;group2;group3 等...

此外,组显示为可分辨名称(带有容器等),非常长。我只想要名字。

我想显示如下:

用户 1 - 组 1

用户 1 - 组 2

User2 - group1 等

显示用户所属组的代码,但不是以我喜欢的视觉方式显示如下:

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

提前致谢:)

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您可以像这样组合两个代码段:

    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 用户根本没有组成员身份(至少应该在 MemberOf 属性中具有默认的 Domain Users),但您评论说您也希望对此进行测试。

    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
    

    【讨论】:

    • 这将组显示为 SamAccountName,这很棒。但是,这些组仍然在用户后面的 1 行上,用“;”分隔。用户 1 - 组 1;组 2 用户 2 - 组 1;组 2;组 3 等
    • @Maikel 对不起,我误会了。我已经更新了代码以导出所需的格式。
    • 太好了,谢谢!是否也可以显示不是组成员的用户?例如,显示“No memberof group”?我用MemberOf = If((Get-ADGroup -Identity $group).Name){(Get-ADGroup -Identity $group).Name}Else{'**No Groups**'} 尝试了一些东西这不起作用,我猜是因为用户由于foreach而被过滤掉了?
    • @Maikel AD 用户始终是默认Domain Users 组的成员。当您在域中创建用户帐户时,它会自动添加到该组中。根本不存在不属于任何组的用户。见Default Groups。如果您想让用户不是特定组的成员,那是另一个问题。
    • @Maikel 在我看来不太可能,但我添加了新代码来测试用户的 MemberOf 属性是否完全为空。
    【解决方案2】:

    这有点笨拙,但你可以使用嵌套循环:

    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:如果用户不是组成员,则不会显示该用户。因此,它仅显示属于组成员的用户。 2:是否可以只显示组的名称/SamAccountname?
    • @Maikel,我根据您的评论更新了我的示例。希望对您有所帮助。
    • 谢谢,这给了我几乎我喜欢的结果。请参阅下面的 @Theo 评论,它提供与您的代码相同的输出。所以我只需要显示没有组的用户
    猜你喜欢
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多