2010-04-22 6 views
2

Lors d'une requête pour un grand nombre de données via WMI (disons le journal des événements Windows Win32_NTLogEvent), il est très utile de savoir quel genre de nombres vous vous obtenez dans avant de télécharger tout le contenu. Y a-t-il un moyen de faire cela? D'après ce que je sais, il n'y a pas de "Select Count (*) FROM Win32_NTLogEvent" dans WQL. D'après ce que je sais, la propriété Count de ManagementObjectCollection énumère réellement tous les résultats, que la propriété Rewindable soit définie sur true ou false.Comment obtenir un nombre de ManagementObjects (résultats WMI) sans énumération à travers la collection dans .NET

Si elle ne peut pas être fait dans .NET, il peut être fait en utilisant directement les objets sous-jacents IWbem Merci

Répondre

1

Il semble que ce ne soit pas possible. La prochaine meilleure chose est la réponse fournie ci-dessus par Daryn.

+1

alors pourquoi n'avez-vous pas accepté sa réponse au lieu de poster ceci et ensuite de répondre à votre propre question? –

+1

J'ai pensé que puisque la réponse est "ça ne peut pas être fait", cela serait plus utile aux téléspectateurs qui cherchent à savoir si cela peut être fait ou non. – Mark

4

Les objets sous-jacents IWbem renvoie également une énumération.
E.g. Le IWbemServices::ExecQuery Method renvoie un IEnumWbemClassObject

Cependant, voir Improving Enumeration Performance pour un couple d'idées.
Notamment, le WBEM_FLAG_FORWARD_ONLY.
Si vous êtes en C#, je devine qu'il appelle ManagementObjectSearcher avec EnumerationOptions.Rewindable mis à false. Rewindable est vrai par défaut, donc l'éteindre devrait apporter quelques améliorations.

(Vous pouvez le profil aussi pour voir s'il y a une amélioration de la performance si vous demandez simplement un (clé) propriété dans votre requête. Par exemple, Select RecordNumber FROM Win32_NTLogEvent au lieu de Select * FROM Win32_NTLogEvent.
En théorie, pas autant d'informations devrait être instancié, mais en réalité il faut encore tout énumérer, et je ne me souviens pas si j'en ai jamais vu d'amélioration.)

+0

La sélection d'un seul champ améliore la vitesse par rapport à '*' dans certains cas. Par exemple, "select * from Win32_Processor" pour la première fois prend environ 1 sec (win7 x64, avec intel core i5-2400). La sélection de "Nom" ne prend que n-èmes de seconde. Les sélections suivantes sont rapides. Cela est logique lorsque vous avez besoin d'informations WMI une seule fois et que vous ne voulez pas attendre. – mistika

+0

Yep, le grand coupable est Win32_Processor.LoadPercentage, qui [rassemble des échantillons de la charge CPU sur une seconde et présente le chargement moyen] (http://msdn.microsoft.com/en-us/library/windows/ desktop/aa394373.aspx). Donc, cette propriété particulière va bloquer pendant une seconde lorsqu'on l'interroge de manière synchrone. – Daryn

Questions connexes