【问题标题】:Function calling itself to enumerate nested group memberships调用自身以枚举嵌套组成员身份的函数
【发布时间】:2014-02-07 09:26:07
【问题描述】:

所以我一直在为我们的用户编写一个新的登录脚本。它基本上完成了,它工作得很好。但是,我编写了一个函数来枚举嵌套组成员资格,但我看不出它是如何按照我编写的方式工作的(尽管确实如此!)。

代码:

$Groups = New-Object System.Collections.ArrayList #Array for all groups incl. nested
$MaxIndex = 0

#---Adds every group to the array
Function AddGroup($P1)
{
    do
    {
        #---Param
        [String]$ADObject = $P1

        #---Gets all "main" groups of the current user
        $AllGroups = ([ADSISEARCHER]"samaccountname=$ADObject").Findone().Properties.memberof

        #---Durchlauf für jede Gruppe
        ForEach($Group in $AllGroups)
        {
            #---Convert
            [String]$GroupSTR = $Group

            if($GroupSTR -ne "")
            {
                #---Get actual group name
                $GroupSTR = $GroupSTR.SubString(3)

                $IndexOfChar = $GroupSTR.IndexOf(",")
                $GroupSTR    = $GroupSTR.SubString(0,$IndexOfChar)

                $Groups.Add($GroupSTR) | Out-Null

                if($MaxIndex -le $AllGroups.Count) { AddGroup $GroupSTR }

                $MaxIndex = $MaxIndex + 1
            }          
        }

        $GroupSTR = ""
    }
    while($GroupSTR -ne "")
}

AddGroup $LoggedOnUser

所以我要做的是使用当前用户的用户名调用函数 AddGroup。然后,该脚本获取用户当前所在的所有主要组,并为找到的每个组进入一个 foreach 循环。 它会删除 ADSISEARCHER 输出中不需要的乱码,然后将干净的组名称添加到数组中。

现在还获取嵌套组成员资格,我获取当前 AD 对象的所有组的计数。如果我的索引低于此计数,则表示当前对象也是其他组的一部分,然后再次调用该函数以获取这些。

现在我不明白的是,我的函数如何计算我的索引?该索引将始终低于或等于找到的组的总数。即使它找到零组。因此它应该无限次调用该函数,但它没有。

我在这里错过了什么?

【问题讨论】:

  • 你试过用这个方法改变$MaxIndex的值吗:$script:MaxIndex = $MaxIndex + 1 ???
  • 我看到你在计算 $MaxIndex,但看不到任何地方你实际上将它用作任何条件。没有'while($MaxIndex -le $AllGroups.Count){do stuff} 循环,因此尽管您使用了 $MaxIndex 代码,但递归仍在发生,而不是因为它。老实说,它似乎正在阅读的是if($GroupStr is a group){if(0 -le $AllGroups.Count){Recurse}}

标签: function powershell recursion


【解决方案1】:

如果您想了解您的代码是如何工作的,您可以在调试模式下使用 ISE 或 PowerGUI。

为了解决您的问题,为什么不使用 LDAP_MATCHING_RULE_IN_CHAIN 看看Search Filter Syntax

查找“user1”所属的所有组:

  • 将基设置为组容器 DN;例如根 DN (dc=dom,dc=fr)
  • 将范围设置为子树
  • 使用以下过滤器:(member:1.2.840.113556.1.4.1941:=cn=user1,cn=users,DC=x)

这是 PowerShell 中的示例:

$ADObjectDN = ([ADSISEARCHER]"samaccountname=$ADObject").Findone().Properties.distinguishedname
$AllGroups =([ADSISEARCHER]"member:1.2.840.113556.1.4.1941:=$ADObjectDN").FindAll()

【讨论】:

  • 可以完美运行,而且方式更简单。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多