2010-10-14 23 views
15

Ce que je veux dire est que en ce moment je suis en utilisant System.DirectoryServices.AccountManagement et si j'utilise la classe UserPrincipal Je ne vois que le nom, prénom, etcComment obtenir des attributs Active Directory non représentés par la classe UserPrincipal

donc dans mes codes comme

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

Comment est-ce que je verrais l'attribut comme le mobile ou l'information?

Répondre

15

Dans ce cas, vous devez aller un niveau plus profond - de retour dans les entrailles de DirectoryEntry - en le saisissant du principal utilisateur:

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

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

Ill faire un essai vous permettra de savoir – Mondyak

+0

Cela a bien fonctionné comme une solution rapide, mais j'essaie d'éviter d'utiliser l'entrée de répertoire. Merci pour l'aide – Mondyak

+0

Étonné cela a eu tellement de upvotes, car il ne montre pas comment implémenter l'objet 'de' pour obtenir les propriétés. – vapcguy

3

up.Mobile serait parfait, mais malheureusement, il n'y a pas de méthode dans la classe UserPrincipal, vous devez passer à l'DirectoryEntry en appelant .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

Malheureusement, si vous chargez une propriété sur 'deSearch' qui a une valeur vide dans AD, elle ne revient pas dans le jeu de résultats et le code original ne vérifie pas qu'elle n'est pas là, donc elle lève l'exception' Référence d'objet non définie sur une instance d'un objet sur cette ligne 'Console.WriteLine'. J'ai soumis une modification qui devrait faire l'affaire. – vapcguy

+0

Notez, aussi, cela devrait être enveloppé dans un 'try ... catch'. Si un utilisateur est envoyé à cette fonction qui n'est plus dans AD, il recevra également l'exception 'Référence d'objet non définie sur une instance d'un objet' sur l'instanciation' DirectoryEntry' - corrigée aussi dans mon édition. – vapcguy

+0

Aussi, je ne vois même pas "mobile" dans la liste des PropertyNames possibles dans le 'rootSearch' de' results'. Il y a un numéro de téléphone qui pourrait être ce que le PO recherche. C'est la même chose que "Phone" dans le formulaire GUI pour un utilisateur dans AD, mais aussi, c'est la même chose que 'up.VoiceTelephoneNumber', et donc ne nécessiterait même pas l'appel' .GetUnderlyingObject() '. Mais d'autres propriétés seraient probablement, pour moi, la meilleure solution pour les parcourir tous. – vapcguy