Làm việc với Active Directory - Lập trình Active Directory - Phần 2
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)
Làm việc với Active Directory Lập trình Active Directory – Phần 2 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 : 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 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
File đính kèm:
- Active_Directory_2.pdf