Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 14 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
14
Dung lượng
121,13 KB
Nội dung
Làm việc với Active Directory Lập trình Active Directory – Phần Tạo đối tượng Muốn tạo đối tượng Active Directory user,computer,printer,contact ta dùng lớp DirectoryEntry để thêm đối tượng đến thư mục ta phải kết nối đến đối tượng chứa,ví dụ OU 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 lấy đối tượng DirectoryEntries thuộc tính Children DirectoryEntry : DirectoryEntries users = de.Children; Với DirectroyEntries ta có phương thức thêm ,bỏ ,tìm đối tượng tập.ở ta tạo đối tượng user phương thức Add(),ta cần tên đối tượng kiểu ta lấy tên kiểu trực tiếp dùng ADSI Edit: DirectoryEntry user = users.Add("CN=John Doe", "user"); Bây đối tượng có giá trị thuộc tính mặc định.để đặc tả giá trị thuộc tính ta thêm thuộc tính phương thức Add() thuộc tính Properties.nếu ta đặc tả thuộc tính khơng tồn có 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 ta viết liệu đến Active Directory, ta phải flush cache : user.CommitChanges(); Cập nhật mục thư mục Sau đọc đối tượng ta thay đổi giá trị để bỏ tất giá trị thuộc tính đơn ta gọi phương thức PropertyValueCollection.Clear() dùng Add() để thêm giá trị đến thuộc tính.dùng Remove() Removeat() để bỏ giá trị đặc tả từ tập thuộc tính Ta thay đổi giá trị đơn giản thiết lập đến giá trị đặc tả.ví dụ sau cho thấy số điện thoại thay đổi dùng indexer PropertyValueCollection.với indexer giá trị thay đổi tồn tại.do ta nên ln kiểm tra DirectoryEntry.Properties.Contains() 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 thuộc tính có số điện thoại không tồn phương thức PropertyValueCollection.Add() ta dùng Add() với thuộc tính tồn kết tuỳ thuộc vào kiểu thuộc tính - đơn hay đa giá trị thuộc tính có giá trị đơn xảy biệt lệ : COMException: A constraint violation occurred đa giá trị chấp nhận xem là giá trị thêm Vì thuộc tính điện thoại đơn giá trị nên thêm vào nhiên người dùng có nhiều số điện thoại ta thiết lập thuộc tính otherMobile otherMobile đa giá trị ta gọi Add() nhiều lần.có điểm quan trọng thuộc tính đa giá trị : giá trị khơng giống giống sinh biệt lệ :COMException: The specified directory service attribute or value alreActive Directoryy exists Truy xuất đối tượng ADSI bẩm sinh Lớp DirectoryEntry hổ trợ việc gọi phương thức đối tượng bên trực tiếp cách dùng phương thức Invoke() Thông số invoke() tên phương thức gọi đối tượng ADSI, từ khố params thơng số thứ cho phép số đối số thêm 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 đố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 dùng Invoke() ta dùng trực tiếp đối tượng ADSI bên để làm điều ta phải thêm tham chiếu đến Active DS Type Library cách dùng Project|Add reference tạo lớp gói ( wrapper) lớp ta truy xuất đối tượng ADSI namespace ActiveDs Các đối tượng bẩm sinh đưọc truy xuất thuộc tính NativeObject lớp DirectoryEntry ví dụ , đối tượng de đối tượng user,vì ta ép kiểu thành ActiveDs.IADsUser SetPassword() cách thiết lập thuộc tính AccountDisabled false ta cho phép account ActiveDs.IADsUser user = (ActiveDs.IADsUser)de.NativeObject; user.SetPassword("someSecret"); user.AccountDisabled = false; de.CommitChanges(); Tìm kiếm Active Directory Để tìm kiếm Active Directory, NET framework có lớp DirectorySearcher ta dùng DirectorySearcher với provider LDAP ,nó khơng làm việc với provider khác NDS IIS Trong hàm dựng lớp DirectorySearcher ta định nghĩa 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 gốc domain đương thời SearchRoot đưọc đặc tả với path đối tượng DirectoryEntry - Filter :Filter định nghĩa giá trị mà ta muốn lấy filter chuỗi phải nằm dấu ngoặc đơn Các tác tử quan hệ = dùng biểu thức ví dụ (objectClass=contact) tìm tất đối tượng có kiểu contact;(lastName>=Nagel) tìm tất đối tượng có lastname lớn Nagel ( tìm theo Alphabet) biểu thức kết hợp với tác tử tiền tố & | ví dụ : (&(objectClass=user)(description=Auth*)) tìm tất đối tượng kiểu user có thuộc tính description bắt đầu Auth tác tử & | nằm đầu biểu htức nên kết hợp nhiều biểu thức với tác tử tiền tố đơn filter mặc định (objectClass=*) - PropertiesToLoad : với PropertiesToLoad ta định nghĩa StringCollection tất thuộc tính mà ta quan tâm đối tượng có nhiều thuộc tính , hầu hết khơng quan trọng yêu cầu tìm kiếm ta.ta định nghĩa thuộc tính mà đưọc load vào cache ta lấy thuộc tính mặc định Path Name đối tượng không đặc tả - SearchScope : SearchScope bảng liệt kê định nghĩa độ sâu việc tìm kiếm : + SearchScope.Base tìm thuộc tính đố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 tập đối tượng sở + SearchScope.Subtree định nghĩa việc tìm kiếm tìm tồn Mặc định SearchScope Subtree Giới hạn tìm kiếm Việc tìm kiếm trải rộng nhiều domain để giới hạn tìm kiếm hay thời gian tìm kiếm ta định nghĩa số thuộc tính sau : - ClientTimeout : thời gian lớn mà client chờ server trả kết - PageSize : với page search server trả số đối tượng đưọc định nghĩa với Pagesize thay cho kết hoàn chỉnh.điều rút gọn thời gian client nhận lần trả lời đầu nhớ cần thiết.server gửi cookies đến client ,mà 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 tiếp tục thời điểm hồn thành - ServerPageTimeLimit : giá trị định nghĩa thời gian tìm kiếm nên tiếp tục để trả lại số đối tượng mà định nghĩa với giá trị pagesize.mặc định -1, nghĩa không xác định - ServerTimeLimit : định nghĩa thời gian lớn server tìm đối tượng hết thời gian, đối tượng tìm thấy đến thời điểm trả cho client.mặc định 120 giây, ta thiết lập giá trị cao - ReferalChasing : gốc tìm đặc tả thơng qua SearchRoot domain cha hay khơng đặc tả gốc ,việc tìm kiếm tiếp tục domain với thuộc tính ta đặc tả việc tìm kiếm server khác khác ReferalChasingOption.None : khơng tìm kiếm server ReferalchasingOption.Subordinate : đặc tả tìm kiếm tiếp tục domain tìm DC=Wrox, DC=COM server trả tập kết tham chiếu đến DC=France,DC=Wrox,DC=COM ReferalchasingOption.External: server chuyển client đến server độc lập không nằm domain con.đây tuỳ chọn mặc định ReferalchasingOption.All tham chiếu external subordinate trả Ví dụ ta muốn tìm kiếm tất đối tượng user Wrox Press, thuộc tính Description có giá trị Author ta kết nối với Wrox Press.đây nơi bắt đầu tìm kiếm ta tạo đối tượng DirectorySearcher Filter định nghĩa (&(objectClass=user)(description=Auth*)), để tìm đối tượng user với description bắt đầu Auth phạm vi tìm kiếm con, để tổ chức Wrox Press tìm kiếm: using (DirectoryEntry de = new DirectoryEntry("LDAP://OU=Wrox DC=local")) Press, DC=eichkogelstrasse, 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ó tập kết 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 kết ta dùng thuộc tính sort DirectorySearcher ta thiết lập sortoption đối số thuộc tính muốn xếp,thứ hai cách xếp.bao gồm Ascending Descending Để bắt đầu tìm kiếm ta dùng phương thức FindOne() để tìm đối tượng FindAll().FindOne() trả SearchResult FineAll() trả SearchResultCollection ta muốn lấy tất tác giả , nên ta dùng FindAll(): searcher.Sort = new SortOption("givenName", SortDirection.Ascending); SearchResultCollection results = searcher.FindAll(); Ta dùng vịng lặp foreach duyệt qua đối tượng SearchResult SearchResultCollection searchReuslt đối tượng cache tìm kiếm thuộc tính properties trả ResultPropertyCollection ,nơi ta truy xuất tất thuộc tính giá trị với tên thuộc tính 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 đối tượng hoàn chỉnh sau tìm kiếm ta dùng phương thức getdirectoryEntry() SearchResult mà trả DirectoryEntry đối tượng ... (de.Properties.Contains("mobile")) { de.Properties["mobile"][0] = "+ 43( 664 )34 3 434 3 434 "; } else { de.Properties["mobile"].Add("+ 43( 664 )34 3 434 3 434 "); } de.CommitChanges(); } Trong phần else ta thêm thuộc tính có số điện thoại... có lớp DirectorySearcher ta dùng DirectorySearcher với provider LDAP ,nó khơng làm việc với provider khác NDS IIS Trong hàm dựng lớp DirectorySearcher ta định nghĩa phần quan trọng cho việc tìm... searcher.PropertiesToLoActive Directory. Add("name"); searcher.PropertiesToLoActive Directory. Add("description"); searcher.PropertiesToLoActive Directory. Add("givenName"); searcher.PropertiesToLoActive Directory. Add("wWWHomePage");