如何在PowerShell中遍历Active Directory组成员

4
我正在尝试列出包含来自特定OU成员的所有组的列表。为此,我正在读取一个包含所有组名称的文件,并使用get-ADGroupMember $groupName查找每个组的成员。我将每个成员的值转换为字符串并与$member.indexOf("specific OU")进行比较。问题是,我还没有弄清楚如何获得$member[$i].indexOf("specific OU")。我的代码如下。
编辑:如果我使用for-each循环,我可以正确地循环遍历成员,但我不能使用break,这会防止重复项。
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
2个回答

4

试试这个:

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

经过初步测试,这似乎可以工作。你真是太棒了。谢谢。 - spassen
1
谢谢。您还可以通过添加-Recursive开关来获取嵌套成员资格。 - Shay Levy

0
一个你没有明确提到的考虑因素:嵌套OU怎么办?也就是说,你只考虑目标OU中的成员吗?还是对于你的目的来说,两三层深度的OU成员也逻辑上被包括在内?例如,如果“加利福尼亚”是你的目标OU,你只想要直接在加利福尼亚下的对象吗?还是你想要在结果集中包括旧金山和圣迭戈的所有成员(它们是加利福尼亚的子OU)?无论哪种方式:

Get-ADUser 包括搜索和过滤功能 - http://technet.microsoft.com/en-us/library/ee617241

  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

因此,这里的方法是在目标OU中搜索您的目标用户,每个用户单独进行一次搜索。您将在返回的结果集中得到该用户或未得到。那就是您要测试的条件。显然,您需要使用适当的变量替换“jdoe”(我认为$ members [i] .SamAccountName可以解决问题)。


刚看到Shay Levy的回答,非常简洁,干得好。如果没有明确的搜索基础(searchbase),你可能会访问被其他父OU埋藏的同名容器,但结果集应该是相同的。例如,如果每个城市都包含一个标准的“办公室人员”OU,那么每个OU都将使用“OU = Office Staff”表达式进行搜索。您可能希望尝试两种方法并测试性能差异。在这种情况下,Shay Levy的读起来更加愉快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接