如何在Powershell中循环访问Active Directory组成员

如何在Powershell中循环访问Active Directory组成员,powershell,for-loop,active-directory-group,Powershell,For Loop,Active Directory Group,我试图列出包含特定OU成员的所有组。为此,我正在读取一个包含所有组名列表的文件,并使用get-ADGroupMember$groupName查找每个组的成员。我将每个成员的值转换为字符串,并与$member.indexOf(“特定OU”)进行比较。问题是,我还没有弄清楚如何获取$member[$I].indexOf(“特定OU”)。我的代码如下 编辑:如果我对每个循环使用一个循环,我可以正确地循环成员,但是我不能使用中断,这可以防止重复 Import-Module ActiveDirectory

我试图列出包含特定OU成员的所有组。为此,我正在读取一个包含所有组名列表的文件,并使用get-ADGroupMember$groupName查找每个组的成员。我将每个成员的值转换为字符串,并与$member.indexOf(“特定OU”)进行比较。问题是,我还没有弄清楚如何获取$member[$I].indexOf(“特定OU”)。我的代码如下

编辑:如果我对每个循环使用一个循环,我可以正确地循环成员,但是我不能使用中断,这可以防止重复

Import-Module ActiveDirectory
#declaring end result group array
$results = @()

#sets path for files
$pathName = $MyInvocation.MyCommand.Path
$pathLen = $pathName.LastIndexOf("\")
$pathStr = $PathName.Substring(0,$pathLen +1)
$APgroupFile = $pathStr + "APGroups.csv"
$groupFile = $pathStr + "GGroups.csv"

#gets the list of group names and loops through them
get-content $groupFile | foreach-object{
#sets all of the group names
#start of if1 
if($_.IndexOf("CN=") -ge 0){
$nameStart = $_.IndexOf("CN=")+3
$nameEnd = $_.indexOf(",")-$nameStart
$name = $_.substring($nameStart, $nameEnd)

#issue starts here
#goal is to find member of "specific OU".
#If found, add group to $results.  If not, go to next group
$members = get-ADGroupMember -Identity $name
if($members.length -gt 0){
$i=0
for($i=0; $i -le ($members.length -1); $i++){
#need to check users OU for specific OU.  If a user is member, save group to .txt.  If none are members, move to next group
    $OU = $members.toString()
    if($OU.indexOf("OU=specific OU") -ge 0){#start of if OU
    $results += New-Object psObject -Property @{'GroupName'=$name; 'Member'=$OU}
    break
    }#end if OU
    }#end for mem.length
}#end if mem.length
}#end if1
}#end foreach

$results | Export-Csv $APgroupFile -NoTypeInformation
试试这个:

Get-ADGroupMember -Identity $name |
Where-Object {$_.distinguishedName -like '*OU=specific OU*'}

您没有明确提到的一个考虑事项:嵌套的OU呢?也就是说,您是否只考虑目标OU中的一名成员?或者,出于您的目的,两级或三级OU的成员在逻辑上是否也包括在内?例如,如果“California”是您的目标OU,您是否只想要位于California正下方的对象?或者你想把旧金山的所有成员和圣地亚哥的所有成员(包括加利福尼亚的亚裔)包括在结果集中吗?无论哪种方式:

因此,这里的方法是为您的目标用户搜索您的目标OU,为每个用户单独搜索。您将在返回的结果集中获取该用户,或者不获取该用户。这可能是您测试的条件。显然,您需要用适当的变量替换“jdoe”(我认为$members[I].SamAccountName就可以做到这一点)



刚才看到了Shay Levy的答案。简洁多了,干得好。如果没有显式的searchbase,您可能会访问与其他父级OU下的容器同名的容器,但结果集应该是相同的。例如,如果每个城市都包含一个标准的“办公人员”OU,则将使用“OU=办公人员”表达式搜索每个城市。您可能希望尝试这两种方法并测试性能差异。在同等条件下,Shay Levy的阅读更令人愉快。

这似乎在初步测试后起作用。你很聪明。谢谢,谢谢。还可以通过添加-Recursive开关来获得嵌套成员身份。
  Get-ADuser -Filter {sAMAccountName -eq "jdoe"} -SearchBase "OU=IS,DC=foodomain,DC=com" -SearchScope SubTree

  Get-ADuser -Filter {sAMAccountName -eq "jdoe"} -SearchBase "OU=IS,DC=foodomain,DC=com" -SearchScope OneLevel