【问题标题】:How to loop through Active Directory group members in Powershell如何在 Powershell 中循环访问 Active Directory 组成员
【发布时间】:2012-09-03 10:50:10
【问题描述】:

我正在尝试列出包含来自特定 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

【问题讨论】:

    标签: powershell for-loop active-directory-group


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 这似乎在初始测试后工作。你很聪明。谢谢。
    • 谢谢。您还可以通过添加 -Recursive 开关来获得嵌套的成员资格。
    【解决方案2】:

    您没有明确提及的一个注意事项:嵌套 OU 呢?即,您是否只考虑目标 OU 内的成员?或者,出于您的目的,两个或三个层次深的 OU 成员是否也被包括在内?例如,如果“California”是您的目标 OU,您是否只想要直接在 California 下的对象?或者您想在结果集中包括旧金山的所有成员和圣地亚哥的所有成员(它们是加利福尼亚的子 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 会在那里解决问题)。


    刚刚看到Shay Levy 的回答。更简洁,干得好。如果没有明确的搜索库,您最终可能会访问隐藏在其他父 OU 下的同名容器,但结果集应该是相同的。例如,如果每个城市都包含一个标准的“Office Staff”OU,则每个城市都将使用“OU=Office Staff”表达式进行搜索。您可能想尝试这两种方法并测试性能差异。在相同的情况下,Shay Levy 的阅读更愉快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 2023-03-20
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多