活动目录编程
載自:ZDNet China
目錄樹的每個節(jié)點包括一系列能夠被檢索和操控的屬性。下面的術(shù)語在使用活動目錄時很有用。
- 目錄:用來保存信息的信息源。
- 活動目錄架構(gòu):用來定義目錄對象的屬性。它類似于用來定義數(shù)據(jù)庫結(jié)構(gòu)的數(shù)據(jù)庫架構(gòu)。
現(xiàn)在讓我們把主要精力轉(zhuǎn)到如何使用活動目錄上吧。
通過代碼訪問目錄
.NET框架為訪問活動目錄提供了System.DirectoryServices命名空間。它使用活動目錄服務接口(Active Directory Services Interfaces,ADSI)技術(shù),微軟也向其他很多網(wǎng)絡提供商提供這個接口。這個命名空間包括兩個組件類:
- DirectoryEntry:用來使用活動目錄層次里單獨的節(jié)點或者對象。它要與helper類一起使用才能操控目錄資源和瀏覽資源樹。你可以創(chuàng)建、刪除、重命名、移動子節(jié)點,并枚舉子節(jié)點。
- DirectorySearcher:讓你使用輕型目錄訪問協(xié)議(Lightweight Directory Access Protocol,LDAP),它是唯一能夠支持目錄搜索的ADSI提供程序。你可以用DirectoryEntry類來使用搜索的結(jié)果。
盡管上面不是命名空間所包含的所有類,但是它們是最重要和最常用的兩個。下面列表A里的C#代碼用來訪問我網(wǎng)絡上的活動目錄:
DirectoryEntry de = new DirectoryEntry();de.Path = "LDAP://192.168.1.1/CN=Users;DC=DomainName";
de.Username = @"DomainName\UserName";
de.Password = "Password";
下面列表B里是相應的VB.NET代碼:
Dim de As DirectoryEntrySet de = New DirectoryEntry()
de.Path = "LDAP://192.168.1.1/CN=Users;DC=DomainName"
de.Username = @"DomainName\UserName"
de.Password = "Password"
這些代碼讓你能夠訪問活動目錄,這樣你就可以使用目錄對象。你可能注意到路徑用的是LDAP。ADSI包括下面這四個目錄服務提供程序(我還提供了每個程序的句法):
- Windows 2000或Windows XP:WinNT://path
- LDAP:LDAP://path
- Novell NetWare目錄服務:NDS://path
- Novell NetWare 3.x:NWCOMPAT://path
注意:使用活動目錄一定要求安裝好ADSI SDK或者ADSI運行庫之后,才能夠創(chuàng)建使用這一功能的應用程序。Windows 2000和XP默認就已經(jīng)安裝了它們。我們把上面的示例代碼進行了擴展,以訪問對象的所有屬性,見下面的列表C:
DirectoryEntry de = new DirectoryEntry("LDAP://192.168.1.1/CN=Users;DC=DomainName");foreach(string key in de.Properties.PropertyNames) {
Console.WriteLine(key + " = ");
foreach(Object obj in de.Properties[key])
Console.WriteLine(obj);
} ?
列表D是相應的VB.NET代碼:
Dim de As DirectoryEntry = New DirectoryEntry
("LDAP://192.168.1.1/CN=Users;DC=DomainName")
Dim key As String
Dim obj As Object
For Each Key In de.Properties.PropertyNames
Console.WriteLine(key & " = ")
For Each obj In de.Properties(key)
Console.WriteLine(CStr(obj))
Next obj
Next Key
?
由于可以訪問目錄,我們可以定位和操控已有的項目,還可以添加新的對象。
在使用目錄的時候,你可能需要更改對象的一個或者多個屬性。例如,保存在目錄下的用戶的電話號碼可能會發(fā)生改變。下面列表E里的代碼用到了前面提到的類來改變這個屬性:
DirectoryEntry de = new
DirectoryEntry("LDAP://192.168.1.1/CN=Users;DC=DomainName");
de.Properties["HomeNumber"])[0] = "111-999-9999";
de.CommitChanges();
必須調(diào)用CommitChanges方法來進行永久的更改。如果你不使用這個方法,所進行的改變就不會被保存。相應的VB.NET見列表F:
Dim de As DirectoryEntry = New
DirectoryEntry("LDAP://192.168.1.1/CN=Users;DC=DomainName")
objDirEnt.Properties("HomeNumber")(0) = "111-999-9999"
你可以用這種方式來處理所有的屬性。你可能會碰到新對象需要被加到目錄里的情況。
添加新對象
添加新對象很簡單。你先要使用DirectoryEntry對象,再用其Children屬性的Add方法添加新的對象。它使用目錄的多層次結(jié)構(gòu),所以你是正在向項目加入節(jié)點。列表G的C#代碼加入了一個新的目錄項(一個用戶):
DirectoryEntry de = new
DirectoryEntry("LDAP://192.168.1.1/CN=Users;DC=DomainName");
de.Children.Add("Joe Blow", "user");
de.CommitChanges(); ?
列表H里是相應的VB.NET代碼:
Dim de As DirectoryEntry = New
DirectoryEntry("LDAP://192.168.1.1/CN=Users;DC=DomainName")
de.Children.Add("Joe Blow", "user")
de.CommitChanges()
這是一個非常基本的例子,因為(實際工作中)肯定會加入更多的用戶信息。你可能還需要確保用戶在被添加之前并不存在。
搜索目錄
DirectorySearcher類使得搜索目錄里的已有對象變得很容易。列表I的C#代碼會進行一次檢索并顯示結(jié)果:
DirectoryEntry de= new
DirectoryEntry("LDAP://192.168.1.1/CN=Users;DC=DomainName");
DirectorySearcher srch = new DirectorySearcher(de);
srch.Filter = ("(HomeNumber=999-000-0000)");
foreach(SearchResult se in srch.FindAll()) {
Console.WriteLine( se.GetDirectoryEntry().Path );
}
這段代碼使用已有的DirectoryEntry對象創(chuàng)建了DirectorySearcher類的一個實例。DirectorySearcher類的Filter屬性定義了搜索的標準。FindAll方法用來返回符合搜索標準的所有對象,循環(huán)用來顯示到達符合標準的項目的路徑。列表J是相應的VB.NET代碼:
Dim de As New DirectoryEntry("LDAP://192.168.1.1/CN=Users;DC=DomainName")
Dim srch As New DirectorySearcher(de)
Dim re As SearchResult
srch.Filter = ("(HomeNumber=999-000-0000)")
For Each re In srch.FindAll()
Console.WriteLine(re.GetDirectoryEntry().Path)
Next re
又一種數(shù)據(jù)源
活動目錄為網(wǎng)絡數(shù)據(jù)提供了一個多層次數(shù)據(jù)結(jié)構(gòu)。此外,DirectoryEntry和DirectorySearcher這兩個類通過開發(fā)人員熟悉的語言為訪問目錄內(nèi)容提供了一條便捷的途徑。你可以訪問目錄里的數(shù)據(jù),也可以向里面保存新的數(shù)據(jù)。這是手頭又一種數(shù)據(jù)存儲區(qū)。
Tony Patton的職業(yè)生涯開始于應用程序開發(fā)員,并已經(jīng)獲得了Java、VB、Lotus和XML的認證,以證明其專業(yè)知識水平。
查看本文的國際來源
轉(zhuǎn)載于:https://www.cnblogs.com/jcjks/archive/2006/05/29/412429.html
總結(jié)
- 上一篇: 去了新公司,物理通过
- 下一篇: 如何访问MATLAB Builder f