【发布时间】: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