none
Abfragen ob ein bestimmtes Script auf einem Remote-Rechner läuft RRS feed

  • Frage

  • Hallo Zusammen,

    Ich versuche nun schon einige Zeit herauszufinden, wie ich Abfragen kann, ob bzw. ein Skript mit dem Namen "ps_test_01.ps1" auf einem Remote-Computer ausgeführt wird.

    Leider bin ich bis jetzt nur soweit gekommen mit WMI oder Get-Process abzufragen, ob überhaupt der Prozess powershell.exe läuft.

    Wie ließe sich solch eine Abfrage auf ein namentliches Skript durchführen?

    Vielen Dank,

    Gruß
    Christoph

    Montag, 25. Mai 2015 11:01

Antworten

  • Da bist schon auf der richtigen Spur. Unter bestimmten Voraussetzungen kannst du über das Prozess-Objekt dessen Kommandozeile abfragen, in der sich wiederum der Name des aufgerufenen Scripts befindet.

    z.b. so:

    $scriptname = "meinScriptName"
    $remotePc = "RemoteName"
    Get-WMIObject -Class Win32_Process -Filter "Name='PowerShell.EXE'" -ComputerName $remotePc  | select commandline | ForEach-Object { 
    	if ($_ -like "*$scriptname*") { write-host "Script $scriptname runs on $remotePc." }
    }
     

    Damit das funktioniert, müssen diverse Bedingungen erfüllt sein. Allen voran: das Script muß mit dem -file Parameter gestartet worden sein. Darüber hinaus hängt remote WMI u.a. von Windows Firewall, DCOM settings und der UAC ab. Je größer dein Netz und die Anzahl der abzufragenden Server oder Clients, desto wahrscheinlicher das du hier auf ein Problem stößt.
    Daher bin ich eher ein Freund davon, das zu überwachende Scripts sich aktiv melden. Also z.b. in der einfachsten Variante lokal oder besser auf einem zentralen Share eine temporäre Statusdatei anlegen. In so eine Datei man dann u.U. auch gleich ein paar nützliche Infos schreiben. Das hat vor allem bei vielen Clients auch noch Geschwindigkeitvorteile.

    Grüße, Denniver



    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v3: Link
    (Schneller, besser + einfacher scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.




    Montag, 25. Mai 2015 12:41
    Moderator
  • Hallo Denniver.

    Vielen Dank für deine Hilfe.

    Leider hat dein Codeschnipsel für meinen Anwendungsfall nicht helfen können.

    Ich bin nun auch dazu übergegangen, dass sich das Script aktiv melden.
    Die Variante mit dem Schreiben einer Statusdatei hat mich allerdings nicht so sehr angesprochen.
    Ich habe nun die, für mich funktionierende, Lösung gefunden. Ich erstelle einen EventLog, in welchen ich schreibe bzw. welchen ich abfragen kann - lokal oder remote.

    Einrichten eines neuen EventLogs:

    New-EventLog -Logname ScriptEvents -Source ScriptSource

    Eintrag in EventLog schreiben:

    Write-EventLog -ComputerName "NameDesComputers.domain.tld" -LogName ScriptEvents -Source "ScriptSource" -EventId "500" -Message "Script wurde ausgeführt"

    Abrufen des letzten Eintrags:

    $NewestEvent = Get-EventLog -ComputerName "NameDesComputers.domain.tld" -LogName ScriptEvents -Newest "1" -InstanceId "500"

    Ermitteln, ob das Script vor kurzer Zeit ausgeführt wurde:

    $TimeBetween = New-TimeSpan $NewestEvent.TimeWritten $(Get-Date)

    Wenn das Script vor einer Minute ausgeführt wurde

    if ($TimeBetween.Minutes -gt "1")
    {
        Do something
    	$ScriptAusgeführt = $true
    }

    Gruß
    Christoph

     
    Donnerstag, 28. Mai 2015 18:30

Alle Antworten

  • Da bist schon auf der richtigen Spur. Unter bestimmten Voraussetzungen kannst du über das Prozess-Objekt dessen Kommandozeile abfragen, in der sich wiederum der Name des aufgerufenen Scripts befindet.

    z.b. so:

    $scriptname = "meinScriptName"
    $remotePc = "RemoteName"
    Get-WMIObject -Class Win32_Process -Filter "Name='PowerShell.EXE'" -ComputerName $remotePc  | select commandline | ForEach-Object { 
    	if ($_ -like "*$scriptname*") { write-host "Script $scriptname runs on $remotePc." }
    }
     

    Damit das funktioniert, müssen diverse Bedingungen erfüllt sein. Allen voran: das Script muß mit dem -file Parameter gestartet worden sein. Darüber hinaus hängt remote WMI u.a. von Windows Firewall, DCOM settings und der UAC ab. Je größer dein Netz und die Anzahl der abzufragenden Server oder Clients, desto wahrscheinlicher das du hier auf ein Problem stößt.
    Daher bin ich eher ein Freund davon, das zu überwachende Scripts sich aktiv melden. Also z.b. in der einfachsten Variante lokal oder besser auf einem zentralen Share eine temporäre Statusdatei anlegen. In so eine Datei man dann u.U. auch gleich ein paar nützliche Infos schreiben. Das hat vor allem bei vielen Clients auch noch Geschwindigkeitvorteile.

    Grüße, Denniver



    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v3: Link
    (Schneller, besser + einfacher scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.




    Montag, 25. Mai 2015 12:41
    Moderator
  • Hallo Denniver.

    Vielen Dank für deine Hilfe.

    Leider hat dein Codeschnipsel für meinen Anwendungsfall nicht helfen können.

    Ich bin nun auch dazu übergegangen, dass sich das Script aktiv melden.
    Die Variante mit dem Schreiben einer Statusdatei hat mich allerdings nicht so sehr angesprochen.
    Ich habe nun die, für mich funktionierende, Lösung gefunden. Ich erstelle einen EventLog, in welchen ich schreibe bzw. welchen ich abfragen kann - lokal oder remote.

    Einrichten eines neuen EventLogs:

    New-EventLog -Logname ScriptEvents -Source ScriptSource

    Eintrag in EventLog schreiben:

    Write-EventLog -ComputerName "NameDesComputers.domain.tld" -LogName ScriptEvents -Source "ScriptSource" -EventId "500" -Message "Script wurde ausgeführt"

    Abrufen des letzten Eintrags:

    $NewestEvent = Get-EventLog -ComputerName "NameDesComputers.domain.tld" -LogName ScriptEvents -Newest "1" -InstanceId "500"

    Ermitteln, ob das Script vor kurzer Zeit ausgeführt wurde:

    $TimeBetween = New-TimeSpan $NewestEvent.TimeWritten $(Get-Date)

    Wenn das Script vor einer Minute ausgeführt wurde

    if ($TimeBetween.Minutes -gt "1")
    {
        Do something
    	$ScriptAusgeführt = $true
    }

    Gruß
    Christoph

     
    Donnerstag, 28. Mai 2015 18:30