2012-02-28 4 views
6

Próbuję uzyskać informacje o użytkowniku dla określonej domeny, która będzie wprowadzeniem programu. Na podstawie nazwy domeny powinna zwracać listę nazw użytkowników/lub NT Id i SID użytkownika. Jestem nowy w programowaniu ldap, może ktoś mi pomoże uzyskać tę listę.Jak uzyskać nazwę użytkownika i identyfikator SID dla użytkownika według nazwy domeny w ldap

+2

Kiedy mówisz * LDAP *, masz na myśli * * Active Directory w systemie Windows, czy trzeba „ogólnych” rozwiązanie LDAP dla wszystkich możliwych serwerów LDAP .... –

Odpowiedz

15

Jeśli używasz .NET 3.5 lub nowszej wersji i rozmawiasz o Active Directory, powinieneś sprawdzić przestrzeń nazw System.DirectoryServices.AccountManagement (S.DS.AM). Przeczytać o tym tutaj:

Zasadniczo, można określić kontekst domeny i łatwo znaleźć użytkowników i/lub grupy w 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; 
} 

nowy S.DS.AM ułatwia zabawę z użytkownikami i grupami w AD!

Aktualizacja: jeśli trzeba pętli wszystkich użytkowników domeny - spróbuj tego:

Można użyć PrincipalSearcher i „query-przez-przykład” główny zrobić swoje poszukiwania:

// 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; 
    } 
} 

Aktualizacja # 2: jeśli nie może (lub nie chcą) stosowanie metody S.DS.AM - co jest najłatwiejsze, Active Directory, zdecydowanie - to trzeba by się znowu do System.DirectoryServices klasy i metody:

// 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

Cześć, Dzięki za odpowiedzi .. Ale w moim przypadku nie będę definiować żadnego użytkownika. Powinien to być pętla dla każdego użytkownika w domenie perticular .. – Eshwer

+0

@Zamówiono: zaktualizowałem moją odpowiedź za pomocą pętli przez ** wszystkich ** użytkowników danej domeny - to ** BĘDZIE WOLNY **, jeśli masz wielu użytkowników. –

+0

Cześć .. Ale gdzie jesteś podając adres URL ldap ..? lub nie jest wymagane? w tym przypadku skąd zajmie listę użytkowników? – Eshwer