Làm Việc Với Active Diretory part 4

Chia sẻ: Dqdsadasd Qwdasdsad | Ngày: | Loại File: PDF | Số trang:14

0
45
lượt xem
4
download

Làm Việc Với Active Diretory part 4

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Lập trình Active Directory Để phát triển chương trình trong Active Directory ta dùng các lớp trong namespace System.DirectoryServices và phải tham chiếu assembly System.DirectoryServices .với các lớp này ta có thể truy vấn các đối tượng ,xem và cập nhật các thuộc tính

Chủ đề:
Lưu

Nội dung Text: Làm Việc Với Active Diretory part 4

  1. Lập trình Active Directory Để phát triển chương trình trong Active Directory ta dùng các lớp trong namespace System.DirectoryServices và phải tham chiếu assembly System.DirectoryServices .với các lớp này ta có thể truy vấn các đối tượng ,xem và cập nhật các thuộc tính, tìm các đối tượng và di chuyển các đối tượng đến một chổ chứa đối tượng khác. ta sẽ học các phần sau : - Các lớp trong namespace System.DirectoryServices - Tiến trình kết nối đến Active Directory - - Lấy các mục trong thư mục, tạo đối tượng mới và cập nhật các mục tồn tại - Tìm kiếm trong Active Directory Các lớp trong System.DirectoryServices - DirectoryEntry : lớp này là lớp chính trong namespace System.DirectoryServices .1 đối tượng của lớp này trình bày 1 đối tượng trong Active Directory lưu trữ.ta dùng lớp này để liên kết đến 1 đối tượng,và để xem và cập nhật thuộc tính. các thuộc tính của đối tượng được trình bày trong PropertyCollection. mỗi mục trong PropertyCollection có 1 PropertyValueCollection - DirectoryEntries : DirectoryEntries là 1 tập hợp các đối tượng DirectoryEntry.thuộc tính Children của đối tượng DirectoryEntry trả về 1 danh sách các đối tượng trong tập DirectoryEntries DirectorySearcher : lớp này là lớp chính dùng trong việc tìm kếm các đối tượng với thuộc tính đặc trưng. lớp SortOption và kiểu liệt kê SearchScope,SortDirection và ReferalChasingOption có thể được dùng để định nghĩa việc tìm kiếm.kết quả tìm kiếm trong 1 SearchResult hoặc SearchResultCollection. ta cũng có các đối tượng ResultPropertyCollection và ResultPropertyValueCollection. Binding ( sự liên kết ) Để lấy giá trị của 1 đối tượng trong Active Directory , ta phải kết nối đến Active Directory. tiến trình kết nối gọi là binding.đưòng dẫn của binding có thể là : LDAP://dc01.globalknowledge.net/OU=Marketing, DC=GlobalKnowledge, DC=Com với tiến trình biding ta có thể đặc tả các mục sau: - Protocol đặc tả provider được dùng - Server Name ( tên server ) của domain controller - Port number ( số cổng) của tiến trình server - Distinguished Name ( tên phân biệt ) của đối tượng,để xác định đối tượng ta muốn truy xuất - Username và Password nếu người dùng nếu một tài khoản khác với tài khoản đang chạy cần truy xuất Active Directory - Kiểu Authentication có thể được đặc tả nếu cần mã hoá Chi tiết các tuỳ chọn này là : Protocol ( giao thức) Phần đầu tiên đặc tả provider ADSI.provider thực thi như là 1 COM server , việc định danh 1 progID có thể được tìm trong Registry trong HKEY_CLASSES_ROT . các
  2. provider trong Window 2000 là: LDAP : LDAP server, như là thư mục Exchange và Window 2000 Active Directory server GC: GC được dùng để truy xuất global catalog trong Active Directory.nó được dùng cho các truy vấn nhanh IIS: với provider ADSI cho IIS ta có thể tạo các website mới và quản trị nó trong IIS catalog WinNT : để truy xuất cơ sở dữ liệu người dùng trong các domain Window NT 4 cũ ta có thể dùng provider ADSI trong WinNT .cũng có thể dùng giao thức này để kết nối với domain Window 2000 nhưng ta cũng bị giới hạn đối với các thuộc tính mà có giá trị với NT4 NDS : ProID này được dùng để giao tiếp với các dịch vụ Novell Directory NWCOMPAT : với NWCOMPAT ta có thể truy xuất các thư mục Novell cũ như là Novell Netware 3.x Server Name Server name là tuỳ chọn nếu ta đăng nhập vào 1 domain Active Directory . không có server name Window 2000 sẽ tìm domain controller 'tốt nhất ' trong domain mà kết hợp với người dùng để kết nối , nếu không có server trong site , domain controller đầu tiên tìm thấy sẽ được dùng . ví dụ 1 binding không có server :LDAP://OU=Sales, DC=GlobalKnowledge, DC=Com. Port number ( số cổng ) Sau server name là port number . cú pháp là : xxx. số cổng mặc định cho server LDAP là cổng 389: LDAP://dc01.globalknowledge.net:389. server Exchange dùng cùng số port như server LDAP . nếu server Exchange được cài đặt trên cùng hệ thống - ví dụ như 1 domain controller của Active Directory - có thể cấu hình số cổng khác . Distinguished name (tên phân biệt, DN ) Phần thứ tư ta có thể đặc tả trong đường dẫn là tên phân biệt ( DN).DN là 1 tên duy nhất được bảo đảm để xác định đối tượng ta muốn truy xuất. với Active Directory ta có thể dùng cú pháp LDAP mà dựa trên X.500 để đặc tả tên của đối tượng. ví dụ ta có DN này : CN=Christian Nagel, OU=Trainer, DC=GlobalKnowledge, DC=com DN này đặc tả tên chung của Christian Nagel trong Organization Unit (OU) gọi Trainer trong Domain Component ( DC ) gọi GlobalKnowledge của Domain globalKnowledge.com .phần được đặc tả bên phải nhất là đối tượng gốc của domain. tên phải theo cấu trúc trong cây đối tượng. Relative Distinguished Name ( RDN) 1 RDN được dùng để tham chiếu các đối tượng trong đối tượng chứa ( contrainer object). với 1 RDN việc đặc tả OU và DC không cần thiết,chỉ cần tên chung là đủ. CN=Chritian Nagel là 1 RDN bên trong OU .1 RDN có thể được dùng nếu ta có 1 tham chiếu đến 1 đối tượng chứa và ta muốn truy xuất vào các đối tượng con Default Naming context ( ngữ cảnh tên mặc định ) Nếu tên phân biệt không có trong đường dẫn, tiến trình binding sẽ được tạo với tên ngữ
  3. cảnh mặc định. ta có thể đọc ngữ cảnh tên mặc định với sự trợ giúp của rootDSE.LDAP 3.0 9 định nghĩa rootDSE như là gốc của cây thư mục trên 1 thư mục server . ví dụ : LDAP://rootDSE hay LDAP://servername/rootDSE Bằng cách liệt kê tất cả các thuộc tính của rootDSE ta có thể lấy thông tin defaultNamingContext mà được dùng khi không có tên nào được chỉ định.schemaNamingContext và configurationNamingContext đặc tả các tên được dùng để truy xuất Schema và cấu hình trong nơi lưu trữ Active Directory Đoạn mã sau dùng để lấy tất cả các thuộc tính trong rootDSE : using (DirectoryEntry de = new DirectoryEntry()) { de.Path = "LDAP://celticrain/rootDSE"; de.Username = @"sentinel\chris"; de.Password = "someSecret"; PropertyCollection props = de.Properties; foreach (string prop in props.PropertyNames) { PropertyValueCollection values = props[prop]; foreach (string val in values) { Console.Write(prop + ": "); Console.WriteLine(val); } } } Bên cạnh việc xuất các thuộc tính , chương trình này chỉ ra defaultNamingContext DC=eichkogelstrasse, DC=local ngữ cảnh mà có thể được dùng để truy xuất schema:CN=Schema, CN=Configuration, DC=eichkogelstrasse, DC=local và tên ngữ cảnh của cấu hình : CN=Configuration, DC=eichkogelstrasse, DC=local: Định danh đối tượng
  4. Mỗi đối tượng có 1 danh tính duy nhất, 1 GUID . 1 GUID là 1 số 128-bit độc nhất. Ta có thể liên kết đến 1 đối tượng dùng GUID.bằng cách này ta luôn lấy cùng 1 đối tượng, không quan tâm đối tượng được di chuyển đến nơi chứa nào khác.GUID được tạo ra vào lúc đối tượng được tạo và luôn kèm theo đối tượng. Ta có thể lấy chuỗi GUID với DirectoryEntry.NativeGuid. chuỗi đại diện này sau đó có thể được dùng để liên kết đối tượng. Ví dụ dùng GUID : tên đường dẫn trong 1 kết nối không server để liên kết đến một đối tượng cụ thể được đại diện bởi 1 GUID: LDAP:// Các tên đối tượng trong các domain WindowNT Provider WINNT không cho phép cú pháp LDAP trong phần tên của chuỗi liên kết.với provider đối tượng được đặc tả dùng ObjectName ,ClassName. chuỗi liên kết có giá trị trong 1 domain Window NT là : WinNT: WinNT://DomainName WinNT://DomainName/UserName, user WinNT://DomainName/ServerName/MyGroup, group Các hậu tố user và group đặc tả rằng ta truy xuất vào các đối tượng kiểu user và group Username Nếu 1 người dùng khác với người dùng đương thời muốn truy xuất vào thư mục , một sự uỷ nhiệm người dùng phải được đặc tả trong tiến trình liên kết.với Active Directory ta có 1 số cách để thiết lập username. Downlevel Logon Với downlevel logon username có thể được đặc tả với tên domain window 2000 : domain\username Distinguished Name (Tên phân biệt ) Người dùng có thể được đặc tả bởi tên phân biệt của đối tượng người dùng,ví dụ : CN=Administrator, CN=Users, DC=eichkogelstrasse, DC=local User Principal Name ( UPN) UPN của 1 đối tượng được định nghĩa với thuộc tính userPrincipalName.nhà quản trị hệ thống đặc tả cái này với thông tin đăng nhập trong Accounttab của thuộc tính User với những người dùng Active Directory và công cụ máy tính. lưu ý rằng đây không phải là địa chỉ email của người dùng. Thông tin này cũng xác định duy nhất người dùng , và có thể được dùng để đăng nhập : Nagel@eichkogelstrasse.local Liên kiết với lớp DirectoryEntry Lớp System.DirectoryServices.DirectoryEntry có thể được dùng để đặc tất cả thông tin liên kết. ta có thể dùng hàm dựng mặc định và định nghĩa thông tin liên kết với thuộc tính Path, Username ,Password và AuthenticationType, hoặc truyền tất cả thông tin trong hàm dựng :
  5. DirectoryEntry de = new DirectoryEntry(); de.Path = "LDAP://celticrain/DC=eichkogelstrasse, DC=local"; de.Username = "nagel@eichkogelstrasse.local"; de.Password = "someSecret"; // dùng sự uỷ nhiệm người dùng đương thời DirectoryEntry de2 = new DirectoryEntry( "LDAP://DC=eichkogelstrasse, DC=local"); Thậm chí nếu đối tượng DirectoryEntry xây dựng thành công chưa chắc việc liên kết đã thành công . liên kết sẽ xảy ra lần đầu khi 1 thuộc tính được đọc để tránh việc lưu thông trên mạng không cần thiết.vào lần truy xuất đầu tiên của đối tượng, nó có thể được thấy nếu đối tượng tồn tại,và nếu sự uỷ nhiệm người dùng được đặc tả đúng Lấy các mục thư mục Trong phần này ta sẽ biết cách đặc tả các thuộc tính liên kết đến 1 đối tượng trong Active Directory, ta hãy đọc các thuộc tính của 1 đối tượng Các thuộc tính của các đối tượng người dùng Lớp DirectoryEntry có 1 vài thuộc tính để lấy thông tin về đối tượng:các thuộc tính Name ,Guid,và SchemaClassName .lần đầu ta truy xuất vào 1 thuộc tính của đối tượng DirectoryEntry ,liên kết xuất hiện và cache của đối tượng ADSI bên dưới được điền .khi ta truy xuất các thuộc tính khác , ta chỉ đang đọc chúng từ cache ,do đó giao tiếp với server không cần thiết cho dữ liệu từ cùng đối tượng. Trong ví dụ ta đang truy xuất đối tượng User với tên chung Christian Nagel trong đơn vị có tổ chức Wrox Press: using (DirectoryEntry de = new DirectoryEntry()) { de.Path = "LDAP://celticrain/CN=Christian Nagel, " + "OU=Wrox Press, DC=eichkogelstrasse, DC=local"; Console.WriteLine("Name: " + de.Name); Console.WriteLine("GUID: " + de.Guid); Console.WriteLine("Type: " + de.SchemaClassName); Console.WriteLine(); //... } Đối tượng Active Directory giữ nhiều thông tin hơn, với thông tin có giá trị tuỳ thuộc vào kiểu của đối tượng, thuộc tính Propertier trả về 1 PropertyCollection .mỗi thuộc tính tự nó là 1 tập, bởi vì 1 thuộc tính đơn có thể có nhiều giá trị, ví dụ , đối tượng user có thể có nhiều số điện thoại.Trong ví dụ ta dùng vòng lặp foreach để quét qua các giá trị.tập mà được trả về từ properties [name] là 1 đối tượng mảng . thuộc tính giá trị có thể là strings,numbers,hoặc các kiểu khác. ta sẽ dùng phương thức ToString() để trình bày các
  6. giá trị: Console.WriteLine("Properties: "); PropertyCollection properties = de.Properties; foreach (string name in properties.PropertyNames) { foreach (object o in properties[name]) { Console.WriteLine(name + ": " + o.ToString()); } } Trong kết quả ta thấy tất cả các thuộc tính của đối tượng user Christian Nagel. ta thấy otherTelephone là 1 thuộc tính nhiều giá trị mà có nhiều số điện thoại. vài giá trị thuộc tính chỉ trình bày kiểu của đối tượng,System.__ComObject, ví dụ lastLogoff,LastLogon, và nTSecurityDescriptor. để lấy giá trị của những thuộc tính này ta phải dùng interface Active DirectorySICOM trực tiếp từ các lớp trong namespace System.DirectoryServices Truy xuất 1 thuộc tính trực tiếp từ tên của nó Với DirectoryEntry.Properties ta có thể truy xuất tất cả các thuộc tính. nếu biết tên thuộc tính ta có thể truy xuất giá trị 1 cách trực tiếp : foreach (string homePage in de.Properties["wWWHomePage"]) Console.WriteLine("Home page: " + homePage); Object collections Các đối tượng chứa (container) chứa các đối tượng con .ta có thể lấy các đối tượng con này thông qua thuộc tính Children của lớp DirectoryEntry. và ta có thể lấy đối tượng chứa (container) của 1 đối tượng bằng thuộc tính Parent
  7. các đối tượng không chứa các đối tượng khác trả về 1 tập rỗng trong thuộc tính Children.thuộc tính Children trả về 1 tập DirectoryEntries mà gom các đối tượng DirectoryEntry. ta quét qua các đối tượng DirectoryEntry này để trình bày tên của các đối tượng con: using (DirectoryEntry de = new DirectoryEntry()) { de.Path = "LDAP://celticrain/OU=Wrox Press, " + "DC=eichkogelstrasse, DC=local"; Console.WriteLine("Children of " + de.Name); foreach (DirectoryEntry obj in de.Children) { Console.WriteLine(obj.Name); } } Trong ví dụ này ta thấy tất cả các đối tượng trong OU ( organization unit) : users,contacts,printers,shares,...nếu ta chỉ muốn thấy một vài kiểu đối tựợng ta dùng thuộc tính SchemaFilter của lớp DirectoryEntries. thuộc tính SchemaFilter trả về 1 SchemaCollection. với SchemaCollection ta có thể dùng phương thức Add() để định nghĩa các kiểu đối tượng ta muốn thấy. ví dụ nếu ta quan tâm đến đối tượng user ,ta thêm user vào tập này : using (DirectoryEntry de = new DirectoryEntry()) { de.Path = "LDAP://celticrain/OU=Wrox Press, " + "DC=eichkogelstrasse, DC=local"; Console.WriteLine("Children of " + de.Name);
  8. de.Children.SchemaFilter.Add("user"); foreach (DirectoryEntry obj in de.Children) { Console.WriteLine(obj.Name); } } Kết quả ta chỉ thấy các đối tượng user trong OU : Cache Để giảm bớt việc lưu thông mạng,Active DirectorySI dùng cache cho các thuộc tính đối tượng .như ta biết, server không được truy xuất khi ta tạo 1 đối tượng DirectoryEntry,thay vào đó khi lần đầu ta đọc 1 giá trị từ thư mục lưu trữ tất cả các thuộc tính được ghi vào cache,để khi muốn đọc thuộc tính lần nữa thì không phải truy xuất server. Khi thay đổi bất kì đối tượng nào sẽ chỉ thay đổi trên đối tượng cache,viẹc thiết lập các thuộc tính không ảnh hưởng đến lưu thông mạng.để chuyển bất kì dữ liệu thay đổi đến server ta dùng DirectoryEntry.CommitChanges() , phương thức này sẽ flush ( làm bằng) cache.để lấy dữ liệu được viết mới từ thư mục lưu trữ,ta dùng DirectoryEntry.RefreshCache() để đọc các thuộc tính.nếu ta thay đổi một vài thuộc tính mà không gọi ComitChanges() và chỉ goị RefreshCache() ,tất cả các thay đổi đó sẽ bị mất bởi vì qua phương thức RefreshCache() ta đọc lại các giá trị từ dịch vụ thư mục ( lúc này chưa được cập nhật từ cache ). có thể tắt thuộc tính này của cache bằng cách thiết lập thuộc tính DirectoryEntry.UsePropertyCache là false.tuy nhiên ,trừ khi ta muốn debug ,tốt hơn là không nên tắt cache bởi sẽ làm gia tăng việc truy xuất server Tạo ra các đối tượng mới Muốn tạo ra các đối tượng mới trong Active Directory như user,computer,printer,contact .. ta có thể dùng lớp DirectoryEntry để thêm 1 đối tượng mới đến thư mục ta phải kết nối đến 1 đối tượng chứa,ví dụ như là OU .ở đây ta dùng đối tượng chứa với tên phân biệt CN=Users, DC=eichkogelstrasse, DC=local: DirectoryEntry de = new DirectoryEntry();
  9. de.Path = "LDAP://celticrain/CN=Users, DC=eichkogelstrasse, DC=local"; Ta có thể lấy đối tượng DirectoryEntries bằng thuộc tính Children của DirectoryEntry : DirectoryEntries users = de.Children; Với DirectroyEntries ta có phương thức thêm ,bỏ ,tìm các đối tượng trong tập.ở đây ta tạo đối tượng user mới bằng phương thức Add(),ta cần tên của đối tượng và kiểu. ta có thể lấy tên kiểu trực tiếp dùng ADSI Edit: DirectoryEntry user = users.Add("CN=John Doe", "user"); Bây giờ đối tượng có giá trị thuộc tính mặc định.để đặc tả các giá trị thuộc tính ta có thể thêm các thuộc tính bằng phương thức Add() của thuộc tính Properties.nếu ta đặc tả thuộc tính không tồn tại thì sẽ có 1 biệt lệ : COMException "The specified directory service attribute or value doesn't exist": user.Properties["company"].Add("Some Company"); user.Properties["department"].Add("Sales"); user.Properties["employeeID"].Add("4711"); user.Properties["samAccountName"].Add("JDoe"); user.Properties["userPrincipalName"].Active Directoryd("JDoe@eichkogelstrasse.local"); user.Properties["givenName"].Add("John"); user.Properties["sn"].Add("Doe"); user.Properties["userPassword"].Add("someSecret"); Cuối cùng ta viết dữ liệu đến Active Directory, ta phải flush cache : user.CommitChanges(); Cập nhật các mục trong thư mục Sau khi đọc đối tượng ta có thể thay đổi giá trị . để bỏ tất cả các giá trị của 1 thuộc tính đơn ta gọi phương thức PropertyValueCollection.Clear() .dùng Add() để thêm giá trị mới đến thuộc tính.dùng Remove() và Removeat() để bỏ các giá trị đặc tả từ 1 tập thuộc tính Ta thay đổi 1 giá trị đơn giản bằng các thiết lập nó đến một giá trị đặc tả.ví dụ sau cho thấy số điện thoại được thay đổi và dùng 1 indexer trong PropertyValueCollection.với indexer 1 giá trị chỉ có thể thay đổi nếu tồn tại.do đó ta nên luôn kiểm tra DirectoryEntry.Properties.Contains() nếu thuộc tính có trá trị : using (DirectoryEntry de = new DirectoryEntry()) { de.Path = "LDAP://celticrain/CN=Christian Nagel, " + "OU=Wrox Press, DC=eichkogelstrasse, DC=local"; if (de.Properties.Contains("mobile")) { de.Properties["mobile"][0] = "+43(664)3434343434"; }
  10. else { de.Properties["mobile"].Add("+43(664)3434343434"); } de.CommitChanges(); } Trong phần else ta thêm 1 thuộc tính mới có số điện thoại nếu nó không tồn tại bằng phương thức PropertyValueCollection.Add(). nếu ta dùng Add() với 1 thuộc tính tồn tại kết quả tuỳ thuộc vào kiểu của thuộc tính - đơn hay đa giá trị. nếu là thuộc tính có giá trị đơn sẽ xảy ra biệt lệ : COMException: A constraint violation occurred. nếu là đa giá trị thì chấp nhận xem như là đó là giá trị thêm. Vì thuộc tính của điện thoại là đơn giá trị nên không thể thêm vào . tuy nhiên người dùng có thể có nhiều số điện thoại. nếu ta thiết lập thuộc tính otherMobile. otherMobile là đa giá trị thì ta có thể gọi Add() nhiều lần.có 1 điểm quan trọng đối với thuộc tính đa giá trị : các giá trị không được giống nhau . nếu giống sẽ sinh ra biệt lệ :COMException: The specified directory service attribute or value alreActive Directoryy exists. Truy xuất các đối tượng ADSI bẩm sinh Lớp DirectoryEntry hổ trợ việc gọi các phương thức của các đối tượng bên dưới trực tiếp bằng cách dùng phương thức Invoke(). Thông số đầu tiên của invoke() là tên phương thức được gọi trong đối tượng ADSI, từ khoá params trong thông số thứ 2 cho phép 1 số các đối số thêm được truyền vào phương thức ADSI: public object Invoke(string methodName, params object[] args); Trong ví dụ sau ta dùng phương thức IADsUser.SetPassword() để thay đổi password của đối tượng user trước đã tạo : using (DirectoryEntry de = new DirectoryEntry()) { de.Path = "LDAP://celticrain/CN=John Doe, " + "CN=Users, DC=eichkogelstrasse, DC=local"; de.Invoke("SetPassword", "anotherSecret"); de.CommitChanges(); } Thay vì dùng Invoke() ta cũng có thể dùng trực tiếp các đối tượng ADSI bên dưới. để làm điều này ta phải thêm 1 tham chiếu đến Active DS Type Library bằng cách dùng Project|Add reference. sẽ tạo ra một lớp gói ( wrapper) trong lớp này ta có thể truy xuất các đối tượng ADSI trong namespace ActiveDs.
  11. Các đối tượng bẩm sinh có thể đưọc truy xuất bằng thuộc tính NativeObject của lớp DirectoryEntry . ví dụ , đối tượng de là 1 đối tượng user,vì thế ta có thể ép kiểu nó thành ActiveDs.IADsUser. SetPassword() . bằng cách thiết lập thuộc tính AccountDisabled là false ta có thể cho phép account. ActiveDs.IADsUser user = (ActiveDs.IADsUser)de.NativeObject; user.SetPassword("someSecret"); user.AccountDisabled = false; de.CommitChanges(); Tìm kiếm trong Active Directory Để tìm kiếm trong Active Directory, .NET framework có lớp DirectorySearcher .ta chỉ có thể dùng DirectorySearcher với provider LDAP ,nó không làm việc với các provider khác như NDS hoặc IIS Trong hàm dựng của lớp DirectorySearcher ta có thể định nghĩa 4 phần quan trọng cho việc tìm kiếm - SearchRoot : gốc tìm kiếm đặc tả nơi bắt đầu tìm kiếm .mặc định là gốc của domain đương thời. SearchRoot đưọc đặc tả với path của đối tượng DirectoryEntry - Filter :Filter định nghĩa các giá trị mà ta muốn lấy .filter là 1 chuỗi phải nằm trong dấu ngoặc đơn. Các tác tử quan hệ như = được dùng trong biểu thức ví dụ (objectClass=contact) sẽ tìm tất cả các đối tượng có kiểu contact;(lastName>=Nagel) tìm tất cả các đối tượng có lastname lớn hơn hoặc bằng Nagel ( tìm theo Alphabet) biểu thức có thể kết hợp với tác tử tiền tố & và | . ví dụ : (&(objectClass=user)(description=Auth*)) tìm tất cả các đối tượng kiểu user có thuộc tính description bắt đầu bằng Auth. vì tác tử & và | nằm ở đầu biểu htức nên có thể kết hợp nhiều hơn 2 biểu thức với 1 tác tử tiền tố đơn. filter mặc định là (objectClass=*) - PropertiesToLoad : với PropertiesToLoad ta định nghĩa 1 StringCollection của tất cả các thuộc tính mà ta quan tâm . các đối tượng có thể có nhiều thuộc tính , hầu hết là không quan trọng trong yêu cầu tìm kiếm của ta.ta định nghĩa các thuộc tính mà sẽ đưọc
  12. load vào cache. ta sẽ lấy thuộc tính mặc định nếu Path và Name của đối tượng không được đặc tả. - SearchScope : SearchScope là 1 bảng liệt kê định nghĩa độ sâu của việc tìm kiếm : + SearchScope.Base chỉ tìm các thuộc tính trong đối tượng nơi việc tìm bắt đầu . với SearchScope.OneLevel việc tìm kiếm tiếp tục trong tập con của đối tượng cơ sở . + SearchScope.Subtree định nghĩa việc tìm kiếm sẽ tìm toàn bộ cây Mặc định SearchScope là Subtree Giới hạn tìm kiếm Việc tìm kiếm có thể trải rộng trên nhiều domain. để giới hạn tìm kiếm hay thời gian tìm kiếm ta có thể định nghĩa một số thuộc tính sau : - ClientTimeout : thời gian lớn nhất mà client chờ server trả về kết quả - PageSize : với 1 page search server trả về 1 số đối tượng đưọc định nghĩa với Pagesize thay cho kết quả hoàn chỉnh.điều này rút gọn thời gian client nhận lần trả lời đầu và bộ nhớ cần thiết.server gửi cookies đến client ,mà sẽ gửi trả lại server lần phản hồi tìm kiếm lần tiếp theo, để tìm kiếm có thể tiếp tục ở thời điểm nó đã hoàn thành - ServerPageTimeLimit : giá trị này định nghĩa thời gian 1 cuộc tìm kiếm nên tiếp tục để trả lại số đối tượng mà được định nghĩa với giá trị pagesize.mặc định là -1, nghĩa là không xác định - ServerTimeLimit : định nghĩa thời gian lớn nhất server sẽ tìm các đối tượng. khi hết thời gian, các đối tượng được tìm thấy đến thời điểm này sẽ được trả về cho client.mặc định là 120 giây, ta không thể thiết lập giá trị cao hơn. - ReferalChasing : nếu gốc tìm được đặc tả thông qua SearchRoot là domain cha hay không đặc tả gốc ,việc tìm kiếm có thể tiếp tục ở các domain con. với thuộc tính này ta có thể đặc tả việc tìm kiếm trên các server khác. ReferalChasingOption.None : không tìm kiếm trên các server khác. ReferalchasingOption.Subordinate : đặc tả tìm kiếm tiếp tục trên các domain con. khi tìm ở DC=Wrox, DC=COM server có thể trả về tập kết quả và tham chiếu đến DC=France,DC=Wrox,DC=COM. ReferalchasingOption.External: server có thể chuyển client đến 1 server độc lập không nằm trong các domain con.đây là tuỳ chọn mặc định. ReferalchasingOption.All thì cả tham chiếu external và subordinate đều được trả về. Ví dụ ta muốn tìm kiếm tất cả các đối tượng user trong Wrox Press, thuộc tính Description có giá trị của Author đầu tiên ta kết nối với Wrox Press.đây là nơi bắt đầu tìm kiếm .ta tạo ra đối tượng DirectorySearcher . Filter được định nghĩa (&(objectClass=user)(description=Auth*)), để tìm các đối tượng user với description bắt đầu bằng Auth. phạm vi tìm kiếm là các cây con, để các tổ chức con trong Wrox Press cũng được tìm kiếm: using (DirectoryEntry de = new DirectoryEntry("LDAP://OU=Wrox Press, DC=eichkogelstrasse, DC=local")) using (DirectorySearcher searcher = new DirectorySearcher()) { searcher.SearchRoot = de;
  13. searcher.Filter = "(&(objectClass=user)(description=Auth*))"; searcher.SearchScope = SearchScope.Subtree; Các thuộc tính ta muốn có trong tập kết quả là name,description ,givenName,wWWHomePage: searcher.PropertiesToLoActive Directory.Add("name"); searcher.PropertiesToLoActive Directory.Add("description"); searcher.PropertiesToLoActive Directory.Add("givenName"); searcher.PropertiesToLoActive Directory.Add("wWWHomePage"); Để sắp sếp kết quả ta dùng thuộc tính sort của DirectorySearcher ta có thể thiết lập 1 sortoption . đối số đầu tiên là thuộc tính muốn sắp xếp,thứ hai là cách sắp xếp.bao gồm Ascending và Descending Để bắt đầu tìm kiếm ta dùng phương thức FindOne() để tìm đối tượng đầu tiên hoặc là FindAll().FindOne() trả về SearchResult trong khi FineAll() trả về SearchResultCollection. ta muốn lấy tất cả các tác giả , nên ta dùng FindAll(): searcher.Sort = new SortOption("givenName", SortDirection.Ascending); SearchResultCollection results = searcher.FindAll(); Ta có thể dùng vòng lặp foreach duyệt qua các đối tượng SearchResult trong SearchResultCollection . mỗi searchReuslt là 1 đối tượng trong cache tìm kiếm. thuộc tính properties trả về 1 ResultPropertyCollection ,nơi ta truy xuất tất cả các thuộc tính và giá trị với tên thuộc tính và indexer: SearchResultCollection results = searcher.FindAll(); foreach (SearchResult result in results) { ResultPropertyCollection props = result.Properties; foreach (string propName in props.PropertyNames) { Console.Write(propName + ": "); Console.WriteLine(props[propName][0]); } Console.WriteLine(); } } Nếu ta muốn lấy các đối tượng hoàn chỉnh sau khi tìm kiếm ta dùng phương thức getdirectoryEntry() của SearchResult mà trả về DirectoryEntry của đối tượng. Kết quả trình bày như sau :
  14. Code for Download : DirectoryTest  
Đồng bộ tài khoản