2009-04-24 18 views
17

He tratado de las respuestas a estas preguntas Questions on SOobtener correo electrónico de ActiveDirectory

String account = userAccount.Replace(@"Domain\", ""); 
DirectoryEntry entry = new DirectoryEntry(); 

try { 
    DirectorySearcher search = new DirectorySearcher(entry); 

    search.PropertiesToLoad.Add("mail"); // e-mail addressead 

    SearchResult result = search.FindOne(); 
    if (result != null) { 
     return result.Properties["mail"][0].ToString(); 
    } else { 
     return "Unknown User"; 
    } 
} catch (Exception ex) { 
    return ex.Message; 
} 

Puede alguien ver el tema o punto en la dirección correcta?

Respuesta

28

He utilizado este código con éxito (en la que "cuenta" es el nombre de inicio de sesión del usuario sin el dominio (dominio \ cuenta):

// get a DirectorySearcher object 
DirectorySearcher search = new DirectorySearcher(entry); 

// specify the search filter 
search.Filter = "(&(objectClass=user)(anr=" + account + "))"; 

// specify which property values to return in the search 
search.PropertiesToLoad.Add("givenName"); // first name 
search.PropertiesToLoad.Add("sn");   // last name 
search.PropertiesToLoad.Add("mail");  // smtp mail address 

// perform the search 
SearchResult result = search.FindOne(); 
+1

.... y esa sería la respuesta correcta :) Agradable :) –

+2

sí, funcionó para mí también. Sí, también necesita la sintaxis de llamada ... Response.Write (result.Properties ["givenName"] [0] .ToString()); Response.Write ("
"); Response.Write (result.Properties ["sn"] [0] .ToString()); Response.Write ("
"); Response.Write (result.Properties ["mail"] [0] .ToString()); Response.Write ("
"); Response.Write (FindName ("gruberj")); – user95440

+3

Tuve que usar (& (objectCategory = person) (objectClass = user) (anr = "+ account +")) "; Como el primer resultado fue una computadora cuando acabo de usar objectClass = usuario – Matt

2

Has olvidado un filtro.

Trate de añadir esto antes de llamar FindOne:

search.Filter = String.Format("(sAMAccountName={0})", account); 
+0

los valores deben ser escaparon antes de que se ponen en la cadena de filtro (http://tools.ietf.org/html/rfc4515#section-3 ff .) – Tomalak

0

actualización: fredrick lo enchufa ...

Jakob tiene razón. Debe filtrar su búsqueda. Puede hacer todo tipo de and s y or s también si es necesario, pero creo que sAMAccountName es suficiente. Es posible que desee activar la herramienta ADSI (que está en el kit de recursos, creo), que le permite caminar AD como el registro. es genial para mirar propiedades. Luego, encuentre un usuario, determine qué puntería desea (correo en este caso) y lo que es primary key es - sAMAccountName es bueno, pero es posible que también desee filtrar en el tipo de nodo.

Estoy en un Mac, por lo que no puedo verificarlo, pero cada nodo en AD tiene un tipo, y puede agregarlo a su filtro. Creo que se ve así:

((sAMAccountName=bob) & (type=User)) 

Una vez más, comprobar que - Yo sé que no es type = usuario, pero algo por el estilo.

+0

Es (objectCategory = user) – Tomalak

+0

objectCategory = person? –

+0

Ambos funcionarán (al menos en el Directorio Activo). – Tomalak

0

Además, ¿dónde extraes el nombre de usuario de (almacenado, entrada del usuario, identidad actual)? Un nombre de usuario puede cambiar (cambiar de nombre) fácilmente; la identidad de inicio de sesión de SID/Windows, por otro lado, no cambia; por lo tanto, sería preferible hacer filtros/búsquedas por SID en lugar de samaccountname, si es posible y/o necesario para el diseño. ..

2

ustedes están trabajando muy duro:

// Look up the current user's email address 
    string eMail = UserPrincipal.Current.EmailAddress; 
Cuestiones relacionadas