2010-10-14 18 views
15

Lo que quiero decir es que en este momento estoy usando System.DirectoryServices.AccountManagement y si uso la clase UserPrincipal sólo veo el nombre, segundo nombre, etcComo llegar Active Directory no atributos representados por la clase UserPrincipal

entonces en mis códigos me gusta

UserPrincipal myUser = new UserPrincipal(pc); 
myUser.Name = "aaaaaa"; 
myUser.SamAccountName = "aaaaaaa"; 
. 
. 
. 
. 
myUser.Save(); 

¿Cómo veo el atributo como móvil o información?

Respuesta

15

En este caso, tiene que ir a un nivel más profundo - de nuevo en las entrañas de DirectoryEntry - agarrándola del director de usuario:

DirectoryEntry de = (myUser.GetUnderlyingObject() as DirectoryEntry); 

if(de != null) 
{ 
    // go for those attributes and do what you need to do 
} 
+0

Ill darle una oportunidad le permitirá saber – Mondyak

+0

Esto funcionó bien como una solución rápida, pero estoy tratando de evitar el uso de entrada de directorio. Gracias por la ayuda. – Mondyak

+0

Asombrado esto recibió tantos votos positivos, ya que no muestra cómo implementar el objeto 'de' para obtener las propiedades. – vapcguy

3

up.Mobile sería perfecto, pero, por desgracia, no hay tal método en la clase UserPrincipal, por lo que debe de cambiar a DirectoryEntry llamando al .GetUnderlyingObject().

static void GetUserMobile(PrincipalContext ctx, string userGuid) 
{ 
    try 
    { 
     UserPrincipal up = UserPrincipal.FindByIdentity(ctx, IdentityType.Guid, userGuid); 
     DirectoryEntry up_de = (DirectoryEntry)up.GetUnderlyingObject(); 
     DirectorySearcher deSearch = new DirectorySearcher(up_de); 
     deSearch.PropertiesToLoad.Add("mobile"); 
     SearchResultCollection results = deSearch.FindAll(); 
     if (results != null && results.Count > 0) 
     { 
      ResultPropertyCollection rpc = results[0].Properties; 
      foreach (string rp in rpc.PropertyNames) 
      { 
       if (rp == "mobile") 
        Console.WriteLine(rpc["mobile"][0].ToString()); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 
    } 
} 
+0

Desafortunadamente, si carga una propiedad en 'deSearch' que tiene un valor vacío en AD, no vuelve al conjunto de resultados y el código original no verifica que no esté allí, por lo que arroja la excepción' Referencia de objeto no establecida en una instancia de un objeto' en esa línea 'Console.WriteLine'. Envié una edición que debería hacer el trabajo. – vapcguy

+0

Nota, también, todo esto debería estar envuelto en un "try ... catch". Si se envía a un usuario a esta función que ya no está en AD, también recibirá la excepción 'Referencia de objeto no establecida en una instancia de un objeto' en la instanciación de' DirectoryEntry'; esto también se corrigió en mi edición. – vapcguy

+0

Además, ni siquiera veo "mobile" en la lista de posibles PropertyNames en 'rootSearch' of' results'. Hay 'telephonenumber' que en realidad podría ser lo que el OP está buscando. Es lo mismo que "Teléfono" en el formulario GUI para un usuario en AD, pero también es igual a 'up.VoiceTelephoneNumber', por lo que ni siquiera requeriría la llamada' .GetUnderlyingObject() '. Pero otras propiedades probablemente sí, así que esto para mí, es la mejor solución para iterar a través de todos ellos. – vapcguy

Cuestiones relacionadas