【问题标题】:Powershell Group Membership -Filtered by OUPowershell 组成员资格 - 按 OU 过滤
【发布时间】:2018-05-16 01:04:13
【问题描述】:

我想查看OU A 并仅获取OU B 中的每个组的成员。

我的脚本得到了我想要的信息,但它们都在一个列表中,没有按组分解,这使它毫无用处。

理想情况下,我想导出到 Excel,其中 A 列具有组名(不是 DN),B 列具有组成员。

感谢您的帮助。请参阅下面的内容了解我已经获得的内容:

$DNs = Get-ADGroup -Filter * -SearchBase "OU A" | ForEach { $_.DistinguishedName }
ForEach ($i in $DNs) {
    Get-ADComputer -Filter {memberof -eq $i} -SearchBase "OU B" | Select-Object Name
}

【问题讨论】:

    标签: powershell active-directory


    【解决方案1】:

    由于Get-ADGroupMember返回的DistinguishedName有OU信息,可以把前面的CN=ObjectName,去掉,再对比文字。然后使用-eq 确保子OU 不匹配。

    $Data = Get-ADGroup -Filter * -SearchBase "OU A" | ForEach-Object {
        $GroupName = $_.Name
        Get-ADGroupMember $_.DistinguishedName |
            Where-Object {($_.DistinguishedName -replace '^CN=.*?,OU','OU') -eq "OU=B,DC=Example"} |
            ForEach-Object {
                [PSCustomObject]@{
                    Name = $GroupName
                    Member = $_.Name
                }
            }
    }
    
    $Data | Export-CSV C:\Example.csv -NoTypeInformation
    

    或者,您可以事先检索 OU B 对象,然后检查该成员是否在该集合中。这种方法更简洁,因为它不依赖于文本解析,但资源密集度稍高。

    $OUBObjects = Get-ADObject -Filter * -SearchBase "OU B" | Select-Object -ExpandProperty DistinguishedName
    $Data = Get-ADGroup -Filter * -SearchBase "OU A" | ForEach-Object {
        $GroupName = $_.Name
        Get-ADGroupMember $_ |
            Where-Object {$_.DistinguishedName -in $OUBObjects} |
            ForEach-Object {
                [PSCustomObject]@{
                    Name = $GroupName
                    Member = $_.Name
                }
            }
    }
    
    $Data | Export-CSV C:\Example.csv -NoTypeInformation
    

    编辑:

    这是使用Get-ADGroup -Properties Members 而不是Get-ADGroupMember 的代码。请注意,这将返回 DN 而不是 sAMAccountNames

    $OUBObjects = Get-ADObject -Filter * -SearchBase "OU B" | Select-Object -ExpandProperty DistinguishedName
    $Data = Get-ADGroup -Filter * -SearchBase "OU A" -Properties Members | ForEach-Object {
        $GroupName = $_.Name
        $_.members |
            Where-Object {$_ -in $OUBObjects} |
            ForEach-Object {
                [PSCustomObject]@{
                    Name = $GroupName
                    Member = $_
                }
            }
    }
    
    $Data | Export-CSV C:\Example.csv -NoTypeInformation
    

    【讨论】:

    • 这似乎有效;但是,我多次收到错误:“Get-ADGroupMember:超出此请求的大小限制”有什么办法吗?
    • @Brandon 答案使用 Ansgars 解决方案更新为 this question,使用 Get-ADGroup -Properties Members 而不是 Get-ADGroupMember
    【解决方案2】:

    我能够在我的环境中完成这项工作,因此它应该可以在您的环境中进行一些必要的更改。如果您有任何问题,请告诉我,我会为您提供帮助。

    要获取给定组 A 和 B 中的 AD 用户: $ADGroups = Get-ADGroup -filter * -SearchBase "OU=A,DC=zone,DC=domain,DC=com" $报告 = @() Foreach ($Group in ($ADGroups | ? { $_.DistinguishedName -like "OU=B" })) { 尝试{ $members = Get-ADGroupMember -identity $group.Name $object = [pscustomobject]@{ 组名 = $group.Name; GroupMembers = "$($members.name -join ";")"; } $报告 += $对象 } 抓住 { 写主机“无法找到 AD 组成员” } }

    $report | Export-CSV -NoTypeInformation -Path "C:\Temp\Test.csv"
    

    从 A 和 B 中的 ADGroups 获取 B 中的 ADComputers:

    $ADGroups = Get-ADGroup -filter * -SearchBase "OU=A,DC=zone,DC=domain,DC=com"
    $report = @()
    Foreach ($Group in ($ADGroups | ? { $_.DistinguishedName -like "*OU=B*" }))
    {
        try{
            <#
            $members = Get-ADGroupMember -identity $group.Name
            #>
            $members = -Filter * -Property MemberOf -SearchBase "OU=B,DC=zone,DC=domain,DC=com" | Where-Object { $_.memberOf -like "*$($group.name)*" }
            $object = [pscustomobject]@{
                GroupName = $group.Name; 
                GroupMembers = "$($members.name -join ";")";
            }
            $report += $object
        }
        catch 
        {
            Write-Host "Unable to find AD Group Members"
        }
    }
    
    $report | Export-CSV -NoTypeInformation -Path "C:\Temp\Test.csv"
    

    第二个条件有效,但我在自己的网络中没有针对我正在执行的有限搜索的结果。试一试,我们可以根据需要进行调整。

    【讨论】:

    • 这将获取 OU A 和 OU B 中的组,而不是 OU A 中的组和 OU B 中的计算机对象成员。
    • @websch01ar 我试过了,它只会创建一个空白的 CSV。我假设我只需要更改 OU 路径和输出路径?正如 BenH 指出的那样,我想要“OU B”中的计算机是“OU A”中组的成员。抱歉,如果我没有说清楚的话。
    • 正确,我在您需要设置“A”和“B”值的位置并将 CSV 文件的路径指向您想要的位置。这将为您提供符合您要求的 ADGroup 中的用户。我承认我无法将您的叙述与您的示例代码结合起来。
    • Brandon,我对脚本做了一些调整,希望能满足你的需求。
    猜你喜欢
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2021-07-26
    • 2012-07-16
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多