通过AD Group Membership进行高效迭代

时间:2014-05-09 12:42:07

标签: performance powershell

我只是用我所拥有的东西直接进入,这个场景有点过于复杂而无法解释。

XML配置:

  <Groups>
    <Group priority="1" name="testGroup1" profile="testProfile1"/>
    <Group priority="2" name="testGroup2" profile="testProfile2"/>
    <Group priority="3" name="testGroup3" profile="testProfile3"/>
    <Group priority="4" name="testGroup4" profile="testProfile4"/>
  </Groups>

Powershell的:

$userProfileHash = [ordered]@{}
# Itterate through groups
foreach ($group in ($homeNode.ApplicationMethod | ? {$_.id -eq "adgroup"}).Groups.Group | Sort-Object $_.priority) {
  # Get group members, Itterate through them
  Get-ADGroupMember -Identity $group.name | ForEach-Object {
    # Add to ordered hash
    try {
      $userProfileHash.Add($($_.samaccountname),$group.profile)
    } catch {#don't want to see errors, there may be many}
  }
}

现在我要解释一下:

防止用户成为超过1个已定义组的成员。我按优先级(在foreach表达式中)对组进行排序,然后使用密钥必须唯一的哈希表规则。

这确保每个用户只添加一次,并且他们将被分配他们首先出现的组的个人资料。

我真的不喜欢这种方法,但这是我尝试过的最快的方法:有超过1100名测试用户。

问题:

如何加快此代码的速度? (生产中可能有成千上万的用户)

1 个答案:

答案 0 :(得分:0)

哈希表操作非常有效,如果由于重复添加而导致很多错误,那么最好不要删除错误处理。如果按降序对优先级进行排序,则可以执行以下操作:

$userProfileHash[$_.samaccountname] = $group.profile

并消除Try / Catch。重复的成员资格将被覆盖,为每个用户编写的最后一个条目将是它们所属的最高优先级组配置文件。

编辑:我发布的原始命令使用了+ =运算符。这个应用程序不正确,我已经更正了代码。