C#用Display name查询Active Directory, 获得Login name
基本类型
========
主要使用的是三个类型, DirectoryEntry, SearchResult 和DirectorySearcher.
DirectoryEntry是包含一个对象具体信息的类. 这个类被用来实际地绑定下面的ADSI(Active directory Service Interface)对象. 它是动态的, 意味着其中的信息来自Domain Controller, 获取额外的信息会带来对DC查询的网络通讯.
DirectorySearcher是主要的搜索类. 它的对象根据filter的标准来执行搜索操作. 获得SearchResultCollection类型的搜索结果.
SearchResult是使用DirectorySearcher执行搜索返回的一个缓存对象. 由于数据是缓存在本地的, 所以获取信息时不需要通过网络, 这同时也意味着其中的信息可能会过期.
LDAP path的格式
=======
格式如下:
LDAP://HostName[:PortNumber][/DistinguishedName]
举例:
LDAP://domain.fabrikam.com/dc=domain, dc=fabricam, dc=com
Search Filters
=======
合法的Filters有限制条件如下:
- 表达式的各个部分必须被小括号括起
- 表达式可以使用关系运算符: <, <=, =, >=, 和 >. 举例: (lastName=Smith)
- 符合表达式的格式是运算符作为前缀, 运算符包括 & 和 | . 举例: (&(objectClass=user)(|(lastName=Smith)(lastName=Jones))) 该表达式的意义是查找姓为Smith或者是Jones的用户.
AD Service Providers
=======
Active Directory中的名字
=======
这是非常容易混淆的部分, 因为不同的provider有不同的名字. 有时同样的名字在不同的provider下会引用不同的属性.
下表清晰的列出了相关信息.
一些缩写的释义.
full NT name 和 full LDAP name
============
full NT name的格式是
NetBIOSDomain\sAMAccountName
full LDAP name的格式举例
cn=Test1,ou=Sales,ou=East,dc=Domain1,dc=com
经过研究, 改写. 贴出我的代码如下.
using System; using System.Collections.Generic; using System.Text; using System.DirectoryServices; namespace displaytologin { class Program { static void Main(string[] args) { Convertor c = new Convertor(); string displayName = "Robert Chartier"; string loginName = c.GetLoginName(displayName); } } class Convertor { public string GetLoginName(string DisplayName) { string returnStr = string.Empty; SearchResultCollection results = null; string filter = "(&(objectCategory=user)(objectClass=person)(displayName=" + DisplayName + "))"; string connectionPrefix = "LDAP://cn=users,DC=testdc,DC=local"; using (DirectoryEntry root = new DirectoryEntry(connectionPrefix, "administrator", "TestPassword123$")) { using (DirectorySearcher searcher = new DirectorySearcher(root)) { searcher.ReferralChasing = ReferralChasingOption.All; searcher.SearchScope = SearchScope.Subtree; searcher.Filter = filter; results = searcher.FindAll(); } } foreach (SearchResult sr in results) { DirectoryEntry entry = sr.GetDirectoryEntry(); PropertyValueCollection pg = entry.Properties["sAMAccountName"]; returnStr = (string)pg.Value; } return returnStr; } } }
参考资料:
Searching Active Directory for Users and Groups
by Jon Wojtowicz
Accessing Active Directory Through the .NET Framework
by Robert Chartier
Names for Objects in Active Directory
其余参考资料:
Search Filter Syntax
http://msdn.microsoft.com/en-us/library/aa746475%28VS.85%29.aspx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律