You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:48:38