Das nächste Entwicklertreffen findet Anfang Mai in Münster statt - weitere Infos bzw. zur Anmeldung!

WMI Prozess Abfrage

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
littlea1991
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 27
Registriert: Fr, 03. Aug 2018 7:17

WMI Prozess Abfrage

Beitrag von littlea1991 » Do, 31. Jan 2019 12:19

Hallo Liebe Forenmitglieder,

ich würde gerne über WMI herausfinden ob ein Prozess noch läuft oder nicht. (Wenns geht über Remote Login) In der Powershell gibt es die Abfrage:
"Get-WmiObject -query "SELECT * from Win_32_Process Where Name = 'Prozessname' " Wenn ich das allerdings über Xbase aufrufe, dann bekomme ich immer ein PropertyName nicht gefunden zurück. So sieht mein Code dafür aus:

Code: Alles auswählen

LOCAL wmi := GetObject(,"WbemScripting.SWbemLocator" + pc +"\root\cimv2")
oWmiLocator   := GetObject( ,"WbemScripting.SWbemLocator" )
oWmiServices  := oWmiLocator:ConnectServer( "Localhost", "Root\CIMv2" )
col := oWmiServices:ExecQuery("Select * from Win32_Process where Name = 'Prozessname'",,48)

result := wmi:getProperty("Name")

Rufe ich das WmiObject falsch auf? Ich würde nur gerne Wissen ob der Prozess noch läuft oder nicht, in der Powershell liefert die Abfrage nichts zurück wenn der Prozess auch nicht läuft auf dem Rechner.

Vielen Dank im Voraus für eure Hilfe

Ali

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11765
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: WMI Prozess Abfrage

Beitrag von AUGE_OHR » Do, 31. Jan 2019 12:47

littlea1991 hat geschrieben:
Do, 31. Jan 2019 12:19

Code: Alles auswählen

LOCAL wmi := GetObject(,"WbemScripting.SWbemLocator" + pc +"\root\cimv2")
oWmiLocator   := GetObject( ,"WbemScripting.SWbemLocator" )
oWmiServices  := oWmiLocator:ConnectServer( "Localhost", "Root\CIMv2" )
col := oWmiServices:ExecQuery("Select * from Win32_Process where Name = 'Prozessname'",,48)

result := wmi:getProperty("Name")
Rufe ich das WmiObject falsch auf?
o:ExecQuery() gibt dir "so" nicht das Ergebinis ...

man kann ein Array nehmen was man so "füllt"

Code: Alles auswählen

   colItems       := objWMIServices:ExecQuery("select * from Win32_Process",,48)
   // Codeblock
   bCollBlock     := {|oService,n| AADD(aItem,{ n,;
         oService:getProperty("Name"),;
         ...
         oService:getProperty("WriteTransferCount") })}
   // s.h. Help File
   ComEvalCollection(colItems, bCollBlock )
   // jetzt ist das Array gefüllt
   IF LEN(aItem) > 0
p.s. unbedingt AUFRÄUMEN wenn man ActiveX / COM nutzt :!:
gruss by OHR
Jimmy

littlea1991
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 27
Registriert: Fr, 03. Aug 2018 7:17

Re: WMI Prozess Abfrage

Beitrag von littlea1991 » Do, 31. Jan 2019 14:23

Ah Danke für den Tipp, so funktioniert es jetzt :D ich würde gerne für mein Programm eine Remote Prozessüberwachung einführen über WMI. Es beendet sich bereits selbstständig falls ein Xbase Error Auftritt und jetzt frage ich über ein Zusätzliches Verwaltungsprogramm den Status immer wieder über WMI ab. Nützlich wäre es noch wenn man es darüber gleich neustarten könnte (Vielleicht über ein Remote Skript aufruf)
Vielen Dank für deine Hilfe!

Ali

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14728
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: WMI Prozess Abfrage

Beitrag von brandelh » Do, 31. Jan 2019 15:13

Ein Programm nach Absturz automatisch neu starten, haben wir mit CMD Dateien gemacht (ist schon ein paar Jahre her).
Dabei muss man nur die Möglichkeit einräumen, dass der Anwender tatsächlich beenden will und die CMD statt der EXE starten ;-)

Ein Beispiel dazu wird in "ErrorLevel() - Return-Code für eine Xbase++ Anwendung bestimmen " gezeigt, wobei der Grundsatz so aussieht ( // Kommentare sind nur für hier) :

MeinExeStarten.CMD

Code: Alles auswählen

@echo off
cls
:ProgrammStart
MeineExe.EXE    // Reguläres Ende ist ERRORLEVEL = 0, ErrorSys setzt bei Fehler ERRORLEVEL = 1, höhere Werte können eigene Zustände und Reaktionen festlegen.
IF ERRORLEVEL 2 GOTO ... // Vergleich ist Größer oder Gleich ... hier würden alle Benutzerdefinierten landen
IF ERRORLEVEL 1 GOTO FehlerNeustart
GOTO KeinFehlerNeustart *** ODER *** GOTO Exit 

:FehlerNeustart
   ECHO Fehler sind aufgetreten, EXE wird neu gestartet // Aufräumen ?
   GOTO ProgrammStart

:KeinFehlerNeustart
   ECHO Programm darf nicht beendet werden und startet neu 
   GOTO ProgrammStart

:Exit 
   ECHO Xbase++ Anwendung ist beendet 
   REM *EOF* 
Gruß
Hubert

littlea1991
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 27
Registriert: Fr, 03. Aug 2018 7:17

Re: WMI Prozess Abfrage

Beitrag von littlea1991 » Fr, 01. Feb 2019 7:29

Genau so etwas ähnliches habe ich bereits auch vor, mit dem Errorblock wird eine Routine aufgerufen und mit einem QUIT das Programm beendet, das Skript für das Neustarten, läuft es dann Lokal auf dem Rechner?
Vielen Dank für eure Hilfe!

Ali

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14728
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: WMI Prozess Abfrage

Beitrag von brandelh » Fr, 01. Feb 2019 7:53

ja klar, alles auf diesem Rechner.
Früher haben wir so Updates verteilt, wenn die EXE auf dem Server eine neuere Datei fand (noch zu Clipper Zeiten)
Unter DOS haben wir so auch ein Menü System implementiert, das keinen zusätzlichen RAM gefressen hat.
Gruß
Hubert

Antworten