Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Remote CPU load per WMI auslesen


uranop - Fr 10.07.09 09:27
Titel: Remote CPU load per WMI auslesen
Hallo Jungs,

ich habe mal ein Anliegen : )
Ich weiss das es das Thema hier und da schon mal gab,
mir gehts aber nicht darum wie, sondern eher warum nicht : P

AAAlso ...

Ich möchte per WMI die CPU last rausbekommen. Das funktioniert einwandfrei .

root\cimv2
Win32_Processor
LoadPercentage

Im Test Tool von Magenta Systems ( http://www.magsys.co.uk/delphi/ ) kann ich einwandfrei alle Sachen auslesen die wich will. Im ganzen Firmennetz kein Problem.

Möchte ich nun aber die Load selber auslesen via


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
function GetMWIinfo(wmiHost, wmiClass, wmiProperty : string):string;
var  // These are all needed for the WMI querying process
  Locator:  ISWbemLocator;
  Services: ISWbemServices;
  SObject:  ISWbemObject;
  ObjSet:   ISWbemObjectSet;
  SProp:    ISWbemProperty;
  Enum:     IEnumVariant;
  Value:    Cardinal;
  TempObj:  OleVariant;
  SN: string;
begin
  try
  Locator := CoSWbemLocator.Create;  // Create the Location object
  // Connect to the WMI service, with the root\cimv2 namespace
   Services :=  Locator.ConnectServer(wmiHost, 'root\cimv2''''''',''0nil);
  ObjSet := Services.ExecQuery('SELECT * FROM '+wmiClass+'''WQL',
    wbemFlagReturnImmediately and wbemFlagForwardOnly , nil);
  Enum :=  (ObjSet._NewEnum) as IEnumVariant;
  while (Enum.Next(1, TempObj, Value) = S_OK) do
  begin
    SObject := IUnknown(tempObj) as ISWBemObject;
    SProp := SObject.Properties_.Item(wmiProperty, 0);
    if VarIsNull(SProp.Get_Value) then
      result := ''
    else
    begin
      SN := SProp.Get_Value;
      result :=  SN;
    end;
  end;
  except // Trap any exceptions (Not having WMI installed will cause one!)
   on exception do
    result := '';
   end;
end;

Labelcpu.Caption := GetWMIinfo('Win32_Processor','LoadPercentage');


friert mir das ganze Programm ein.
Ich weiss, das es noch was git mit PerfFormattedData_Perf_Processor , oder so, aber das hat den gleichen Effekt.

Hat da wer ne Ahnung warum das so sein könnte ?

Moderiert von user profile iconNarses: Titel erweitert.


BenBE - Fr 10.07.09 09:39

Mögliche Ursachen:
Du hast dich auf dem Remote-System nicht ausreichend oder inkorrekt authentifiziert und bekommst daher keinen Zugriff.

Aber BTW: Du hast einen Buchstabendreher in deinem Funktionsnamen. es heißt WMI und nicht MWI ...


uranop - Fr 10.07.09 09:49

mmh, das Programm fiert ja selbst lokal ein ...
und remote habe ich domainadmin Rechte also kein Thema

der Buchstabendreher macht hier jetzt nichts, da die letzte zeile des codes nur eben per Hand hingeschrieben wurde.
Im eigentlichen Prog steht zwar auch mwi aber 2 mal : P


BenBE - Fr 10.07.09 10:04

Hast Du zeilenweise mal durchdebuggt und geschaut, in welcher Zeile er hängen bleibt? Das könnte u.U. schon einen Hinweis auf das Problem geben.

Achte zudem mal darauf, was GetLastError nach jedem API-Aufruf meldet.


uranop - Fr 10.07.09 11:05

Hi,
ich weiss nun wo ran es gelegen hat...

Ich habe zeitgleich einmal alle laufenden Prozesse und die CPU last abgefragt,
das ganze im 1000ms Takt ... das war wohl zu schnell ...
Ich habe nun alles auf 5000ms reingestellt und es updatet sich alles normal.
is zwar etwas lahm aber naja