2009-09-14 14 views
7

Ich verwende den System.Management-Namespace in einem .Net, um verschiedene WMI-Abfragen für einen Remote-Server auszuführen. In meinen Protokollen kann ich sehen, dass die Abfragen manchmal 30 oder 40 Sekunden dauern, während andere Abfragen in weniger als einer Sekunde abgeschlossen sind.Warum sind WMI-Abfragen manchmal so langsam?

Wenn ich diese langsamen Abfragen sehe, versuche ich, eine Verbindung mit der Box mit wbemtest herzustellen, aber es verbindet immer und führt die Abfrage schnell aus.

Irgendwelche Ideen, Hinweise, Vorschläge?

Ich habe bei der Betrachtung von System.Management.ManagementScope im Reflector festgestellt, dass es einen IWbemServices-Zeiger zu verlieren scheint. Es sieht so aus, als ob es sich um eine COM-Schnittstelle handelt, für die Release aufgerufen werden muss (Marshal.ReleaseComObject()). Ich bin mir nicht sicher, ob das verwandt ist oder nicht. Ich verbinde mich während des Prozesses mit vielen verschiedenen Servern.

Antwort

2

Ich habe die gleiche Art von Anwendung, die mehrere WMI-Abfragen auf allen verschiedenen Arten von Geräten und ich das gleiche Verhalten erleben. Die Verwendung von wbemtest ist manchmal schneller, aber nicht unbedingt notwendig. Ich finde auch einige Abfragen auf der gleichen Maschine anders als andere Abfragen auf der gleichen Maschine, weil eine andere Klasse Abfragen ist.

Es gibt eine ReturnImmediately-Eigenschaft, die zur EnumerationOptions-Klasse gehört, die Ihnen helfen kann, die Ergebnisse schneller zu erhalten, wenn Sie sie in einem Batch abrufen, anstatt sie über das Netzwerk aufzuzählen.

EnumerationOptions options = new EnumerationOptions(); 
options.ReturnImmediately = false; 

Sie können das versuchen und sehen, ob es hilft. Ich weiß, das ist nicht das, was du hören willst, aber meine persönliche Meinung ist, dass du nicht viel tun kannst. Sie müssen Code schreiben, um das Problem zu umgehen. Die eigentliche Antwort liegt irgendwo tief in den Schalen von DCOM, dem WMI-Protokoll und dem WMI-Repository.

+0

Leider glaube ich, dass Sie Recht haben. Ich muss nur um das Problem herum arbeiten. Die Einstellung ReturnImmediately half ein wenig, aber nicht genug, um das Problem zu lösen. –

0

Ist das Problem spezifisch für eine Box? Ich hatte einmal das gleiche Problem mit einem Remoting-Szenario. Ich habe es repariert, indem ich den TCP/IP-Stack auf der Box neu aufgebaut habe, um den Remoting-Aufruf zu machen.

+0

Nr Dies geschieht, um mehrere der Zielcomputer (aber nicht alle von ihnen). Zu dem Zeitpunkt, zu dem ich die langsamen Abfragen in den Protokollen sehe und versuche, manuell abzufragen, ist das Problem behoben. –

+0

Was ist mit den Quell-Computern (diejenigen, die die Anrufe tätigen)? Ist das Problem für jeden von ihnen spezifisch? –

+0

Ja und Nein :). Das sind mehrere Quellcomputer mit diesem Problem, aber nicht jeder Server, den ich versuche, hat dieses Problem. –

2

Sie könnten versuchen, das Feld WITHIN zu setzen, um zu sehen, ob es die Abfrage früher erzwingt. Können Sie die von Ihnen verwendete Abfrage posten? Das könnte helfen, weitere Probleme zu beheben

0

Schauen Sie in die WBEM_FLAG_RETURN_IMMEDIATE & WBEM_FLAG_FORWARD_ONLY Flags für Ihre Sprache. Bei Verwendung von Scriptomatic (großartige kleine VBScript-GUI von MS für WMI-Aufrufe) wird diese Option automatisch als Teil der Optionen hinzugefügt. Die 48 bedeutet WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY. VBScript-Beispiel:

objWMIService.ExecQuery ("Select * from Win32_NetworkConnection",,48) 

https://msdn.microsoft.com/en-us/library/aa390880(v=vs.85).aspx