2012-09-10 71 views
2

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

编辑:如果我使用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 

回答

4

试试这个:

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

这似乎在初始测试后工作。你很棒。谢谢。 – spassen

+1

谢谢。您还可以通过添加-Recursive开关来获取嵌套成员资格。 –

0

的思考,你没有明确提到:什么关于嵌套的OU?也就是说,你只是在你的目标OU中立即考虑一个成员?或者,为了达到您的目的,是否还会将逻辑上两三层的组织成员列入其中?例如,如果“加利福尼亚州”是你的目标OU,你是否只想直接在加利福尼亚州的物体?或者你是否想要在结果集中包括旧金山的所有成员和圣地亚哥的所有成员(它们是加州的子OU)?无论哪种方式:

Get-ADUser includes search and filter capability - 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将会在那里执行这个技巧)。


刚刚看到谢伊利维的回答。更简洁,好工作。如果没有显式的搜索库,您最终可能会访问具有相同名称并且埋在其他父OU下的容器,但结果集应该是相同的。例如,如果每个城市都包含一个标准的“办公室工作人员”OU,他们每个人都将用“OU =办公室人员”的表达来搜索。您可能想尝试两种方法并测试性能差异。这是平等的,谢伊的阅读更愉快。

相关问题