2009-06-02 19 views
13

¿Cómo puedo obtener el usuario y el dominio de Windows de un objeto DirectoryEntry (SchemaClassName = "user") de Active Directory?¿Cómo puedo obtener DOMAIN USER desde AD DirectoryEntry?

El nombre de usuario está en la propiedad sAMAccountName, pero ¿dónde puedo buscar el nombre de dominio?

(que no puede asumir un nombre de dominio fijo debido a que los usuarios son de varios subdominios.)

+0

Relacionados: http://stackoverflow.com/questions/4249139/c-sharp-active-directory-get-domain-name-of-user –

Respuesta

3

I conocer un contenedor de particiones en CN = Particiones, CN = configuración que contiene todos los dominios.

Al hacer coincidir al usuario con la partición, puede leer el nombre de dominio real de la propiedad nETBIOSName + "\" + sAMAccountName.

+1

nETBIOSName es el nombre de la computadora ¿no? ¿cómo le dará nombre de dominio? – Shesha

2

Si está utilizando las bibliotecas System.DirectoryServices, usted debe tener una SearchResultsCollection de un DirectorySearcher.

Dentro de cada colección de Properties de SearchResult, hay una propiedad "distinguishedname". Eso contendrá todas las partes de DC que componen el dominio al que pertenece su entrada de directorio.

+0

+1: He hecho esto para obtener todo tipo de información, como con quién están empleados, así como una lista de todos sus grupos de seguridad. – RSolberg

+5

Sí, pero ¿cómo me ayuda eso? ¿Cómo obtengo el nombre de dominio "company-central" de DC = Company, DC = com? – laktak

+0

Este es el camino correcto a seguir ... pero recuerde que un dominio a menudo puede ser un alias para la ruta correcta en AD ... por ej. en nuestra organización, el dominio SOUTH_AMERICA es realmente soa.company.com, EUROPA es eur.empresa.com, que está representado por dc = eur, dc = compañía, dc = com, etc. por lo que es posible que necesite una tabla de búsqueda y hacer una búsqueda en la cadena distinguishedName – davidsleeps

7

No encontrará lo que está buscando en DirectoryEntry, lamentablemente.

Tiene sAMAccountName que normalmente es algo así como myuser (sin el dominio). Usted tiene el distinguishedName que es algo así como LDAP://cn=joe myuser,cn=Users,dc=yourCompany,dc=com. También tiene un userPrincipalName, pero generalmente es un nombre en el formato [email protected].

Pero no encontrarás ningún atributo que tenga el domain\MyUser, desafortunadamente. Tendrás que juntar eso con tu información sobre el nombre de dominio y el nombre de cuenta de sAMA de DirectoryEntry.

Para obtener más información y excelentes hojas de Excel sobre todas las propiedades de LDAP y WinNT en System.DirectoryServices, consulte el sitio web Hilltop Lab de ADSI MVP Richard Mueller.

Marc

21

Esto supone que results es una SearchResultCollection obtenida de un DirectorySearcher, pero debería poder obtener directamente el objectsid desde un DirectoryEntry.

SearchResult result = results[0]; 
var propertyValues = result.Properties["objectsid"]; 
var objectsid = (byte[])propertyValues[0]; 

var sid = new SecurityIdentifier(objectsid, 0) 

var account = sid.Translate(typeof(NTAccount)); 
account.ToString(); // This give the DOMAIN\User format for the account 
+3

Lamentablemente, esto no funciona para mí, tengo el objectid pero obtengo una IdentityNotMappedException en la llamada a Translate(). Esto puede deberse a que la máquina que ejecuta el código no es parte del dominio, solo estoy consultando AD. – laktak

+0

¿Hay alguna forma de traducir al revés? Si tengo una cadena en el formato DOMINIO \ usuario, ¿puedo buscar el objeto de directorio? Especialmente considerando que podría tratar con múltiples dominios que son de confianza, ¿es esto posible? – Jeremy

+0

Gracias. Todavía funciona en .NET 4.5. – Steven

7

Para obtener el nombre de dominio DirectoryEntry puede utilizar recursividad en directoryEntry.Parent. Y luego, si directoryEntry.SchemaClassName == "domainDNS" se puede obtener el nombre de dominio de esta manera:

directoryEntry.Properties["Name"].Value 
-2

1) Usted puede obtener la userPrincipalName del DirectoryEntry.

2) A continuación, divida el UPN entre el nombre de usuario y el nombre de dominio.

3) A continuación, llame a GetNetBIOSName() en él.

 public static DirectoryEntry GetDirectoryObject(string strPath) 
     { 
      if (strPath == "") 
      { 
       strPath = ConfigurationManager.AppSettings["LDAPPath"]; //YOUR DEFAULT LDAP PATH ie. LDAP://YourDomainServer 
      } 

      string username = ConfigurationManager.AppSettings["LDAPAccount"]; 
      string password = ConfigurationManager.AppSettings["LDAPPassword"]; 
       //You can encrypt and decrypt your password settings in web.config, but for the sake of simplicity, I've excluded the encryption code from this listing. 

} 
      catch (Exception ex) 
      { 
       HttpContext.Current.Response.Write("user: " + username + ", LDAPAccount: "+ ConfigurationManager.AppSettings["LDAPAccount"] + ".<br /> "+ ex.Message +"<br />"); 

       if (HttpContext.Current.User.Identity != null) 
       { 

        HttpContext.Current.Response.Write("HttpContext.Current.User.Identity: " + HttpContext.Current.User.Identity.Name + ", " + HttpContext.Current.User.Identity.IsAuthenticated.ToString() + "<br />"); 

        HttpContext.Current.Response.Write("Windows Identity: " + WindowsIdentity.GetCurrent().Name + ", " + HttpContext.Current.User.Identity.IsAuthenticated.ToString()); 


       } 
       else 
       { 
        HttpContext.Current.Response.Write("User.Identity is null."); 
       } 

       HttpContext.Current.Response.End(); 


      } 




      DirectoryEntry oDE = new DirectoryEntry(strPath, username, password, AuthenticationTypes.Secure); 
      return oDE; 
     } 




public static string GetNetBIOSName(string DomainName) 
{ 



    string netBIOSName = ""; 
    DirectoryEntry rootDSE =GetDirectoryObject(
     "LDAP://"+DomainName+"/rootDSE"); 

    string domain = (string)rootDSE.Properties[ 
     "defaultNamingContext"][0]; 

     // netBIOSName += "Naming Context: " + domain + "<br />"; 

    if (!String.IsNullOrEmpty(domain)) 
    { 

      //This code assumes you have a directory entry at the /CN=Partitions, CN=Configuration 
      //It will not work if you do not have this entry. 

     DirectoryEntry parts = GetDirectoryObject(
      "LDAP://"+DomainName+"/CN=Partitions, CN=Configuration," + domain); 

      foreach (DirectoryEntry part in parts.Children) 
     { 


      if ((string)part.Properties[ 
       "nCName"][0] == domain) 
      { 
       netBIOSName += (string)part.Properties[ 
        "NetBIOSName"][0]; 
       break; 
      } 
     } 


    } 
     return netBIOSName; 
} 


    public static string GetDomainUsernameFromUPN(string strUPN) 
{ 
string DomainName; 
string UserName; 
    if (strUPN.Contains("@")) 
     { 
      string[] ud = strUPN.Split('@'); 
      strUPN= ud[0]; 
      DomainName = ud[1]; 

      DomainName=LDAPToolKit.GetNetBIOSName(DomainName); 

      UserName= DomainName + "\\" + strUPN; 
     } 
     else 
     { 
      UserName= strUPN; 
     } 


    return UserName; 
} 
3
public static string GetDomainNameUserNameFromUPN(string strUPN) 
{ 

    try 
    { 
     WindowsIdentity wi = new WindowsIdentity(strUPN); 
     WindowsPrincipal wp = new WindowsPrincipal(wi); 

     return wp.Identity.Name; 



    } 
    catch (Exception ex) 
    { 

    } 

    return ""; 
} 
0

les extiendo una respuesta anterior por @laktak para proporcionar los detalles de lo que quería decir.

Hay un contenedor de particiones en CN=Partitions,CN=Configuration que contiene todos los dominios que le da la cn que es el nombre de dominio NetBIOS y la propiedad nCName que contiene el prefijo distinguishedName un usuario tendrá si se encuentran en este dominio.

así que empieza por la búsqueda de LDAP (objectClass=*) en CN=Partitions,CN=Configuration y almacenar el (cn, nCName) pares de cada resultado a un mapa.

A continuación, consulta ldap usando (sAMAccountName=USERIDHERE) y obtén el distinguishedName del usuario. Ahora vaya a través de los pares (cn, nCName) y encuentre el nCName que prefija el distinguishedName del usuario, y el correspondiente cn es su nombre de dominio deseado.

Cuestiones relacionadas