2010-08-12 14 views

Respuesta

47

Si está utilizando .Net 3.0 o superior, hay una hermosa biblioteca que hace que prácticamente se escriba solo. System.DirectoryServices.AccountManagement tiene un objeto UserPrincipal que obtiene exactamente lo que está buscando y no tiene que meterse con LDAP o soltar las llamadas al sistema para hacerlo. Aquí está todo lo que tomaría:

Thread.GetDomain().SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 
WindowsPrincipal principal = (WindowsPrincipal)Thread.CurrentPrincipal; 
// or, if you're in Asp.Net with windows authentication you can use: 
// WindowsPrincipal principal = (WindowsPrincipal)User; 
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain)) 
{ 
    UserPrincipal up = UserPrincipal.FindByIdentity(pc, principal.Identity.Name); 
    return up.DisplayName; 
    // or return up.GivenName + " " + up.Surname; 
} 

Nota: en realidad no necesita el director si ya tiene el nombre de usuario, pero si se está ejecutando bajo el contexto de los usuarios, es igual de fácil para tirar de él desde ahí.

+0

¿qué tal .Net2? –

+0

¿Actualizar? Sí, lo sé, inútil. Lo siento. Nunca estuve satisfecho con los aros que tuvo que pasar para obtener información de AD en versiones anteriores del marco. –

+5

['PrincipalContext'] (http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.principalcontext.aspx) parece haber sido introducido en .NET 3.5 –

8

Esta solución no funcionó para mí, pero esta función funcionó muy bien:

public static string GetUserFullName(string domain, string userName) 
     { 
      DirectoryEntry userEntry = new DirectoryEntry("WinNT://" + domain + "/" + userName + ",User"); 
      return (string)userEntry.Properties["fullname"].Value; 
     } 

Debe llamar de esa manera:

GetUserFullName(Environment.UserDomainName, Environment.UserName); 

(encontrado que here).

+0

Espera, ¿qué quieres decir con "esta solución". Si te refieres a tu propia respuesta, ¿por qué la publicaste? Si se refería a otra solución, aclare cuál. – TylerH

42

hay una manera más fácil de hacer esto:

using System.DirectoryServices.AccountManagement; 

UserPrincipal userPrincipal = UserPrincipal.Current; 
String name = userPrincipal.DisplayName; 

enter image description here

Cuestiones relacionadas