微軟資料:http://www.microsoft.com/china/technet/prodtechnol/exchange/2003/insider/ldapquery.mspx#BasicLDAPSyntax
圖1
圖2
代碼:
using System.DirectoryServices;
private void btnSearch_Click(object sender, EventArgs e)
{
treeLDAP.Nodes.Clear();
DirectoryEntry entry = new DirectoryEntry();
DirectorySearcher serach = new DirectorySearcher();
try
{
entry.Path = txtLDAPPath.Text.Trim();
//entry.Username = txtRootDN.Text.Trim();
//entry.Password = txtPwd.Text.Trim();
entry.AuthenticationType = AuthenticationTypes.None;
serach.SearchRoot = entry;
serach.Filter = txtFilter.Text.Trim();
// Get the first entry of the search.
SearchResult searchResult = serach.FindOne();
if (searchResult == null)
{
MessageBox.Show("Could not find entries: " +
entry.Path, "LDAP Search",
MessageBoxButtons.OK);
return;
}
DirectoryEntry directoryEntry = searchResult.GetDirectoryEntry();
txtEntryName.Text = directoryEntry.Name;
ResultPropertyCollection resultPropColl = searchResult.Properties;
foreach (string propName in resultPropColl.PropertyNames)
{
TreeNode node = this.treeLDAP.Nodes.Add(propName);
foreach (Object collection in resultPropColl[propName])
{
node.Nodes.Add(collection.ToString());
}
}
}
catch (Exception exc)
{
MessageBox.Show("Exception : " + exc.Message,
"LDAP Search", MessageBoxButtons.OK);
}
}
*******************************************
LDAP 伺服器 配置
suffix "dc=webCMS,dc=com"
rootdn "cn=Manager,dc=webCMS,dc=com"
*******************************************
entry.Path = "LDAP://192.168.0.253/dc=webCMS,dc=com" //LDAP 必須大寫
entry.Username = "dc=Manager,dc=webCMS,dc=com" //rootdn
serach.Filter = "((ou=mail))" //括弧很重要,(!(ou=mail)(ou=peopele))表示兩個條件 or
//(&(ou=mail)(ou=peopele))表示兩個條件 and
//可以有兩個以上的條件
LDAP 介紹(一)
如果你在電腦行業工作,那麼對LDAP可能早有耳聞了。想深入地瞭解LDAP嗎?那麼可以好好地讀一下這篇文章。這篇介紹性的文章是一系列介紹如何在企業中設計、實現和整合LDAP環境的文章的頭一篇。主要是先讓你熟悉一下LDAP的基本概念,那些比較困難的細節問題將放到以後討論。在這篇文章中我們將要介紹:
什麼是LDAP?
什麼時候該用LDAP儲存資料?
現在LDAP技術不僅發展得很快而且也是激動人心的。在企業範圍內實現LDAP可以讓運行在幾乎所有電腦平台上的所有的應用程式從LDAP目錄中擷取資訊。LDAP目錄中可以儲存各種類型的資料:電子郵件地址、郵件路由資訊、人力資源資料、公用密匙、連絡人清單,等等。通過把LDAP目錄作為系統整合中的一個重要環節,可以簡化員工在企業內部查詢資訊的步驟,甚至連主要的資料來源都可以放在任何地方。如果Oracle、Sybase、Informix或Microsoft SQL資料庫中已經儲存了類似的資料,那麼LDAP和這些資料庫到底有什麼不同呢?是什麼讓它更具優勢?請繼續讀下去吧!
什麼是LDAP?
LDAP的英文全稱是Lightweight Directory Access Protocol,一般都簡稱為LDAP。它是基於X.500標準的,但是簡單多了並且可以根據需要定製。與X.500不同,LDAP支援TCP/IP,這對訪問Internet是必須的。LDAP的核心規範在RFC中都有定義,所有與LDAP相關的RFC都可以在LDAPChina.com RFC專欄中找到。
怎麼使用LDAP這個術語呢?
在日常交談中,你可能會聽到有些人這麼說:“我們要把那些東西存在LDAP中嗎?”,或者“從LDAP資料庫中取出那些資料!”,又或者“我們怎麼把LDAP和關係型資料庫整合在一起?”。嚴格地說,LDAP根本不是資料庫而是用來訪問儲存在資訊目錄(也就是LDAP目錄)中的資訊的協議。更為確切和正式的說法應該是象這樣的:“通過使用LDAP,可以在資訊目錄的正確位置讀取(或儲存)資料”。但是,也沒有必要吹毛求疵,儘管表達得不夠準確,我們也都知道對方在說什麼。
LDAP目錄是資料庫嗎?
就象Sybase、Oracle、Informix或Microsoft的資料庫管理系統(DBMS)是用於處理查詢和更新關係型資料庫那樣,LDAP伺服器也是用來處理查詢和更新LDAP目錄的。換句話來說LDAP目錄也是一種類型的資料庫,但是不是關係型資料庫。不象被設計成每分鐘需要處理成百上千條資料變化的資料庫,例如:在電子商務中經常用到的線上交易處理(OLTP)系統,LDAP主要是最佳化資料讀取的效能。
LDAP目錄的優勢
現在該說說LDAP目錄到底有些什麼優勢了。現在LDAP的流行是很多因素共同作用的結果。我在這裡說的不過是一些基本的原因,請你注意一下這不過是一小部分原因。
可能LDAP最大的優勢是:可以在任何電腦平台上,用很容易獲得的而且數目不斷增加的LDAP的用戶端程式訪問LDAP目錄。而且也很容易定製應用程式為它加上LDAP的支援。
LDAP協議是跨平台的和標準的協議,因此應用程式就不用為LDAP目錄放在什麼樣的伺服器上操心了。實際上,LDAP得到了業界的廣泛認可,因為它是Internet的標準。產商都很願意在產品中加入對LDAP的支援,因為他們根本不用考慮另一端(用戶端或服務端)是怎麼樣的。LDAP伺服器可以是任何一個開發原始碼或商用的LDAP目錄伺服器(或者還可能是具有LDAP介面的關係型資料庫),因為可以用同樣的協議、用戶端串連軟體包和查詢命令與LDAP伺服器進行互動。與LDAP不同的是,如果軟體產商想在軟體產品中整合對DBMS的支援,那麼通常都要對每一個資料庫伺服器單獨定製。
不象很多商用的關係型資料庫,你不必為LDAP的每一個用戶端串連或許可協議付費。
大多數的LDAP伺服器安裝起來很簡單,也容易維護和最佳化。
LDAP伺服器可以用“推”或“拉”的方法複製部分或全部資料,例如:可以把資料“推”到遠端辦公室,以增加資料的安全性。複製技術是內建在LDAP伺服器中的而且很容易配置。如果要在DBMS中使用相同的複製功能,資料庫產商就會要你支付額外的費用,而且也很難管理。
LDAP允許你根據需要使用ACI(一般都稱為ACL或者存取控制清單)控制對資料讀和寫的許可權。例如,裝置管理員可以有權改變員工的工作地點和辦公室號碼,但是不允許改變記錄中其它的域。ACI可以根據誰訪問資料、訪問什麼資料、資料存在什麼地方以及其它對資料進行存取控制。因為這些都是由LDAP目錄伺服器完成的,所以不用擔心在用戶端的應用程式上是否要進行安全檢查。
LDAP對於儲存下面這樣的資訊最為有用,也就是資料需要從不同的地點讀取,但是不需要經常更新。例如,這些資訊儲存在LDAP目錄中是十分有效:
- 公司員工的電話號碼簿和組織圖
- 客戶的聯絡資訊
- 電腦管理需要的資訊,包括NIS映射、email假名,等等
- 軟體包的配置資訊
- 公用認證和安全密匙
什麼時候該用LDAP儲存資料?
大多數的LDAP伺服器都為讀密集型的操作進行專門的最佳化。因此,當從LDAP伺服器中讀取資料的時候會比從專門為OLTP最佳化的關係型資料庫中讀取資料快一個數量級。也是因為專門為讀的效能進行最佳化,大多數的LDAP目錄伺服器並不適合儲存需要經常改變的資料。例如,用LDAP伺服器來儲存電話號碼是一個很好的選擇,但是它不能作為電子商務網站的資料庫伺服器。
如果下面每一個問題的答案都是“是”,那麼把資料存在LDAP中就是一個好主意。
- 需要在任何平台上都能讀取資料嗎?
- 每一個單獨的記錄項是不是每一天都只有很少的改變?
- 可以把資料儲存在平面資料庫(flat database)而不是關係型資料庫中嗎?換句話來說,也就是不管什麼範式不範式的,把所有東西都存在一個記錄中(差不多隻要滿足第一範式)。
最後一個問題可能會唬住一些人,其實用平面資料庫去儲存一些關係型的資料也是很一般的。例如,一條公司員工的記錄就可以包含經理的登入名稱。用LDAP來儲存這類資訊是很方便的。一個簡單的判斷方法:如果可以把資料儲存在一張張的卡片裡,就可以很容易地把它存在LDAP目錄裡。