AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 18018
Accepted
Greg Meehan
Greg Meehan
Asked: 2009-06-03 10:26:37 +0800 CST2009-06-03 10:26:37 +0800 CST 2009-06-03 10:26:37 +0800 CST

枚举特定组的所有用户的 AD 查询语法是什么?

  • 772

到目前为止,这是行不通的;

(&(objectCategory=Person)(objectClass=Group)(CN=group_in_question))

(&(objectClass=Group)(objectCategory=Group)(member=CN=group_in_question))

(&(samAccountName=%USERNAME%)(memberof=CN=group_in_question))

(&(objectCategory=person)(objectClass=user)(memberOf=cn=group_in_question,ou=Groups,dc=mydomain,dc=com))

windows active-directory ldap
  • 7 7 个回答
  • 52844 Views

7 个回答

  • Voted
  1. Ryan Fisher
    2009-06-03T12:10:53+08:002009-06-03T12:10:53+08:00

    对于这种类型的查询,有几件事情需要考虑:

    1. 此查询可能返回多少个对象?
    2. 您想扩展属于群组成员的群组吗?
    3. 您是否必须处理任何“大型”团体(超过 1500 名成员)?

    如果您的查询必须搜索大型用户数据库,则应始终包含“(ObjectCategory=person)”。您想要这样做有几个原因。ObjectCategory 是一个索引属性,而 objectClass 不是,这将显着提高您在大型 AD 数据库上的查询速度。此外,同时使用 objectCategory 和 objectClass 属性将防止在查询中返回“联系人”对象。

    如果您的结果集将返回超过 1000 个结果,则需要注意性能问题。在 ADUC GUI 中,您可以通过“选项”对话框更改 2000 个项目的限制,增加可能会大大减慢您的查询速度。如果您要使用 VBScript 并枚举 GetObject 结果,对于大型组来说,这也将非常非常慢。对于 Quest Powershell cmdlet,您需要包含“-sizelimit”参数以覆盖 1000 项限制:

    get-qadgroupmember somegroup -sizelimit 0
    

    如果您使用代码(VBScript、JScript、.Net)创建连接对象并向其添加 LDAP 查询,则需要在连接对象上设置“.pageSize”属性以获得分页结果,默认值为不返回分页结果,而是将其限制为 1000 个项目。我通常将 .pageSize 设置为 1000,因为这是最大值。

    扩展嵌套组是一个棘手的问题。获取嵌套组信息的最简单方法是使用 Quest Powershell cmdlet:

    get-qadgroupmember somegroup -indirect -sizelimit 0
    

    从 VBscript/JScript 脚本中,您可以使用“GetObject”并枚举成员集合,测试每个成员的“用户或组”,然后递归到嵌套组中。这很慢,您不应该这样做,除非作为 VBScript 编程的练习。

    最终,您可能希望学习通过直接 LDAP 查询来完成此操作。这是通过LDAP_MATCHING_RULE_IN_CHAIN运算符完成的。此运算符可能难以使用,如果您的组有深层嵌套结构,它在 DC 上可能非常昂贵。这种方法的好处是,对于非常大的组(默认情况下超过 1500 个成员),您将能够对作为组成员的用户进行查询(甚至是间接的),而不是检索组并尝试读取成员属性(必须在“大”组的特殊方法中处理。即,您获得用户对象的报告,ratehr 比您尝试读取大型属性数组的单个组对象。

    (&(objectCategory=person)(objectClass=user)(memberof:1.2.840.113556.1.4.1941:=(cn=Group1,OU=groupsOU,DC=x)))
    

    如果您在使用“大型”组时遇到问题,您还可以增加 AD 在限制对 .member 属性的访问时使用的限制。

    • 9
  2. Best Answer
    Evan Anderson
    2009-06-03T10:31:24+08:002009-06-03T10:31:24+08:00

    第三种语法在 LDP.EXE 中对我的一个域很有效。我通常不会将 (objectCategory=person) 放在那里,但它也可以正常工作。

    当您尝试使用它时,您会返回什么样的错误?

    • 2
  3. KAPes
    2009-06-29T05:39:11+08:002009-06-29T05:39:11+08:00

    我认为问题是查找 A 组的所有用户,而不是查找 A 用户是否属于 A 组?

    如果要查找组的所有成员,请使用

    dsquery group -name "MyGroup" | dsget group -member
    

    如果你想找到嵌套成员也使用

    dsquery group -name "MyGroup" | dsget group -member -expand
    

    如果有超过 1000 或 1500 个成员,在这种情况下 dsquery 可能不会提供结果,请使用 joeware.net 中的adfind.exe

    ADFIND -f "&(objectcategory=group)(cn=MyGroup)" member 
    
    • 1
  4. Jeff
    2011-04-29T04:40:01+08:002011-04-29T04:40:01+08:00

    工作了几天以尝试生成一个脚本,该脚本将从包含用户 DN 列表的文件中提取并为它们解析属性。在 JFV 的回应中看到您的网站并心脏病发作。这是我从 JFV 的回复中生成的脚本。基本上,当您可以直接从组中提取时,为什么要从文件中读取(还没有错误捕获)......这个脚本允许我将文本文件拉入 Excel 或其他电子表格应用程序并在管道上进行分隔。那时我可以进行所有我想要的排序。只是以为别人可以从我的损失中获益。:-(

    Dim objGroup
    
    Dim objUser
    
    on error resume next
    
    'Create a file and write headers
    Set fs = CreateObject("Scripting.FileSystemObject")
    
    Set f = fs.CreateTextFile ("lastpassword.txt")
    
    f.WriteLine "firstName|initials|lastName|userPrincipalName|physicalDeliveryOfficeName|sAMAccountName|mail|cn|description|mobile|telephoneNumber|physicalDeliveryOfficeName|department|facsimileTelephoneNumber|pager"
    
    'Search for a group name in AD and parse information to a file in pipe delimination
    
       Set objGroup = Getobject ("LDAP: //CN=groupname,OU=GROUPS,DC=FQDN,DC=FQDN,DC=FQDN")
    
       For Each objUser In objGroup.Members
    
          f.WriteLine objUser.firstName & "|" & _
    
                objUser.initials & ".|" & _
    
                objUser.lastName & "|" & _
    
                objUser.userPrincipalName & "|" & _
    
                objUser.physicalDeliveryOfficeName & "|" & _
    
                objUser.sAMAccountName & "|" & _
    
                objUser.mail & "|" & _
    
                objUser.cn & "|" & _
    
                objUser.description & "|" & _
    
                objuser.mobile & "|" & _
    
                objuser.telephoneNumber & "|" & _
    
                objuser.physicalDeliveryOfficeName & "|" & _
    
                objuser.department & "|" & _
    
                objuser.facsimileTelephoneNumber & "|" & _
    
                objuser.userAccountControl & "|" & _
    
                objUser.PasswordLastChanged
    
       Next
    
    f.close
    
    • 1
  5. Doug Chase
    2009-06-03T10:40:40+08:002009-06-03T10:40:40+08:00

    这可以在 PowerShell 中使用 Quest AD cmdlet 最轻松地完成 -

    get-QADGroupMember [groupname]
    

    然后过滤和排序!

    get-QADGroupMember [groupname] | where {$_.[Property] -like [criteria]} | sort-object
    
    • 0
  6. JFV
    2009-06-03T10:45:34+08:002009-06-03T10:45:34+08:00

    这是我通过 VBScript 使用的东西:

    枚举用户

       Dim objGroup
       Dim x 
    
       Set objGroup = Getobject ("LDAP: //CN=LocalGrp,OU=Staff, DC=net, DC=dom")
       For Each x In objGroup.Members
          WScript.Echo x.Class
          WScript.Echo x.Name
          WScript.Echo x.ADsPath
          WScript.Echo x.distinguishedName + vbCrLf
       Next
    
    • 0
  7. matt wilkie
    2009-09-30T12:37:58+08:002009-09-30T12:37:58+08:00

    KAPes,您正在回答我感兴趣的问题,列出 A 组的所有成员。但是,您的命令示例不起作用,因为“成员”应该是复数,-members. 要在格式良好的登录名、显示名和电子邮件地址表中枚举 Active Directory 组的所有成员(全部在一行上):

    dsget group "CN=Group A,OU=DepartmentB,OU=Users and Groups,DC=my,DC=domain,DC=com" -members | dsget user -samid -display -email
    

    更多信息:http ://technet.microsoft.com/en-us/library/cc755876%28WS.10%29.aspx#BKMK_group

    • 0

相关问题

  • 您最喜欢的云计算提供商是什么?[关闭]

  • Vanilla Powershell 是否足以成为 Windows 和 DB 服务器管理员的语言?

  • 为什么添加新驱动器后我的磁盘驱动器访问速度如此之慢?

  • 在 Windows Server 2003 下使用 wscipt 从 .asp 文件运行 .exe

  • 最佳混合环境(OS X + Windows)备份?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve