2010-01-26 32 views
32

Tôi đang viết các phương pháp sau để thêm và xóa người dùng khỏi thư mục hoạt động trong C#.Thêm và xóa người dùng khỏi các nhóm Active Directory trong .NET

void AddUserToGroup(string userId, string groupName); 
void RemoveUserFromGroup(string userId, string groupName); 

Cách tốt nhất để triển khai các phương pháp này?

Đây là một số mã từ CodeProject. Tôi không thể nhìn thấy nơi máy chủ AD được chỉ định trong các ví dụ này mặc dù? (là nó được cung cấp ngầm bởi .NET framework khi sử dụng giao thức LDAP?). Những ví dụ này có đáng giá không?

public void AddToGroup(string userDn, string groupDn) 
{ 
    try 
    { 
     DirectoryEntry dirEntry = new DirectoryEntry("LDAP://" + groupDn); 
     dirEntry.Properties["member"].Add(userDn); 
     dirEntry.CommitChanges(); 
     dirEntry.Close(); 
    } 
    catch (System.DirectoryServices.DirectoryServicesCOMException E) 
    { 
     //doSomething with E.Message.ToString(); 

    } 
} 


public void RemoveUserFromGroup(string userDn, string groupDn) 
{ 
    try 
    { 
     DirectoryEntry dirEntry = new DirectoryEntry("LDAP://" + groupDn); 
     dirEntry.Properties["member"].Remove(userDn); 
     dirEntry.CommitChanges(); 
     dirEntry.Close(); 
    } 
    catch (System.DirectoryServices.DirectoryServicesCOMException E) 
    { 
     //doSomething with E.Message.ToString(); 

    } 
} 

Trả lời

61

Ugh. LDAP. Nếu bạn đang sử dụng .Net Framework 3.5 trở lên, tôi khuyên bạn nên sử dụng không gian tên System.DirectoryServices.AccountManagement. Điều đó làm cho mọi thứ để dễ dàng hơn nhiều.

public void AddUserToGroup(string userId, string groupName) 
{ 
    try 
    { 
     using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "COMPANY")) 
     { 
      GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, groupName); 
      group.Members.Add(pc, IdentityType.UserPrincipalName, userId); 
      group.Save(); 
     } 
    } 
    catch (System.DirectoryServices.DirectoryServicesCOMException E) 
    { 
     //doSomething with E.Message.ToString(); 

    } 
} 

public void RemoveUserFromGroup(string userId, string groupName) 
{ 
    try 
    { 
     using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "COMPANY")) 
     { 
      GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, groupName); 
      group.Members.Remove(pc, IdentityType.UserPrincipalName, userId); 
      group.Save(); 
     } 
    } 
    catch (System.DirectoryServices.DirectoryServicesCOMException E) 
    { 
     //doSomething with E.Message.ToString(); 

    } 
} 
+2

System.DirectorServices.AccountManagement chỉ khả dụng trong> = 3.5, thay vào đó hơn 3.0 – regex

+2

Mã dưới đây hoạt động cho tôi *** group.Members.Remove (UserPrincipal.FindByIdentity (pc, userId)); *** thay vì *** "group.Members.Remove (pc, IdentityType.UserPrincipalName, userId) "***. Lưu ý: id người dùng của tôi chỉ là "USERNAME" mà không cần thêm tên miền – Rama

+0

Vâng, quá tải cũng hoạt động, nó chỉ là một cuộc gọi bổ sung vào dịch vụ LDAP để nhận danh tính người dùng trước khi gửi cuộc gọi xóa. Thành thật mà nói, có thể chúng tương đương với chức năng vì API có thể gọi vào LDAP cho danh tính dựa trên tên người dùng trước khi thực hiện xóa. –

2

Máy chủ là một phần của groupDn giá trị biến. Ví dụ:

LDAP: //myServer/CN=MyGroup,CN=Groups,CN=MyContainer,DN=mydomain.com

Toàn bộ điều là con đường LDAP cho nhóm. Phần đầu tiên (myServer) là tên máy chủ.

Phần sau tên máy chủ (ví dụ CN = ...) là DN (tên phân biệt) của nhóm.

+0

Điều duy nhất tôi muốn nói là trong thiết lập AD tốt, bạn không cần phải chỉ định máy chủ. Các cuộc gọi AD AD cấp thấp/AD cấp thấp nên giải quyết máy chủ sẵn có gần nhất cho bạn. Nhưng đây là thiết lập AD/miền nhiều hơn và không quá nhiều mã. Nếu thiết lập AD của bạn chắc chắn, bạn sẽ có thể loại trừ máy chủ (ví dụ: LDAP: //CN=MyGroup,CN=Groups,CN=MyContainer,DN=mydomain.com) –

+1

Rất tiếc, không thực sự trả lời câu hỏi của bạn. có, các ví dụ có vẻ sạch sẽ. Nếu bạn vẫn không chắc chắn, tôi khuyên bạn nên giới thiệu Hướng dẫn lập trình dịch vụ thư mục của nhà phát triển .NET (http://www.amazon.com/gp/product/0321350170) –

1

Bạn có thể đặt máy chủ LDAP trong đối số đường dẫn đến DirectoryEntry, do đó, "LDAP: //" + ldapServer + ldapQuery.

Sử dụng DirectoryEntry (Đường dẫn chuỗi, Chuỗi userId, Mật khẩu chuỗi) nếu bạn cần xác thực

2

Khi xóa thành viên trong public void RemoveUserFromGroup(string userDn, string groupDn)

dirEntry.Properties["member"].Remove(userDn) không làm việc cho tôi.

dirEntry.Properties["member"].RemoveAt(dn.IndexOf(dn)) hoạt động.

+0

Biến 'dn' là gì? – fripp13

+0

@ fripp13, trong ngữ cảnh của Active Directory, dn hầu như luôn có nghĩa là DistinguishedName. –

Các vấn đề liên quan