2009-09-10 15 views
7

Tôi đã đoạn mã sau (C#):LDAP Directory Entry trong Net - không làm việc với OU = Users

(Tweaked từ: http://www.eggheadcafe.com/conversation.aspx?messageid=31766061&threadid=31766050)

DirectorySearcher dseSearcher = new DirectorySearcher(); 

string rootDSE = dseSearcher.SearchRoot.Path; 
DirectoryEntry rootDE = new DirectoryEntry(rootDSE); 

string userDSE = rootDSE.Insert(7, "OU=Users,"); 
DirectoryEntry userDE = new DirectoryEntry(userDSE); 

Các rootDSE được tạo ra một cách chính xác, tuy nhiên, người dùng userDSE không sử dụng được và ném "Không có đối tượng như vậy trên máy chủ" ngoại lệ nếu tôi cố gắng sử dụng nó.

Các chuỗi LDAP như sau:

Root: LDAP: // DC = công ty, DC = local

User: LDAP: // OU = Users, DC = công ty, DC = địa phương

Tôi đang chạy trên Vista với tư cách Quản trị viên, nhưng cũng cần điều này để hoạt động trên XP (Quản trị).

Tôi mới sử dụng LDAP và Quản lý thư mục, vì vậy tôi đang vấp ngã trong bóng tối ở đây. Có suy nghĩ gì không? Ngoài ra - bất kỳ bài viết nào để liên kết cũng có thể cung cấp cho tôi một số thông tin chi tiết về cách tất cả các công trình sẽ được đánh giá cao.

Trả lời

11

Điều đầu tiên tôi sẽ cố gắng như một thử nghiệm là để hardcode đường mong muốn của bạn khi bạn tạo một entry thư mục như sau:

DirectoryEntry de = new DirectoryEntry("LDAP://OU=Users,DC=company,DC=local"); 

này sẽ cho bạn khá nhanh nếu đây là một đường dẫn thực tế trong Active của bạn Danh mục. Tôi không biết AD của bạn trông như thế nào nên tôi không thể nói cho bạn biết đây có phải là đường dẫn hợp lệ hay không. Theo người dùng Active Directory và máy tính MMC plugin của bạn, nếu đường dẫn này là chính xác, sau đó bạn nên có tên miền gốc của bạn, và một thư mục OU dưới gốc được gọi là người dùng.

Paths được tạo ra về phía sau trong AD, vì vậy nếu thư mục Users của bạn đang được một OU ra khỏi gốc hơn nó sẽ là

DirectoryEntry de = new DirectoryEntry("LDAP://OU=Users,OU=<first OU folder>,DC=company,DC=local"); 

Vì vậy schema AD của bạn sẽ trông như thế:

Root 
| 
--><first OU folder> 
    | 
    -->Users 

Một bài viết tuyệt vời về cách quản lý Active Directory trong .NET:

HowTo: Do (Almost) Everything in Active Directory via C#

Bạn cũng có thể muốn nghiên cứu các System.DirectoryServices, System.DirectoryServices.ActiveDirectory và các không gian tên System.DirectoryServices.AccountManagement được cung cấp trong .Net 3.5 Framework. Tôi tin rằng System.DirectoryServices, và ActiveDirctory không gian tên đã có sẵn nhìn chằm chằm vào .Net 1.1, và AccountManagement đã được giới thiệu trong .Net 3.5.

Microsoft Documentation - A lot of good links on how to use the namespace

Phụ Lục:

Để thực sự tìm thấy một người dùng trong AD, bạn sẽ muốn làm như sau:

DirectoryEntry de = new DirectoryEntry(); 
de.Path = "LDAP://DC=company,DC=local"; 
de.AuthenticationType = AuthenticationTypes.Secure; 

DirectorySearcher deSearch = new DirectorySearcher(); 

deSearch.SearchRoot = de; 
deSearch.Filter = "(&(objectClass=user) (cn=" + username + "))"; 

SearchResult result = deSearch.FindOne(); 

if (result != null) 
{ 
    DirectoryEntry deUser = new DirectoryEntry(result.Path); 
    ... do what ever you need to the deUser 
    deUser.Close(); 
} 
+0

Hmmm, thankyou cho các liên kết, hữu ích nhất. Tôi bị giới hạn ở .Net 2.0 cho dự án này. Ngoài ra, tôi đang tìm cách tạo một người dùng cục bộ trên bất kỳ máy nào mà ứng dụng của tôi được cài đặt trên, vì vậy nhóm người dùng có thể khác nhau. Có cách nào dễ dàng để có được nhóm người dùng chuẩn không? Chúc mừng –

+0

Ngoài ra - tôi lấy UserId từ đâu? Dường như nó được ném ngẫu nhiên vào mã mẫu trong liên kết tôi đã cung cấp, và tôi không biết nó nên là gì. –

+2

Nếu bạn đang muốn tạo một người dùng cục bộ thì bạn sẽ không sử dụng Active Directory, thay vào đó bạn sẽ cần phải sử dụng các API Win32, phức tạp hơn một chút. Xem http://www.codeproject.com/KB/cs/groupandmembers.aspx Đối với nhận xét thứ 2 của bạn, OU = Người dùng không phải là ID người dùng, OU ngắn hoặc Đơn vị tổ chức, nếu bạn đang cố gắng tìm một Người dùng bạn muốn sử dụng CN = , CN viết tắt cho Common Name và những gì bạn cần sử dụng để lọc người dùng. Xem http://stackoverflow.com/questions/825237/how-can-you-find-a-user-in-active-directory-from-c/825347#825347 về cách truy vấn người dùng trong AD. –

6

Điều này có vẻ ngớ ngẩn và ngu ngốc, nhưng việc thiết lập cây mặc định trong Active Directory không phải là OU = Người dùng, dc = tên miền, dc = com nhưng thay vì cn = Người dùng, d c = tên miền, dc = com (Lưu ý CN = không phải là OU = cho Người dùng. Có vẻ như ngu ngốc vì một đối tượng container (objectClass của cn) trong AD không thể là người nhận chính sách nhóm, nhưng vì lý do tôi không hiểu, đó là mặc định. (thực sự tôi hiểu, đó là bởi vì ngăn chặn cho một CN là tương tự như một miền NT hơn OU)

Hầu như tất cả mọi người tôi gặp, lần đầu tiên họ cố gắng LDAP bind/auth để AD.

+0

Cảm ơn CN = Người dùng, OU = người dùng không hoạt động và tôi đang tìm kiếm trợ giúp quý giá – wruckie

2

Như geoffc đã đề cập chính xác, trong Active Directory "Người dùng" trong miền là đối tượng vùng chứa chứ không phải đối tượng đơn vị tổ chức. Điều này dẫn đến một đường dẫn LDAP hoàn toàn khác, đó là lý do tại sao bạn nhận được thông báo lỗi.

Hãy thử đoạn mã sau và gửi nếu nó sửa chữa vấn đề của bạn:

// Replace the "company" and "com" with actual domain values... 
DirectoryEntry de = new DirectoryEntry("LDAP://CN=Users,DC=company,DC=com"); 
DirectorySearcher deSearch = new DirectorySearcher(); 
deSearch.SearchRoot = de; 

// Set your other search params here 
Các vấn đề liên quan