strubartacus
Goto Top

Windows remote herunterfahren lassen durch eine SPS

Hallo zusammen

Ich habe folgendes Problem zu lösen: Und zwar soll ein Touch-PC, auf welchem Windows 7 läuft, remote durch eine SPS gestartet sowie anschliessend wieder heruntergefahren werden. Das starten erfolgt mittels WOL und ist kein Problem. Für das Herunterfahren fand ich bis jetzt aber keine Lösung. Hätte jemand evtl. eine Idee? Oder gibt es evtl. ein Tool, welches ein Windows durch ein MagicPaket auch herunterfahren lässt?

Gruss

Content-ID: 288517

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

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

beidermachtvongreyscull
beidermachtvongreyscull 16.11.2015 um 11:22:50 Uhr
Goto Top
Welche Möglichkeiten hat denn Deine SPS?
Was für ein Touch-PC ist es?
beidermachtvongreyscull
beidermachtvongreyscull 16.11.2015 aktualisiert um 11:29:04 Uhr
Goto Top
Wenn es sich bei dem Touch-PC um einen richtigen PC in einem normalen Gehäuse handelt, wäre vielleicht solch eine Lösung interessant:
https://tools-and-more.com/Central/Produkte/Hardware/Watch-My-PC/

Diese müsste dann parallel zum Einschalter gekoppelt werden und Windows so eingestellt werden, dass beim Betätigen des Ein/Aus-Schalters Windows direkt herunterfährt. Wäre zu machen denke ich.

Und da der Watchdog ein Taktsignal des Rechners überwacht, muss Deine SPS in die Leitung eingeschleift werden und einfach nur den Kreis öffnen.

Ziemlich viel MacGyverismus, aber vielleicht hilfts als Anregung.
STRUBartacus
STRUBartacus 16.11.2015 aktualisiert um 11:29:55 Uhr
Goto Top
Gut dass du fragst, die SPS wäre in der Lage -neben WOL Paketen- auch UDP-Pakete zu senden. Falls dies weiterhilft.

Der Typ des Touch-PCs habe ich leider grad nicht zur Hand.
beidermachtvongreyscull
beidermachtvongreyscull 16.11.2015 um 11:36:08 Uhr
Goto Top
Normalerweise ist es nicht möglich (nach meiner Erfahrung), einen Rechner über Netzwerk davon zu überzeugen, runter zu fahren.
Dazu muss auf dem Rechner die passende berechtigte Software laufen und der Gegenspieler diese meist durch Authentifizierung korrekt ansprechen.

WOL zum Aufwecken ist klar. Aber ein Magic Paket zum Shutdown gibt's so nicht.
beidermachtvongreyscull
beidermachtvongreyscull 16.11.2015 aktualisiert um 12:27:16 Uhr
Goto Top
Schau mal:
http://www.neets.dk/support/FAQ/How-to-program-neets-control-systems/Tu ...

Das dürfte es sein.

Diese Software scheint nämlich Magic Packets auch zum Shutdown interpretieren zu können.
wiesi200
wiesi200 16.11.2015 um 11:43:39 Uhr
Goto Top
Hallo,

Darf ich mal grob raten?
Der Touch PC ist Bestandteil einer Industrieanlage und dient zur HMI?
Wenn die Anlage ausgeschaltet wird ist irgendwann der Strom weg, der PC fährt nicht sauber runter?
Deshalb gibt es ne Meldung beim Starten?

Für so ein Problem ist die Gängige Praxis eine kleine USV im Schaltschrank über die dann der PC vernünftig runter fährt.
STRUBartacus
STRUBartacus 16.11.2015 aktualisiert um 12:43:09 Uhr
Goto Top
Zitat von @beidermachtvongreyscull:

Schau mal:
http://www.neets.dk/support/FAQ/How-to-program-neets-control-systems/Tu ...

Das dürfte es sein.

Diese Software scheint nämlich Magic Packets auch zum Shutdown interpretieren zu können.

Genau nach so etwas hab ich mich in google schon halb wund gesucht. Werde ich gleich mal abchecken. VIELEN DANK erstmal!
STRUBartacus
STRUBartacus 16.11.2015 aktualisiert um 12:34:17 Uhr
Goto Top
Zitat von @wiesi200:

Hallo,

Darf ich mal grob raten?
Der Touch PC ist Bestandteil einer Industrieanlage und dient zur HMI?
Wenn die Anlage ausgeschaltet wird ist irgendwann der Strom weg, der PC fährt nicht sauber runter?
Deshalb gibt es ne Meldung beim Starten?

Für so ein Problem ist die Gängige Praxis eine kleine USV im Schaltschrank über die dann der PC vernünftig runter fährt.

Nein nicht ganz. Es handelt sich hierbei um eine <buzzwords>smart, green</buzzwords> Klimaregelung eines Sitzungszimmers, bei welchem die Visualierung nur bei Belegung des Raumes in Betrieb sein soll.
122990
122990 16.11.2015 aktualisiert um 12:38:34 Uhr
Goto Top
Moin.
Ein kleines selbstprogrammiertes Programm (c#/Powershell/ etc.) das mit einem TCP-Listener auf einem TCP-Port des Windows7 lauscht und bei dem entsprechenden Paket durch die SPS den Shutdown auslöst ist schnell geschrieben.

Gruß grexit
STRUBartacus
STRUBartacus 16.11.2015 um 12:44:31 Uhr
Goto Top
Zitat von @122990:

Moin.
Ein kleines selbstprogrammiertes Programm (c#/Powershell/ etc.) das mit einem TCP-Listener auf einem TCP-Port des Windows7 lauscht und bei dem entsprechenden Paket durch die SPS den Shutdown auslöst ist schnell geschrieben.

Gruß grexit

Klingt auch gut. Hättest du mir evtl. einen Codeschnippsel? Bin eher bash-versiert als Powershell.
122990
122990 16.11.2015 um 12:45:11 Uhr
Goto Top
Zitat von @STRUBartacus:
Klingt auch gut. Hättest du mir evtl. einen Codeschnippsel? Bin eher bash-versiert als Powershell.
Liefere ich später noch nach ...
STRUBartacus
STRUBartacus 16.11.2015 um 12:51:59 Uhr
Goto Top
Zitat von @122990:

Zitat von @STRUBartacus:
Klingt auch gut. Hättest du mir evtl. einen Codeschnippsel? Bin eher bash-versiert als Powershell.
Liefere ich später noch nach ...

TOP!
colinardo
Lösung colinardo 16.11.2015 aktualisiert um 14:23:35 Uhr
Goto Top
Zitat von @122990:
Moin.
Ein kleines selbstprogrammiertes Programm (c#/Powershell/ etc.) das mit einem TCP-Listener auf einem TCP-Port des Windows7 lauscht und bei dem entsprechenden Paket durch die SPS den Shutdown auslöst ist schnell geschrieben.
Hallo zusammen,
wenn ich übernehmen darf face-wink

Beispiel für ein Client-Server mit TCP-Sockets und Powershell

Server PS-Skript
$ip = '0.0.0.0'  
$port = 9999
$server = New-Object System.Net.Sockets.TcpListener($ip,$port)
$server.Start()
while($true){
    write-host "Waiting for Connection..."  
    [System.Net.Sockets.TcpClient]$client = $server.AcceptTcpClient()
    write-host "$($client.Client.RemoteEndPoint) connected."  
    [byte[]]$buffer = (New-Object byte 256)
    $stream = $client.GetStream()
    while(($i = $stream.Read($buffer,0,$buffer.length)) -ne 0){
        $data = [System.Text.Encoding]::ASCII.GetString($buffer,0,$i)
        if ($data -eq 'SHUTDOWN SYSTEM'){  
            write-host "Remote-Shutdown trigger received, shutting down system!"  
            # cleanup
            $client.Close();$server.Stop()
            # shutdown system
            shutdown /s /f /t 0
            return
        }
    }
}
Zum Testen ein TCP-Client der den Shutdown Triggertext "SHUTDOWN SYSTEM" an das Remote-System sendet (IP und Port anpassen):
$client = New-Object System.Net.Sockets.TcpClient
$client.Connect("192.168.1.25",9999)  
$stream = $client.GetStream()
$data = [System.Text.Encoding]::ASCII.GetBytes("SHUTDOWN SYSTEM")  
$stream.Write($data,0,$data.length)
$client.Close()

Im Beispiel wird anhand eines bestimmten Strings welcher an das System gesendet wird entschieden ob das System heruntergefahren werden soll. Dass ganze ist jetzt natürlich nur ein ganz simples Beispiel ohne weitere Sicherheitsmaßnahmen etc. pp., aber das lässt sich ja nach Bedarf erweitern z.B. das nur bestimmte IPs das System herunterfahren dürfen oder man sich authentifizieren muss face-smile

Ob man das nun via Powershell oder PHP oder mit einer anderen Sprache macht ist eigentlich herzlich egal.
Via TCP einen String senden können heutzutage eigentlich fast alle Systeme.

Grüße Uwe

Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
122990
Lösung 122990 16.11.2015 aktualisiert um 14:23:36 Uhr
Goto Top
@colinardo Wow, danke für die Übernahme face-big-smile

Und nicht die Firewall-Freigabe auf dem Windows 7 für den verwendeten Server-Port vergessen face-wink

Gruß grexit
STRUBartacus
STRUBartacus 16.11.2015 um 14:23:54 Uhr
Goto Top
Besten Dank euch allen!
STRUBartacus
STRUBartacus 17.11.2015 um 17:06:20 Uhr
Goto Top
Leider erhalte ich folgende Fehlermeldung beim ausführen:

Waiting for Connection...
Ausnahme beim Aufrufen von "AcceptTcpClient" mit 0 Argument(en):  "Es wird nicht gelauscht. Rufen Sie die Start()-Methode auf, bevor Sie diese Methode aufrufen."  
In C:\Users\Administrator\Desktop\shutdown-server.ps1:7 Zeichen:5
+     [System.Net.Sockets.TcpClient]$client = $server.AcceptTcpClient()
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) , MethodInvocationException
    + FullyQualifiedErrorId : InvalidOperationException
 
 connected.
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\Users\Administrator\Desktop\shutdown-server.ps1:10 Zeichen:5
+     $stream = $client.GetStream()
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\Users\Administrator\Desktop\shutdown-server.ps1:11 Zeichen:12
+     while(($i = $stream.Read($buffer,0,$buffer.length)) -ne 0){
+            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull


Was ist da noch zu ergänzen?
122990
122990 17.11.2015 um 17:10:35 Uhr
Goto Top
Leider erhalte ich folgende Fehlermeldung beim ausführen:
hmm wahrscheinlich hat dein User nicht genügend Rechte zum öffnen von Ports, geht hier problemlos ...

Gruß grexit
STRUBartacus
STRUBartacus 17.11.2015 um 17:17:14 Uhr
Goto Top
Liegt tatsächlich am Benutzerkonto, mit einem Domainadmin-User funktioniert es nicht, auf meinem PC hingegen schon. Vielen Dank