PRTG: Prüfen ob Task auf Server ausgeführt wird
Hallo zusammen,
ich möchte per Powershell prüfen, ob ein bestimmtes Programm mit einer bestimmten Commandline auf dem im PRTG hinterlegten Server ausgeführt wird.
Leider läuft das Skript immer in die "else"-Verzweigung.
Meine Vermutung ist, dass es nicht auf dem richtigen Host ausgeführt wird.
Da ich kein Powershell/PRTG-Experte bin, wie kann ich am besten debuggen?
Vielen Dank schon im Voraus
ich möchte per Powershell prüfen, ob ein bestimmtes Programm mit einer bestimmten Commandline auf dem im PRTG hinterlegten Server ausgeführt wird.
Leider läuft das Skript immer in die "else"-Verzweigung.
Meine Vermutung ist, dass es nicht auf dem richtigen Host ausgeführt wird.
Da ich kein Powershell/PRTG-Experte bin, wie kann ich am besten debuggen?
param (
[string]$environment= "Wert1",
[string]$executable= "Wert2",
[string]$instance= "Wert3"
)
$RetVal = Get-CimInstance win32_Process | select Name,ProcessId,Commandline | Where-Object {($_.Name -eq $executable) -and ($_.CommandLine -Like "*$environment*") -and ($_.CommandLine -Like "*$instance*")} | ft -Auto -Wrap
if($RetVal){
write-output '1:Funktioniert?'
}
else{
#write-output "0:$executable $environment $instance 1"
echo "2:Dienst ist nicht erreichbar Server: $Host"
}
Vielen Dank schon im Voraus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Dani am 31.01.2023 um 19:43:25 Uhr
Formatierung des Codes hinzugefügt.
Content-ID: 5752630461
Url: https://administrator.de/forum/prtg-pruefen-ob-task-auf-server-ausgefuehrt-wird-5752630461.html
Ausgedruckt am: 13.03.2025 um 06:03 Uhr
9 Kommentare
Neuester Kommentar
Hallo,
zunächst muss das Skript laufen.
dazu kannst Du es etwas modifizieren:
Das kannst Du dann z.B: im powershell ISE auf dem PC, auf dem das später laufen soll ausführen. Da siehst Du eventuelle Fehlermeldungen.
Dann schaust Du, ob das Skript im richtigen Benutzerkontext läuft. Bei PRTG kann man auswählen, ob das Skript unter dem Konto des Probe-Dienstes oder unter dem Windows-Anmeldekonto des übergeordenten Gerätes laufen soll.
Falls das nicht auf dem "Gerät der Probe" laufen soll, muss man dann noch testen, ob der Remote-Aufruf klappt.
Vermutlich aber muss die letzte Zeile lauten:
wobei ich das lieber in XML machen würde:
Grüße
lcer
zunächst muss das Skript laufen.
dazu kannst Du es etwas modifizieren:
$environment= "Wert1"
$executable= "Wert2"
$instance= "Wert3"
$RetVal = Get-CimInstance win32_Process | select Name,ProcessId,Commandline | Where-Object {($_.Name -eq $executable) -and ($_.CommandLine -Like "*$environment*") -and ($_.CommandLine -Like "*$instance*")} | ft -Auto -Wrap
if($RetVal){
write-output '1:Funktioniert?'
}
else{
#write-output "0:$executable $environment $instance 1"
echo "2:Dienst ist nicht erreichbar Server: $Host"
}
Dann schaust Du, ob das Skript im richtigen Benutzerkontext läuft. Bei PRTG kann man auswählen, ob das Skript unter dem Konto des Probe-Dienstes oder unter dem Windows-Anmeldekonto des übergeordenten Gerätes laufen soll.
Falls das nicht auf dem "Gerät der Probe" laufen soll, muss man dann noch testen, ob der Remote-Aufruf klappt.
Vermutlich aber muss die letzte Zeile lauten:
write-output "0:$($executable) $($environment) $($instance) 1"
wobei ich das lieber in XML machen würde:
$StringWriter = New-Object System.IO.StringWriter;
$xmlWriter = New-Object System.Xml.XmlTextWriter $StringWriter
$xmlWriter.Formatting = [System.Xml.Formatting]::Indented
$xmlWriter.Indentation = 2;
$xmlWriter.WriteStartElement("prtg")
$xmlWriter.WriteStartElement("result")
$xmlWriter.WriteElementString("channel","Kanal1")
$xmlWriter.WriteElementString("value",$String1);
$xmlWriter.WriteEndElement()
$xmlWriter.WriteStartElement("result")
$xmlWriter.WriteElementString("channel","Kanal2")
$xmlWriter.WriteElementString("value",$String2);
$xmlWriter.WriteEndElement()
$xmlWriter.WriteEndElement()
Write-Output $StringWriter.ToString();
Grüße
lcer

Es muss doch aber einen Parameter geben mit dem ich den Hostname abfragen kann oder?
Wenn auf dem Gerät selbst ausgeführt braucht man die extra Angabe des Computernamens nicht, den bekommst du aber jederzeit hiermit:$env:COMPUTERNAME

Dann musst du für das Skript in PRTG einen zusätzlichen Parameter deklarieren in den du als Wert "%host" einträgst.
Im Skript definierst du dann diesen Parameter zusätzlich im Kopf, und nutzt dann die vergebene Variable.
Hast Du den Sensor im GUI auf dem "Gerät der Probe" angelegt, oder auf einem anderen Gerät.
Grüße
lcer
@lcer00
Sobald Geräte aus einer Workgroup angesprochen werden, geht das so nicht mehr. Das wird auch so der technische Support von PRTG sagen.
@nik.taylor90
a) das Script um das cmdlet Invoke-Command zu erweitern
b) im Script die notwendigen Credentials sicher zu hinterlegen, wenn nicht alle beteiligen Server/Geräte in der Domäne sind.
Unabhängig davon gibt es doch für EXEXML Sensoren ein paar recht gute Skripte im Internet. Einfach ein bisschen stöbern, ausprobieren und lernen.
Gruß,
Dani
Dann schaust Du, ob das Skript im richtigen Benutzerkontext läuft. Bei PRTG kann man auswählen, ob das Skript unter dem Konto des Probe-Dienstes oder unter dem Windows-Anmeldekonto des übergeordenten Gerätes laufen soll.
Das kann funktionieren unter zwei Bedingungen:- Alle beteiligten Server sind in der Domäne.
- Es kommt ein Service Account für Sensoren zum Einsatz, welcher auch au den beteiligen Server berechtigt ist.
Sobald Geräte aus einer Workgroup angesprochen werden, geht das so nicht mehr. Das wird auch so der technische Support von PRTG sagen.
@nik.taylor90
Der Benutzerkontext ist nun so angepasst, dass die Berechtigungen passen.
Ich hoffe du hast nicht den Domänen-Administrator oder den Bulitin\Administrator für den betroffenen Server eingetragen. Ersterer hat da nichts verloren. Letzteres kann man temporär tun um was zu testen.Es muss doch aber einen Parameter geben mit dem ich den Hostname abfragen kann oder?
Du wirst meiner Meinung nach nicht drum kommen,a) das Script um das cmdlet Invoke-Command zu erweitern
b) im Script die notwendigen Credentials sicher zu hinterlegen, wenn nicht alle beteiligen Server/Geräte in der Domäne sind.
Unabhängig davon gibt es doch für EXEXML Sensoren ein paar recht gute Skripte im Internet. Einfach ein bisschen stöbern, ausprobieren und lernen.
Gruß,
Dani