【问题标题】:Directory Searcher not returning all the results目录搜索器未返回所有结果
【发布时间】:2020-05-29 16:42:26
【问题描述】:

我创建了 2400 个安全组并将所有这些安全组添加到用户。当我使用DirectorySearcher 查询 Active Directory 时,我只得到 2049 个安全组。其余安全组丢失。我尝试了下面提到的分页方法,它仍然不起作用。获得所有安全组的理想方式是什么?

$gcName = "blahblah.com"
$dn =  "CN=blahblah,OU=Tenants,OU=INT,DC=dom,DC=abc,DC=def,DC=com"
$searchRoot = [ADSI]("LDAP://" + $gcName + "/" + $dn)
$searcher = New-Object System.DirectoryServices.DirectorySearcher($searchRoot, "(objectClass=*)", @("tokenGroups"), [System.DirectoryServices.SearchScope]::Base)
$searcher.PageSize=500
foreach ($SearchResult  in $searcher.FindAll()){$SearchResult.Properties["tokenGroups"].Count}      

编辑 1: 当我使用以下命令时,它不会返回安全组的完整列表。理想情况下,我希望这里的所有组以及其他一些用户属性。

$searchRoot = [ADSI]("LDAP://" + $gcName)
$searcher = New-Object System.DirectoryServices.DirectorySearcher($searchRoot, "(|((msOnline-WindowsLiveNetId=xxxxxx))((msOnline-AlternativeSecurityId=YYYYYYYY)))", @("name"))
$searcher.PropertiesToLoad.AddRange(@("msOnline-UserPrincipalName","objectClass","msOnline-AccountEnabled","displayName","proxyaddresses","memberOf"))
$sr = $searcher.FindOne()
$de= $sr.GetDirectoryEntry()
$de.RefreshCache(@("tokenGroups"))
$de.Properties["tokenGroups"].Count

当我使用以下内容时,它会返回所有组,但我没有获取用户属性。

$searchRoot = [ADSI]("LDAP://" + $gcName)
$searcher = [adsisearcher]::new($searchRoot, "(&(objectClass=group)(member=$dn))", @("name"))
$searcher.PageSize=500
$searcher.FindAll().Count

这也不行。

$searchRoot = [ADSI]("LDAP://" + $gcName)
$searcher = [adsisearcher]::new($searchRoot, "((member=$dn))", @("name","msOnline-UserPrincipalName","tokenGroups"))
$searcher.PageSize=500
$searcher.FindAll().Count

我想要实现的只是通过一次搜索获取所有 tokenGroups 和少量用户属性。

【问题讨论】:

    标签: powershell active-directory azure-active-directory domaincontroller


    【解决方案1】:

    PageSize 只影响搜索结果的数量,但只有一个搜索结果。您正在计算该结果的tokenGroups 属性中的记录数。

    一个可能的问题是tokenGroups 只会显示安全组,因为它是为确定用户的权限而设计的。如果用户在“组类型”为“分发”的任何组中,则不会包含在tokenGroups 中。

    如果您的 AD 林中只有一个域,则可以查看 memberOf 属性而不是 tokenGroups。如果您的林中有多个域,则 memberOf may not give you all the groups

    您还可以更改搜索,使其查找以该用户为成员的所有组。看起来像这样:

    $gcName = "blahblah.com"
    $dn =  "CN=blahblah,OU=Tenants,OU=INT,DC=dom,DC=abc,DC=def,DC=com"
    $searchRoot = [ADSI]("LDAP://" + $gcName)
    $searcher = [adsisearcher]::new($searchRoot, "(&(objectClass=group)(member=$dn))", @("name"))
    $searcher.PageSize=500
    $searcher.FindAll().Count
    

    请注意,您可以使用[adsisearcher]::new 作为New-Object System.DirectoryServices.DirectorySearcher 的缩写形式。

    【讨论】:

    • 使用新过滤器的查询只获取tokenGroups。我正在寻找的是查询应该返回一些其他用户属性以及正确的 tokenGroups 列表。
    • @("tokenGroups") 告诉它在搜索期间要返回哪些属性。因此,只需在该数组中添加您想要获取的任何其他属性。
    • 这不会返回任何结果。如果我删除“tokenGroups”,它工作正常。
    • 我刚刚更新了这个问题。请看一看。
    • “不返回完整的安全组列表” - 你怎么知道的?
    猜你喜欢
    • 2019-12-05
    • 2020-08-30
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多