nik.taylor90
Goto Top

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?
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 face-smile
Kommentar vom Moderator Dani am Jan 31, 2023 um 18:43:25 Uhr
Formatierung des Codes hinzugefügt.

Content-Key: 5752630461

Url: https://administrator.de/contentid/5752630461

Printed on: May 2, 2024 at 18:05 o'clock

Member: lcer00
lcer00 Jan 31, 2023 at 08:46:26 (UTC)
Goto Top
Hallo,

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"  
}
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:
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
Member: nik.taylor90
nik.taylor90 Jan 31, 2023 updated at 09:02:02 (UTC)
Goto Top
Hi Icer,
vielen Dank für die schnelle Antwort.
Das Skript ist auf dem Zielhost lauffähig (Test per Powershell ISE).
Der Benutzerkontext ist nun so angepasst, dass die Berechtigungen passen.
Gebe ich den Servernamen händisch mit an funktioniert es.

Get-CimInstance -Class win32_Process -ComputerName servername

Es muss doch aber einen Parameter geben mit dem ich den Hostname abfragen kann oder?

Achja und die Varialbe $host liefert nur folgendes zurück: System.Management.Automation.Internal.Host.InternalHost

VG Dominik
Member: lcer00
lcer00 Jan 31, 2023 at 09:01:14 (UTC)
Goto Top
Läuft das auf dem Gerät der Probe oder anderswo?
Mitglied: 5175293307
5175293307 Jan 31, 2023 updated at 09:05:41 (UTC)
Goto Top
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
Member: nik.taylor90
nik.taylor90 Jan 31, 2023 at 09:05:54 (UTC)
Goto Top
Wie finde ich das heraus?
Entschuldige bitte meine dummen Fragen, ich habe zuvor noch nie etwas mit PRTG zu tun gehabt.
Member: nik.taylor90
nik.taylor90 Jan 31, 2023 at 09:08:41 (UTC)
Goto Top
$env:COMPUTERNAME
Das läuft momentan auf dem Monitoring-Server
Mitglied: 5175293307
5175293307 Jan 31, 2023 updated at 09:17:13 (UTC)
Goto Top
Zitat von @nik.taylor90:
Das läuft momentan auf dem Monitoring-Server

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.
Member: lcer00
lcer00 Jan 31, 2023 at 09:18:39 (UTC)
Goto Top
Zitat von @lcer00:

Läuft das auf dem Gerät der Probe oder anderswo?

Hast Du den Sensor im GUI auf dem "Gerät der Probe" angelegt, oder auf einem anderen Gerät.

Grüße

lcer
Member: Dani
Dani Jan 31, 2023 at 18:50:33 (UTC)
Goto Top
@lcer00
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