2010-10-14 3 views
15

Quello che voglio dire è che in questo momento sto usando System.DirectoryServices.AccountManagement e se uso classe UserPrincipal vedo solo il nome, secondo nome, eccCome arrivare Active Directory non Attributi rappresentato dalla classe UserPrincipal

così nei miei codici è come

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

Come vedrei l'attributo come mobile o info?

risposta

15

In questo caso, è necessario fare un livello più profondo - di nuovo nelle viscere della DirectoryEntry - afferrandolo dalla principale utente:

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

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

Ill fare un tentativo vi farò sapere – Mondyak

+0

Questo ha funzionato bene come una soluzione rapida, ma sto cercando di evitare l'uso di voce directory. Grazie per l'aiuto – Mondyak

+0

Stupito questo ha avuto così tanti upvotes, in quanto non mostra come implementare l'oggetto 'de' per ottenere le proprietà. – vapcguy

3

up.Mobile sarebbe perfetto, ma purtroppo, non c'è tale metodo nella classe UserPrincipal, quindi bisogna passare a DirectoryEntry chiamando .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

Sfortunatamente, se si carica una proprietà su 'deSearch' che ha un valore vuoto in AD, non ritorna nella serie di risultati e il codice originale non verifica che non sia lì, quindi genera l'eccezione' Riferimento dell'oggetto non impostato su un'istanza di un oggetto 'su tale riga' Console.WriteLine'. Ho inviato una modifica che dovrebbe fare il lavoro. – vapcguy

+0

Nota, anche questo dovrebbe essere tutto racchiuso in un 'try ... catch'. Se un utente viene inviato a questa funzione che non è più in AD, otterrà anche l'eccezione 'Riferimento oggetto non impostato su un'istanza di un oggetto' nell'istanza di' DirectoryEntry' - corretto anche nella mia modifica. – vapcguy

+0

Inoltre, non vedo nemmeno "mobile" nell'elenco di possibili PropertyNames in 'rootSearch' di' results'. C'è 'telephonenumber' che potrebbe effettivamente essere ciò che l'OP sta cercando. È uguale a "Telefono" nel modulo della GUI per un utente in AD, ma anche, è lo stesso di "up.VoiceTelephoneNumber", e quindi non richiederebbe nemmeno la chiamata '.GetUnderlyingObject()'. Ma altre proprietà probabilmente lo farebbero, quindi questo per me è la migliore soluzione per scorrere tutte queste cose. – vapcguy