LDAP DirectorySearcher仅返回单个memberOf组问题求助
解决AD用户memberOf属性仅返回单个组的问题
问题根源
memberOf是Active Directory里的多值属性,你的代码通过GetProperty取值时,大概率只取了该属性的第一个条目,所以只返回一个组。
修复步骤
1. 调整ADUser模型的MemberOf类型
把MemberOf从单个字符串改成集合类型,比如List<string>:
public class ADUser { // 其他属性保持不变 public List<string> MemberOf { get; set; } = new List<string>(); }
2. 修改多值属性的取值逻辑
两种方案任选其一:
方案一:重构GetProperty支持多值
把通用的GetProperty改成能识别多值属性的版本:
private static object GetProperty(SearchResult searchResult, string propertyName) { if (searchResult.Properties.Contains(propertyName)) { var propValues = searchResult.Properties[propertyName]; if (propValues.Count == 1) { return propValues[0].ToString(); } else if (propValues.Count > 1) { return propValues.Cast<string>().ToList(); } } return null; }
然后赋值时做类型转换:
UserModel.MemberOf = GetProperty(sResultSet, "memberOf") as List<string> ?? new List<string>();
方案二:单独处理memberOf属性
如果不想改动通用方法,直接在遍历结果时处理:
// 替换原来的UserModel.MemberOf赋值代码 if (sResultSet.Properties.Contains("memberOf")) { foreach (var group in sResultSet.Properties["memberOf"]) { UserModel.MemberOf.Add(group.ToString()); } }
3. 修正propertiesToLoad的数组长度(小问题)
你声明的是string[7]但里面有8个属性,建议改成自动推断长度避免报错:
string[] propertiesToLoad = new[] { "name","displayName", "telephoneNumber","description","title","department","manager","memberOf"};
核心修改后的代码片段
foreach (SearchResult sResultSet in searcher.FindAll()) { var UserModel = new ADUser(); UserModel.FullName = GetProperty(sResultSet, "name")?.ToString(); UserModel.DisplayName = GetProperty(sResultSet, "displayName")?.ToString(); UserModel.TelePhoneNumber = GetProperty(sResultSet, "telephoneNumber")?.ToString(); UserModel.Description = GetProperty(sResultSet, "description")?.ToString(); UserModel.JobTitle = GetProperty(sResultSet, "title")?.ToString(); UserModel.Department = GetProperty(sResultSet, "department")?.ToString(); // 处理memberOf多值属性 if (sResultSet.Properties.Contains("memberOf")) { foreach (var group in sResultSet.Properties["memberOf"]) { UserModel.MemberOf.Add(group.ToString()); } } lstADUsers.Add(UserModel); }
内容的提问来源于stack exchange,提问作者JaredWason
相关产品推荐
相关产品推荐

