2011-07-20 10 views
5

Necesito enumerar todos los usuarios del grupo local específico en el siguiente formato: "Domain \ UserName". Puedo extraer la colección de objetos GroupPrincipal para el grupo, pero no sé cómo hacer que los usuarios obtengan el formato requerido. GroupPrincipal no tiene propiedad Dominio.¿Cómo obtener el dominio de GroupPrincipal?

El siguiente código genera usuarios sin dominio (por ejemplo, "Nombre de usuario").

using (var context = new PrincipalContext(ContextType.Machine, null)) 
{ 
    using (var group = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, @"My Local Group")) 
    { 
     if (group != null) 
     { 
      foreach (var p in group.GetMembers(false)) 
      { 
       Console.WriteLine(p.SamAccountName); 
      } 
     } 
    } 
} 

¿Es posible obtener el nombre de dominio NetBIOS del objeto principal? Y si es así, ¿cómo conseguirlo?

+0

¿Realmente lo necesita en el formulario 'DOMAIN \ UserName'? ¿Podrías también aceptar 'User @ Domain'? –

+0

@Damien_The_Unbeliever Necesito nombre de usuario en la misma forma en que HttpContext.User.Identity.Name lo devuelve con la autenticación habilitada de Windows (DOMAIN \ UserName). – altso

+0

'p' expone una propiedad SID, que le proporciona el identificador de seguridad. De forma similar, la identidad expone una propiedad de usuario (si se envía adecuadamente a un objeto WindowsIdentity), que también es un identificador de seguridad. ¿No podrías hacer una comparación basada en eso? –

Respuesta

9

Puede obtener los detalles de dominio del Contexto del director. ej .:

foreach (var p in group.GetMembers(false)) 

    { 
     Console.Write(p.SamAccountName); 
     if (p.ContextType == ContextType.Domain) 
     { 
      Console.Write(" ({0})", p.Context.Name); 
     } 

     Console.WriteLine(); 
    } 

Si lo que desea es nombres de cuenta de salida en el formato "dominio \ usuario" de una máquina en el dominio, se puede traducir SecurityIdentifier del director para un NTAccount. por ejemplo:

foreach (var p in group.GetMembers(false)) 
{ 
    Console.WriteLine(p.Sid.Translate(typeof(NTAccount)).ToString()); 
} 
+1

¡Estás seguro de eso! el atributo de nombre es el mismo que el primer atributo de CC, pero ¿es TODO el tiempo el nombre de Netbios del dominio? Recuerde que se puede elegir un nombre diferente de Domain Netbios durante la instalación. Se supone que esto funciona la mayor parte del tiempo, pero no estoy seguro de la respuesta – JPBlanc

+0

Sí, el contexto del director me da un nombre diferente. En mi caso, está en la forma 'location.company.com', pero espero 'LOCATION'. – altso

+0

@JPBlanc: el uso del nombre fue solo un ejemplo. OP declaró que quería obtener "información de dominio" del director, pero no fue explícito sobre qué información se deseaba. –

0

En un LDAP pura, la forma en que es posible recuperar el nombre de NetBIOS de una partición de dominio es el siguiente (dado que I'am trabajando en el DC = dom, dc = partición fr):

/* Connection to Active Directory 
*/ 
DirectoryEntry deConf = new DirectoryEntry("LDAP://WM2008R2ENT:389/CN=Partitions,CN=Configuration,DC=dom,DC=fr", "user", "password"); 

/* Directory Search 
*/ 
DirectorySearcher dsLookForNetb = new DirectorySearcher(deConf); 
dsLookForNetb.Filter = "(nCName=dc=dom,dc=fr)"; 
dsLookForNetb.SearchScope = SearchScope.Subtree; 
dsLookForNetb.PropertiesToLoad.Add("nETBIOSName"); 

SearchResult RefObj = dsLookForNetb.FindOne(); 

Console.WriteLine(RefObj.Properties["nETBIOSName"][0]); 
Cuestiones relacionadas