2010-09-23 7 views
2

J'utilise cet extrait de code pour afficher une liste de tous les ordinateurs sur mon réseau (la langue est jscript.net, mais c'est juste une petite manipulation de C#).Liste des ordinateurs dans Active Directory qui sont en ligne

var parentEntry = new DirectoryEntry(); 

    parentEntry.Path = "WinNT:"; 
    for(var childEntry in parentEntry.Children) { 
     if(childEntry.SchemaClassName == "Domain") { 
      var parentDomain = new TreeNode(childEntry.Name); 
      this.treeView1.Nodes.Add(parentDomain); 

      var subChildEntry : DirectoryEntry; 
      var subParentEntry = new DirectoryEntry(); 
      subParentEntry.Path = "WinNT://" + childEntry.Name; 
      for(subChildEntry in subParentEntry.Children) { 
       var newNode1 = new TreeNode(subChildEntry.Name); 
       if(subChildEntry.SchemaClassName == "Computer") { 
        parentDomain.Nodes.Add(newNode1); 
       } 
      } 
     } 

    } 

J'ai 2 problèmes avec cela:

1) Il est extrêmement lent. Il y a environ 100 ordinateurs qui montrent, et il faut environ 1 minute pour charger.

2) Je veux obtenir seulement une liste d'ordinateurs qui sont actuellement en ligne. Cela peut être fait parce que j'ai vu d'autres programmes le faire et ils sont beaucoup plus rapides, aussi ils sont capables de montrer seulement ceux en ligne.

Ai-je raté quelque chose?

Répondre

2

Je sais que c'est un peu vieux, mais pour les autres ... cet extrait renverra 760 noms d'ordinateurs à partir d'un domaine utilisant AD dans les 2-3 secondes .... une amélioration significative .... profitez-en!

Friend Shared Function DomainComputers() As Generic.List(Of String) 

    ' Add a Reference to System.DirectoryServices 

    Dim Result As New Generic.List(Of String) 

    Dim ComputerName As String = Nothing 
    Dim SRC As SearchResultCollection = Nothing 
    Dim Searcher As DirectorySearcher = Nothing 

    Try 

     Searcher = New DirectorySearcher("(objectCategory=computer)", {"Name"}) 

     Searcher.Sort = New SortOption("Name", SortDirection.Ascending) 
     Searcher.Tombstone = False 

     SRC = Searcher.FindAll 

     For Each Item As SearchResult In SRC 
      ComputerName = Item.Properties("Name")(0) 
      Result.Add(ComputerName) 
     Next 

    Catch ex As Exception 

    End Try 

    Return Result 

End Function 
0

Je regardais Linq To Active Directory trouvé sur CodePlex

Vous auriez également de définir « mon réseau ». Votre sous-réseau? Votre unité organisationnelle? Ton domaine? Ta forêt?

Considérez également où votre serveur LDAP est que vous interrogez. Est-il proche ou est-il à l'autre bout d'un lien distant?

Que pensez-vous de "en ligne"? Pensez-vous être en mesure de le ping? Pensez-vous pouvoir vous y connecter et effectuer une opération?

Il y a beaucoup de choses à considérer ici. En outre, si vous avez d'autres composants d'infrastructure tels qu'un serveur SCCM/SMS, ils peuvent souvent être interrogés beaucoup plus rapidement, car toutes les données de découverte ont été transférées dans l'entrepôt de données.

+0

Pour "réseau", je veux dire mon domaine. –

+0

Je pense qu'il veut dire: tout comme Windows Explorer. Il ne vous montre pas les emplacements réseau qui, si vous deviez essayer d'ouvrir et de lister des partages, renverrait l'erreur suivante: Le serveur RPC n'est pas disponible ... ce que je recherche également pour le moment ... – MaxOvrdrv