Laden...

Wie kann man den PerformanceCounter Dienst auf dem Remote-PC prüfen?

Erstellt von csharp-user vor 7 Jahren Letzter Beitrag vor 7 Jahren 3.140 Views
C
csharp-user Themenstarter:in
63 Beiträge seit 2011
vor 7 Jahren
Wie kann man den PerformanceCounter Dienst auf dem Remote-PC prüfen?

Hallo zusammen,

ich habe eine kurze Frage.

Ich verwende PerformanceCounter, um die CPU Werte eines Remote-PCs auszulesen.
Der Code sieht so aus:

private PerformanceCounter cpuCounter;

this.cpuCounter = new PerformanceCounter();
this.cpuCounter.CategoryName = "Processor";
this.cpuCounter.CounterName = "% Processor Time";
this.cpuCounter.InstanceName = "_Total";
this.cpuCounter.MachineName = „PC-Name“;
this.cpuCounter.BeginInit();

Der Aufruf in einer Methode sieht so aus:

float cpuUsage = this.cpuCounter.NextValue();

Ich habe den Remote-PC (Windows Server 2012) absichtlich ausgeschaltet, um zu sehen, was genau passiert. Sobald ich den PC herunterfahre, bekomme ich von der Methode NextValue extrem schnell folgende Exceptions:

System.Runtime.InteropServices.COMException
System.UnauthorizedAccessException

Wie heißt der verantwortliche Dienst auf dem Remote-PC für die PerformanceCounters? Ich möchte gerne vor dem Aufruf der Methode NextValue() prüfen, ob der Dienst auf dem Remote-PC antwortet oder nicht. Ich habe mit dem Pingen probiert, aber es bringt nicht viel, weil der Remote-PC noch über Ping erreichbar ist. Die Dienste werden natürlich vorher gestoppt, bevor der Rechner endgültig runterfährt.

Danke.

16.835 Beiträge seit 2008
vor 7 Jahren

Du schaltest den PC aus und er antwortet trotzdem auf einen Ping? 🤔

COMException ist in NextValue nicht dokumentiert.
Was steht denn im StackTrace, woher es genau kommt?

Der Performance Counter kommuniziert via WMI und ist nichts anderes als ein Wrapper.
Der C# Quellcode ist ja offen. Schaus Dir halt an.
http://referencesource.microsoft.com/

C
csharp-user Themenstarter:in
63 Beiträge seit 2011
vor 7 Jahren

Hi!

Sorry, Du hast recht. COMException gehört nicht dazu.

Du schaltest den PC aus und er antwortet trotzdem auf einen Ping?

Ja, es dauert halt etwas bis der PC herunterfährt. Zuerst werden doch die Dienste gestoppt. In dieser Zeit ist der PC noch pingbar.

Danke für den Link. Ich schaue gleich dort nach, ob ich den Dienst finde.

Fehlermeldung:
Eine Ausnahme (erste Chance) des Typs "System.Runtime.InteropServices.COMException" ist in System.Management.dll aufgetreten.
Eine Ausnahme (erste Chance) des Typs "System.UnauthorizedAccessException" ist in mscorlib.dll aufgetreten.
Eine Ausnahme (erste Chance) des Typs "System.UnauthorizedAccessException" ist in mscorlib.dll aufgetreten.
bei Microsoft.Win32.RegistryKey.Win32Error(Int32 errorCode, String str)
bei Microsoft.Win32.RegistryKey.InternalGetValue(String name, Object defaultValue, Boolean doNotExpand, Boolean checkSecurity)
bei Microsoft.Win32.RegistryKey.GetValue(String name)
bei System.Diagnostics.PerformanceMonitor.GetData(String item)
bei System.Diagnostics.PerformanceCounterLib.GetPerformanceData(String item)
bei System.Diagnostics.PerformanceCounterLib.GetCategorySample(String category)
bei System.Diagnostics.PerformanceCounterLib.GetCategorySample(String machine, String category)
bei System.Diagnostics.PerformanceCounter.NextSample()
bei System.Diagnostics.PerformanceCounter.NextValue()

16.835 Beiträge seit 2008
vor 7 Jahren

Die COMException wird vom WMI kommen, das PerformanceCounter nutzt. System.Management.dll spricht jedenfalls dafür.
Was steht in dessen InnerException? Die schon angeschaut?
Die Exception besteht ja auch aus einer Nachricht, in der normalerweise der Grund steht und nicht nur aus einem Typ.

Evtl. kriegste auch nur den Win32 Error Code, den Du dann nachschauen kannst.
Vielleicht ist das dann ganz einfach NotReached o.ä.

C
csharp-user Themenstarter:in
63 Beiträge seit 2011
vor 7 Jahren

Was steht in dessen InnerException? Fehlermeldung:
[System.UnauthorizedAccessException] = {"Der Zugriff auf den Registrierungsschlüssel "238" wurde verweigert."}

Jetzt muss ich nur herausfinden, wie man vor dem Aufruf der Methode den Zugriff auf den Registrierungsschlüssel prüfen kann!

C
csharp-user Themenstarter:in
63 Beiträge seit 2011
vor 7 Jahren

Ich habe gerade RegistryKey.OpenRemoteBaseKey probiert. Ich dachte, dass ich so den Zugriff testen kann. Pustekuchen. Wenn ich den PC herunterfahre, dann dauert es eine Minute, bis OpenRemoteBaseKey eine IOException wirft!

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo csharp-user,

kannst du bitte für Zitate die dafür vorgesehenen Code-Tags nehmen? Und Für Exceeption bzw Fehlermeldungen auch. Hab es jetzt hier korrigiert. Bitte achte in Zukunft darauf.

Gruss

Coffeebean

16.835 Beiträge seit 2008
vor 7 Jahren

Wenn ich den PC herunterfahre, dann dauert es eine Minute, bis OpenRemoteBaseKey eine IOException wirft!

Wie gesagt.. schau in den Quellcode von .NET, wenn Du es nicht nachvollziehen kannst.
Da wird sicherlich auch der Ursprung der IOException sein.
Dann musste Dich selbst nicht am Kopf kratzen und Fragen, wieso das so ist....

Aus solchen Gründen gibt es Open Source: damit man es selbst versteht.