Powershell集团成员资格 - 由OU过滤

时间:2018-05-15 14:34:13

标签: powershell active-directory

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

我的脚本获取了我想要的信息,但它们都在一个列表中,而不是按组分解,这使得它无用。

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

我感谢任何帮助。请参阅下文,了解我已经获得的内容:

OU B

2 个答案:

答案 0 :(得分:0)

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

获取给定组A和B中的AD用户:     $ ADGroups = Get-ADGroup -filter * -SearchBase" OU = A,DC = zone,DC = domain,DC = com"     $ report = @()     Foreach($ Group in($ ADGroups |?{$ _.DistinguishedName-like" OU = B "}))     {         尝试{             $ members = Get-ADGroupMember -identity $ group.Name             $ object = [pscustomobject] @ {                 GroupName = $ group.Name;                 GroupMembers =" $($ members.name -join&#34 ;;")&#34 ;;             }             $ report + = $ object         }         抓住         {             写主机"无法找到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"

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

答案 1 :(得分:0)

由于DistinguishedName返回的Get-ADGroupMember包含OU信息,您可以从前面删除CN=ObjectName,,然后比较文本。然后使用-eq确保subOU不匹配。

$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