基本類型
========
主要使用的是三個類型, 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
經過研究, 改寫. 貼出My Code如下.
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
http://www.codeproject.com/KB/aspnet/adsi1.aspx