Tải bản đầy đủ (.pdf) (14 trang)

Tài liệu Làm Việc Với Active Diretory part 4 doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (199.79 KB, 14 trang )


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
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ữ
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
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://<GUID=14abbd652aae1a47abc60782dcfc78ea>
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 :


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 :
DirectoryEntry de = new DirectoryEntry();
de.Path = "LDAP://celticrain/DC=eichkogelstrasse, DC=local";
de.Username = "";
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
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
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);
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();
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("");
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";
}
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.

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
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;
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 :


Code for Download :
DirectoryTest







×