所以我一直在为我们的用户开发一个新的登录脚本。它是基本完成的,它工作得很好。但是,我编写了一个枚举嵌套组成员资格的函数,我不知道它是如何按我编写的方式工作的(虽然它确实如此!)。
代码:
$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对象的所有组的计数。如果我的索引低于此计数,则表示当前对象也是其他组的一部分,然后再次调用该函数以获取它们。
现在我不明白的是,我的功能怎么能算上我的索引?索引将始终低于或等于找到的组的总数。即使它找到零组。因此它应该无限次地调用该函数,但它不会。
我在这里缺少什么?
答案 0 :(得分:1)
如果要查找代码的工作方式,可以在调试模式下使用ISE或PowerGUI。
为了解决您的问题,为什么不使用LDAP_MATCHING_RULE_IN_CHAIN查看Search Filter Syntax
查找“user1”所属的所有组:
以下是PowerShell中的示例:
$ADObjectDN = ([ADSISEARCHER]"samaccountname=$ADObject").Findone().Properties.distinguishedname
$AllGroups =([ADSISEARCHER]"member:1.2.840.113556.1.4.1941:=$ADObjectDN").FindAll()