2012-02-28 41 views
6

Tôi đang cố gắng lấy thông tin người dùng cho một miền cụ thể sẽ là đầu vào của chương trình. Trên cơ sở tên miền, nó sẽ trả về danh sách tên người dùng/hoặc NT Id và SID của người dùng. Tôi mới cho lập trình ldap bất kỳ ai có thể giúp tôi để có được danh sách này.Cách lấy tên người dùng và SID cho người dùng bằng tên miền trong ldap

+2

Khi bạn nói * LDAP *, bạn có nghĩa * Active Directory * trên Windows, hay bạn cần một giải pháp LDAP "chung chung" cho tất cả các máy chủ LDAP có thể .... –

Trả lời

15

Nếu bạn đang sử dụng .NET 3.5 trở lên và nói về Active Directory, thì bạn nên kiểm tra không gian tên System.DirectoryServices.AccountManagement (S.DS.AM). Đọc tất cả về nó ở đây:

Về cơ bản, bạn có thể xác định một bối cảnh miền và dễ dàng tìm người sử dụng và/hoặc nhóm trong AD:

// set up domain context 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 

// find a user 
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName"); 

if(user != null) 
{ 
    // do something here....  
    var usersSid = user.Sid; 

    // not sure what you mean by "username" - the "DisplayName" ? The "SAMAccountName"?? 
    var username = user.DisplayName; 
    var userSamAccountName = user.SamAccountName; 
} 

Các new S.DS.AM làm cho nó thực sự dễ dàng để chơi xung quanh với người dùng và các nhóm trong AD!

Cập nhật: nếu bạn cần để lặp qua tất cả các người dùng của một miền - thử điều này:

Bạn có thể sử dụng một PrincipalSearcher và một "truy vấn theo ví dụ" chủ yếu để làm tìm kiếm của bạn:

// create your domain context 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 

// define a "query-by-example" principal - here, we search for a UserPrincipal 
UserPrincipal qbeUser = new UserPrincipal(ctx); 

// create your principal searcher passing in the QBE principal  
PrincipalSearcher srch = new PrincipalSearcher(qbeUser); 

// find all matches 
foreach(var found in srch.FindAll()) 
{ 
    UserPrincipal user = found as UserPrincipal; 

    if(user != null) 
    { 
     // do whatever here 
     var usersSid = user.Sid; 

     // not sure what you mean by "username" - the "DisplayName" ? 
     var username = user.DisplayName; 
     var userSamAccountName = user.SamAccountName; 
    } 
} 

cập nhật # 2: nếu bạn không thể (hoặc không muốn) sử dụng phương pháp S.DS.AM - đó là dễ dàng nhất, cho Active Directory, bởi đến nay - sau đó bạn cần phải rơi trở lại vào System.DirectoryServices các lớp và phương pháp:

// define the root of your search 
DirectoryEntry root = new DirectoryEntry("LDAP://dc=YourCompany,dc=com"); 

// set up DirectorySearcher 
DirectorySearcher srch = new DirectorySearcher(root); 
srch.Filter = "(objectCategory=Person)"; 
srch.SearchScope = SearchScope.Subtree; 

// define properties to load 
srch.PropertiesToLoad.Add("objectSid"); 
srch.PropertiesToLoad.Add("displayName"); 

// search the directory 
foreach(SearchResult result in srch.FindAll()) 
{ 
    // grab the data - if present 
    if(result.Properties["objectSid"] != null && result.Properties["objectSid"].Count > 1) 
    { 
     var sid = result.Properties["objectSid"][0]; 
    } 

    if(result.Properties["displayName"] != null && result.Properties["displayName"].Count > 0) 
    { 
     var userName = result.Properties["displayName"][0].ToString(); 
    } 
} 
+0

hi, Thanx cho trả lời .. Nhưng trong trường hợp của tôi, tôi sẽ không định nghĩa bất kỳ người dùng nào .. nó sẽ là vòng lặp cho mỗi người dùng cho một tên miền perticular .. – Eshwer

+0

@Eshwer: cập nhật phản hồi của tôi với một vòng lặp thông qua ** tất cả người dùng ** của một miền cụ thể - ** S BE S SL ** nếu bạn có nhiều người dùng. –

+0

Xin chào .. Nhưng bạn đang chỉ định url ldap ở đâu ..? hoặc nó không được yêu cầu? trong trường hợp này từ nơi nó sẽ lấy danh sách người dùng? – Eshwer

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