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