1. Trang chủ
  2. » Công Nghệ Thông Tin

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

14 294 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lập trình Active Directory
Thể loại Tài liệu
Định dạng
Số trang 14
Dung lượng 199,79 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 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

Trang 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ữ

Trang 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

Trang 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://<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 : 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 :

Trang 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

Trang 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

Trang 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);

Trang 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();

Trang 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";

}

Trang 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

Ngày đăng: 26/01/2014, 14:20

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w