usuarios usuario servidor query obtener nombre net leer funcional crear consultar conectar con asp active c# .net active-directory ldap windows-authentication

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