2012-02-28 19 views
6

Estoy tratando de obtener la información del usuario para un dominio específico que será la entrada del programa. Sobre la base del nombre de dominio, debe devolver la lista del nombre de usuario/o ID NT y SID del usuario. Soy nuevo en la programación de ldap. ¿Alguien me puede ayudar a obtener esta lista?Cómo obtener un nombre de usuario y SID para el usuario por un nombre de dominio en ldap

+2

Cuando dicen * LDAP *, Qué quiere decir * Active Directory * en Windows, o necesita una solución LDAP "genérico" para todos los posibles servidores LDAP .... –

Respuesta

15

Si tiene .NET 3.5 en adelante y está hablando de Active Directory, entonces debe verificar el espacio de nombres System.DirectoryServices.AccountManagement (S.DS.AM). Leer todos los detalles aquí:

Básicamente, se puede definir un contexto de dominio y encontrar fácilmente los usuarios y/o grupos en el año:

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

El ¡El nuevo S.DS.AM hace que sea muy fácil jugar con usuarios y grupos en AD!

Actualización: si tiene que recorrer todos los usuarios de un dominio - Prueba esto:

Se puede utilizar un PrincipalSearcher y un director "de consulta por ejemplo" para hacer su búsqueda:

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

actualización # 2: si no puede (o no quiere) utilizan el enfoque S.DS.AM - que es el más fácil, para Active Directory, con mucho, - entonces usted necesita para caer de nuevo a la System.DirectoryServices clases y métodos:

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

hola, gracias por la respuesta .. Pero en mi caso no definiré a ningún usuario ... debería ser el bucle de cada usuario para un dominio particular. – Eshwer

+0

@Eshwer: actualicé mi respuesta con un bucle a ** todos los usuarios ** de un dominio dado - esto ** SERÁ LENTO ** si tiene muchos usuarios. –

+0

Hola ... Pero, ¿dónde especificas el ldap url ..? o no es requerido? en este caso, ¿de dónde tomará la lista de usuarios? – Eshwer

Cuestiones relacionadas