如何在Ruby中使用Net::LDAP的person实体查询用户所属全部LDAP用户组
问题原因与解决方案
1. 优先检查属性取值逻辑
Net::LDAP返回的所有LDAP属性默认都是数组类型,哪怕属性仅有单一值。你提供的输出结果中memberof为字符串类型,说明大概率是你直接取了数组的第一个元素,或者隐式做了字符串转换,漏掉了其余的组值。
正确的查询取值示例:
require 'net/ldap' # 初始化LDAP连接 ldap = Net::LDAP.new( host: '你的域控地址', port: 389, auth: { method: :simple, username: '绑定账号DN', password: '绑定密码' } ) ldap.bind # 构造查询条件,明确指定拉取memberof属性 filter = Net::LDAP::Filter.eq('samaccountname', 'pujagarg') ldap.search( base: 'DC=int,DC=abc,DC=com', filter: filter, attributes: ['cn', 'title', 'mail', 'samaccountname', 'memberof'] ) do |entry| # 遍历memberof数组即可拿到所有直接隶属组 puts "用户#{entry[:cn][0]}的隶属组如下:" entry[:memberof].each_with_index do |group_dn, index| puts "#{index+1}. #{group_dn}" end end
2. 数组仍仅返回单条组的排查方案
如果遍历entry[:memberof]数组后确实只有一条值,可按以下顺序排查:
- 检查绑定LDAP的账号权限:部分域控会对低权限账号隐藏用户的部分组属性,换用更高权限的绑定账号测试即可验证
- 确认是否需要获取嵌套组:
memberof属性默认仅返回用户直接隶属的组,如果你需要获取嵌套的间接隶属组,需要递归查询每个组的隶属关系,参考逻辑如下:
def get_all_nested_groups(entry_dn, ldap, groups = []) entry = ldap.search( base: entry_dn, scope: Net::LDAP::SearchScope_BaseObject, attributes: ['memberof'] ).first return groups.uniq unless entry&.[](:memberof) entry[:memberof].each do |group_dn| next if groups.include?(group_dn) groups << group_dn get_all_nested_groups(group_dn, ldap, groups) end groups.uniq end
- 检查LDAP查询的大小限制:部分域控默认限制单次查询返回的属性值数量,可在查询时添加
size: 0参数解除默认限制
内容的提问来源于stack exchange,提问作者puja garg
相关产品推荐
相关产品推荐

