servidor - obtener nombre de usuario de windows c#
Cómo obtener los detalles de Active Directory del usuario actual en C# (4)
Estoy trabajando en una aplicación C # y ASP.Net, que usa la Autenticación de Windows.
es decir, en Web.config:
<system.web>
<authentication mode="Windows" />
</system.web>
Deseo obtener detalles para el usuario actual (nombre completo, dirección de correo electrónico, etc.) de Active Directory.
Puedo obtener su nombre de inicio de sesión de usuario anterior a Windows 2000 (por ejemplo: SOMEDOMAIN/someuser
) mediante el uso de
string username = HttpContext.Current.Request.ServerVariables["AUTH_USER"];
He resuelto la consulta LDAP para el usuario, utilizando su nombre de inicio de sesión actual (no su nombre de inicio de sesión de usuario de Windows 2000):
DirectorySearcher adSearch = new DirectorySearcher(
"([email protected])");
SearchResult adSearchResult = adSearch.FindOne();
Sin embargo, no sé cómo buscar AD para el usuario utilizando su nombre de inicio de sesión pre W2K, o obtener su nombre de usuario en el formato ''[email protected]''.
¿Algunas ideas?
Agregar referencia a COM "Active DS Type Library"
Int32 nameTypeNT4 = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4;
Int32 nameTypeDN = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_1779;
Int32 nameTypeUserPrincipalName = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME;
ActiveDs.NameTranslate nameTranslate = new ActiveDs.NameTranslate();
// Convert NT name DOMAIN/User into AD distinguished name
// "CN= User//, Name,OU=IT,OU=All Users,DC=Company,DC=com"
nameTranslate.Set(nameTypeNT4, ntUser);
String distinguishedName = nameTranslate.Get(nameTypeDN);
Console.WriteLine(distinguishedName);
// Convert AD distinguished name "CN= User//, Name,OU=IT,OU=All Users,DC=Company,DC=com"
// into NT name DOMAIN/User
ntUser = String.Empty;
nameTranslate.Set(nameTypeDN, distinguishedName);
ntUser = nameTranslate.Get(nameTypeNT4);
Console.WriteLine(ntUser);
// Convert NT name DOMAIN/User into AD UserPrincipalName [email protected]
nameTranslate.Set(nameTypeNT4, ntUser);
String userPrincipalName = nameTranslate.Get(nameTypeUserPrincipalName);
Console.WriteLine(userPrincipalName);
Alan ya le dio la respuesta correcta: use el sAMAccountName
para filtrar a su usuario.
Agregaría una recomendación sobre su uso de DirectorySearcher
: si solo desea una o dos piezas de información, agréguelas a la colección "PropertiesToLoad"
de DirectorySearcher
.
En lugar de recuperar todo el gran objeto del usuario y luego seleccionar uno o dos elementos, esto solo devolverá exactamente los bits que necesita.
Muestra:
adSearch.PropertiesToLoad.Add("sn"); // surname = last name
adSearch.PropertiesToLoad.Add("givenName"); // given (or first) name
adSearch.PropertiesToLoad.Add("mail"); // e-mail addresse
adSearch.PropertiesToLoad.Add("telephoneNumber"); // phone number
Esos son solo los nombres de propiedad AD / LDAP usuales que necesita especificar.
El nombre "pre Windows 2000", es decir, DOMAIN/SomeBody
, la porción Somebody
se conoce como sAMAccountName.
Así que prueba:
using(DirectoryEntry de = new DirectoryEntry("LDAP://MyDomainController"))
{
using(DirectorySearcher adSearch = new DirectorySearcher(de))
{
adSearch.Filter = "(sAMAccountName=someuser)";
SearchResult adSearchResult = adSearch.FindOne();
}
}
[email protected] es UserPrincipalName, pero no es un campo obligatorio.
Si está utilizando .NET 3.5 SP1 +, la mejor manera de hacerlo es echar un vistazo al
System.DirectoryServices.AccountManagement namespace.
Tiene métodos para encontrar personas y puede pasar prácticamente cualquier formato de nombre de usuario que desee y luego devuelve la información básica que necesita. Si necesita ayuda para cargar objetos y propiedades más complejos, revise el código fuente de http://umanage.codeplex.com y lo tiene todo.
Brent