2012-04-20 18 views
7

tôi thấy How can I get a list of users from active directory?Tìm kiếm một user id đăng nhập bằng tên và họ cuối cùng

Đó là hữu ích khi tôi chỉ có một vài người sử dụng, nhưng tôi có rất nhiều người dùng trong AD, vì vậy khi tôi chạy truy vấn của tôi

if ((String)(entry.Properties["sn"].Value) == "lname" 
    && (String)(entry.Properties["givenName"].Value) == "fname") 
{ 
    return entry.Properties["samAccountName"].Value.ToString(); 
} 

mất quá nhiều thời gian để hoàn thành.

Tôi có thể làm gì để tìm kiếm một id người dùng đăng nhập cụ thể theo tên và họ?

Trả lời

7

Vì bạn trên .NET 4, 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 - by e.g. his "samAccountName", or the Windows user name or something 
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName"); 

if(user != null) 
{ 
    // do something here....  
    string samAccountName = user.SamAccountName; 
} 

Nếu bạn không thể tìm thấy người dùng được chỉ định bởi tên người dùng, bạn cũng có thể sử dụng chức năng tìm kiếm mới:

// define a "query-by-example" principal - here, we search for a UserPrincipal 
// and with the first name (GivenName) and a last name (Surname) 
UserPrincipal qbeUser = new UserPrincipal(ctx); 
qbeUser.GivenName = firstName; 
qbeUser.Surname = lastName; 

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

// find all matches 
foreach(var found in srch.FindAll()) 
{ 
    // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....   
} 

S.DS.AM mới giúp bạn dễ dàng chơi với người dùng và nhóm trong AD! Và chỉ cần tìm một người dùng duy nhất cũng nên tương đối nhanh.

+0

giúp đỡ rất nhiều, tôi muốn tôi có thể chấp nhận tất cả các anwsers của chàng trai của bạn – user1225072

+0

@marc_s này là chính xác những gì tôi đang tìm kiếm, hoàn hảo, cảm ơn. .. tuy nhiên, tôi đã tìm ra cách khó mà nếu bất kỳ trường nào bạn yêu cầu từ người dùng để tìm kiếm là không cần thiết, bỏ qua thuộc tính tương ứng trong 'UserPrincipal'. Ban đầu tôi đang đẩy 'string.empty' và sau đó thậm chí là' null' và đã có ** không ** kết quả trả về. Tuy nhiên, ngay sau khi tôi thêm câu lệnh 'if' và bỏ qua mục đó trong' UserPrincipal', cuối cùng tôi đã trả về kết quả (_ie: skipped ** GivenName ** khi ** FirstName ** không được điền, thay vì cài đặt tới default_). – famousKaneis

0

Bạn cần đặt thuộc tính QueryFilter trên searcher và sau đó gọi searcher.FindOne() thay vì searcher.FindAll(). Bộ lọc truy vấn có thể được đặt thành đối tượng UserPrincipal nơi bạn đặt các trường mà bạn muốn tìm kiếm.

Microsoft có ví dụ điển hình về điều này tại trang Query By Example mặc dù ví dụ của họ hy vọng sẽ tìm thấy một số đối tượng phù hợp với tiêu chí nhất định.

Một sự thích nghi đặc biệt là nghĩa đen của câu hỏi liên quan đến yêu cầu của bạn sẽ được

using (var context = new PrincipalContext(ContextType.Domain, "mydomain.com")) 
{ 
    using (var searcher = new PrincipalSearcher(new UserPrincipal(context) { GivenName = "fname", Surname = "lname" })) 
    { 
      foreach (var result in searcher.FindAll()) 
      { 
       DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry; 
       return de.Properties["samAccountName"].Value.ToString(); 
      } 
    } 
} 
0

Nếu entry là một phần của một bộ sưu tập IEnumerable, bạn có thể làm một cái gì đó như:

var entries = {do your population of the collection here} 

var entry = entries.Where(e=>e.Properties["sn"].Value.ToString() == "lname" 
    && e=>.Properties["givenName"].Value.ToString() == "fname") 
    .FirstOrDefault(); 
2

Bạn nên sử dụng máy chủ AD để thực hiện việc lọc. Làm điều này bằng cách cung cấp một bộ lọc cú pháp LDAP. Ngoài ra, chỉ định các thuộc tính bạn cần phải sử dụng đối số propertiesToLoad của FindAll:

public static SearchResultCollection FindByName(
     string domain, string firstName, string lastName, string[] properties) { 
     var rootEntry = new DirectoryEntry("LDAP://" + domain); 
     var filter = string.Format("(&(sn={0})(givenName={1}))", lastName, firstName); 
     var searcher = new DirectorySearcher(rootEntry, filter, properties); 
     return searcher.FindAll(); 
    } 

    // Using the method: 
    var result = FindByName("mydomain", "Robert", "Smith", new[] { "samAccountName" })[0]; 
    string uName = (string)result.Properties["samAccountName"][0]; 
Các vấn đề liên quan