如何通过DirectorySearcher直接获取AD对象的SchemaClassName?
解决方案
当然可以直接通过PropertiesToLoad获取架构类名,不需要调用GetDirectoryEntry,有两种更高效的方式:
方式一:加载objectClass属性
DirectoryEntry.SchemaClassName本质上对应AD对象objectClass属性数组的最后一个元素(最具体的类名)。你可以直接把objectClass加入要加载的属性列表:
DirectoryEntry de = GetDirectoryEntry(); using (var Search = new DirectorySearcher(de)) { Search.Filter = "...."; Search.PropertiesToLoad.Add("Name"); Search.PropertiesToLoad.Add("distinguishedName"); Search.PropertiesToLoad.Add("objectGUID"); Search.PropertiesToLoad.Add("objectClass"); // 添加这个属性 var results = Search.FindAll(); foreach(SearchResult result in results) { // 从objectClass数组取最后一个元素,就是SchemaClassName对应的值 var objectClasses = result.Properties["objectClass"]; string schClassName = objectClasses[objectClasses.Count - 1].ToString(); } }
方式二:加载schemaClassName属性
部分AD环境支持直接读取schemaClassName属性(这是一个单值属性,直接返回最具体的架构类名),你可以直接添加到PropertiesToLoad:
DirectoryEntry de = GetDirectoryEntry(); using (var Search = new DirectorySearcher(de)) { Search.Filter = "...."; Search.PropertiesToLoad.Add("Name"); Search.PropertiesToLoad.Add("distinguishedName"); Search.PropertiesToLoad.Add("objectGUID"); Search.PropertiesToLoad.Add("schemaClassName"); // 添加这个属性 var results = Search.FindAll(); foreach(SearchResult result in results) { string schClassName = result.Properties["schemaClassName"][0].ToString(); } }
为什么这两种方式更优?
调用GetDirectoryEntry()会额外发起一次AD请求,而直接通过DirectorySearcher加载属性只需要一次请求,能显著提升批量查询的性能,避免不必要的网络开销。
内容的提问来源于stack exchange,提问作者gmail user
相关产品推荐
相关产品推荐

