2013-06-19 2 views
2

J'ai une méthode de services d'annuaire pour rassembler des machines à partir d'Active Directory et les retourner en tant que List<>.Double ajout de services d'annuaire C# à la liste

Le code est:

public static List<string> PCsAndAttributes(string PCName, string AttributeToRead) 
{ 
     List<string> toReturn = new List<string>(); 
     try 
     { 
      string LdapPath = "LDAP://corp.company.com"; 
      DirectoryEntry computer = new DirectoryEntry(LdapPath); 

      DirectorySearcher search = new DirectorySearcher(PCName); 

      string searchAtt = "Name"; 

      search.Filter = "(" + searchAtt + "=" + PCName + ")"; 

      search.PropertiesToLoad.Add(AttributeToRead); 

      SearchResultCollection results = search.FindAll(); 

      foreach (SearchResult result in results) 
      { 
       ResultPropertyCollection PCS = result.Properties; 

       if (!(toReturn.Contains(Convert.ToString(PCS)))) 
       { 
        toReturn.Add(Convert.ToString(PCS[AttributeToRead][0])); 
       } 
      } 

      return toReturn; 
     } 
     catch (Exception err) 
     { 
      toReturn.Add(err.Message); 
      return toReturn; 
     } 
    } 

Pour une raison quelconque, cela crée deux de chaque ordinateur dans mon TreeView. Je suis sûr à 99% que l'erreur est à ce stade, mais je suis incapable d'éliminer les doublons.

Voici le code de noeud TreeView:

private void UpdateLists() 
    { 
     List<string> AdFinds = ProfileCleaner.smallClasses.AdClasses.PCsAndAttributes(txtComputers.Text, "Name"); 
     lblCount.Text = "PC Count: " + AdFinds.Count(); 

     foreach (string PC in AdFinds) 
     { 
      string online = ProfileCleaner.smallClasses.PingIt.Pingit(PC); 

      if (online == "Success") 
      { 
       TreeNode pNode = treePCs.Nodes.Add(PC); 
       pNode.Checked = true; 

       string OS = ProfileCleaner.smallClasses.OsVersion.GetOsVersion.OSVersion(PC); 

       string SubPath = null; 
       if (OS == "6") 
       { 
        SubPath = @"\C$\Users\"; 
       } 
       else 
       { 
        SubPath = @"\C$\Documents and Settings\"; 
       } 

       try 
       { 
        string[] usrs = Directory.GetDirectories(@"\\" + PC + SubPath); 
        foreach (string usr in usrs) 
        { 
         List<string> noAdds = new List<string>(); 
         noAdds.Add("admin"); noAdds.Add("Administrator"); 

          string[] lName = usr.Split('\\'); 
          string user = Convert.ToString(lName[lName.Length - 1]); 

         if (!(noAdds.Contains(user))) 
         { 
         pNode.Nodes.Add(usr); 
         } 
        } 
       } 
       catch (Exception folderErr) 
       { 
       } 
      } 
     } 
    } 

Quelqu'un peut-il me dire pourquoi je reçois deux de chaque machine à partir d'Active Directory?

J'ai essayé de capturer et d'éliminer, peut-être son ma logique, mais en essayant des choses comme:

if (!(myList.contains(NewMachine)) { } 

est-ce pas les arrêter.

Répondre

2

Dans l'annuaire actif, l'ordinateur est à la fois un utilisateur et un ordinateur. Votre chaîne de recherche devrait être search.Filter = "(&(" + searchAtt + "=" + PCName + ")(objectclass=computer))";

+0

Dès que j'ai lu votre message, c'était un moment "Duh". Alors, et merci beaucoup. –

+0

aucun problème heureux d'aider –

0

Si vous voulez éviter les doublons doivent être:

if (!(toReturn.Contains(Convert.ToString(PCS[AttributeToRead][0])))) 

je serais intéressé à savoir pourquoi retourne AD doublons. :)

+0

J'avais essayé ceci, et cela n'a pas fonctionné. Comme il s'est avéré que c'était une erreur idiote. J'appelais les recherches d'ordinateur comme recherches d'utilisateur ainsi quand j'ai fait FindAll() il a trouvé le compte d'utilisateur et le compte d'ordinateur James McShane a indiqué. J'ai passé assez de temps en AD, j'aurais vraiment dû attraper ça. –