调用自身的函数枚举嵌套的组成员资格

时间:2014-02-07 09:26:08

标签: function powershell recursion

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

代码:

$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对象的所有组的计数。如果我的索引低于此计数,则表示当前对象也是其他组的一部分,然后再次调用该函数以获取它们。

现在我不明白的是,我的功能怎么能算上我的索引?索引将始终低于或等于找到的组的总数。即使它找到零组。因此它应该无限次地调用该函数,但它不会。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

如果要查找代码的工作方式,可以在调试模式下使用ISE或PowerGUI。

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

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

  • 将基数设置为组容器DN;例如,根DN(dc = dom,dc = fr)
  • 将范围设置为子树
  • 使用以下过滤器:(成员: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()