Windows: Wake on LAN über VPN

Wake on LAN funktioniert über’s Internet nicht, das gilt auch für VPN. Abhilfe kann man sich schaffen, in dem von einem (Dauer-)laufenden System aus z.B. der Arbeitsplatz gestartet wird.

Damit man nicht extra beispielsweise aus dem Web-Interface einer Securepoint UTM, einem bereits laufenden PC oder einem Server aus der eigentliche Ziel-Rechner gestartet werden muss, kann man sich relativ leicht behelfen. Vor Jahren habe ich eine Lösung für einen Kunden gebaut, die bis heute läuft und in der Zwischenzeit auch bei anderen Kunden Anwendung findet.

Der Ablauf ist dabei simple:

Auf dem sowieso immer laufenden Server wird ein Apache (oder anderer Webserver) betrieben. Mittels (automatischen) Aufruf eines Skripts wird der zu startende Computer per WoL eingeschaltet.

Am Bespiel von Apache (die Variante von Apache Lounge) sieht das so aus:

Unter „C:\Apache24\cgi-bin“ wird folgendes Batch-Skript und die wol.exe von Gammadyne hinterlegt:

@echo off

cd "C:\Apache24\cgi-bin"

REM echo %date% %time% - hello world >> test.txt

wol.exe <MAC-Adresse>

echo Content-type: text/plain

echo.

Wenn man erstmal nur testen möchte, kann man erstmal nur ein Protokoll schreiben lassen und die Zeile mit „wol….“ auskommentieren.

Ruf man mit einem Browser nun folgende URL auf:

http://<IP-des-Servers>/cgi-bin/<Skriptname>.cmd

wird das Skript ausgeführt. Eine weitere Konfiguration des Apache ist nicht notwendig.

Damit das Ganze vom VPN-Client aus anwenderfreundlicher ist, kommen ein paar kleine Skripte ins Spiel:

Der VPN-Client startet nach dem Aufbau der Verbindung automatisch das Skript „vwr.cmd“, dieses wiederum startet die „vwr.exe“:

@echo off

cd C:\VPN
vwr.exe

Die „vwr.exe“ ist ein kompiliertes AutoIt-Skript. Anbei der Quellcode:

; AutoIt TrayIcon ausblenden

#NoTrayIcon

; Include-Dateien

#include <GUIConstantsEx.au3>

; Konfiguration einlesen

$Host = IniRead("vwr.ini", "VPN", "Host", "error")
$Countdown = IniRead("vwr.ini", "VPN", "Time", "error")
$WoL = IniRead("vwr.ini", "VPN", "WoL", "error")

If ($Host="error") or ($Countdown="error") or ($WoL="error") then
MsgBox(16, "VPN", "Fehler beim Lesen der Konfiguration")
Exit
EndIf

; Wartezeit in Sekunden umrechnen
; 60000 ms = 60 Sekunden = 1 Min

$Countdown = $Countdown*60000/1000

; Prüfen, ob der Ziel-Host erreichbar ist, andernfalls diesen per WoL starten und warten

$Pong = Ping($Host, 1000)

If $Pong = 0 Then

; WoL auslösen
InetGet($WoL, "")

; Countdown-Timer
; Fenster erzeugen
GUICreate("VPN", 268, 55)
GUISetState(@SW_SHOW)
GUICtrlCreateLabel("Bitte warten, bis das der Arbeitsplatz-PC gestartet ist:", 10, 10)

While 1
GUICtrlCreateLabel ( $Countdown & " Sekunden", 10, 30)
$Countdown=$Countdown-1
If $Countdown=0 Then ExitLoop
; Pause von einer Sekunde
sleep(1000)
WEnd

; Fenster schliessen
GUIDelete() 

EndIf

; Remotedesktopverbindung aufbauen

Run("mstsc.exe arbeitsplatz.rdp")

In der „vwr.ini“-Datei wird die IP-Adresse des Ziel-Computers hinterlegt und der Webserver-Aufruf. Beispiel:

[VPN]
Host=192.168.2.36
Time=2
WoL=http://192.168.2.10:8080/cgi-bin/test.cmd

VWR steht übrigens für VPN, Wake on LAN und RDP.

Zunächst wird der Ziel-Computer angepingt, kommt keine Antwort, kann man davon ausgehen, das dieser heruntergefahren ist. Daraufhin wird der „WoL-Aufruf“ durchgeführt, eine vordefinierte Zeit (Time, 2 Minuten) gewartet und dann die RDP-Verbindung initiiert.

Während auf das Starten des Ziel-Computers gewartet wird, läuft ein sichtbarer Countdown ab.

Nebenbei bemerkt: Es gibt noch eine ältere Variante, bei der PHP zum Einsatz kam, evtl. reiche ich diese bei Gelegenheit nach. Das Ganze dürfte sich zudem leicht z.B. auf Linux adaptieren lassen.

Update 13.06.2019

Hier also nun die PHP-Variante:

Apache oder anderer Webserver samt PHP muss (natürlich) eingerichtet sein. Dann eine Datei beispielsweise mit dem Namen „wol-pc01.php“ anlegen und folgenden Inhalt einfügen:

<?php

exec ("wol.exe <MAC-Adresse>");

?>

Via vwr wird’s in der Ini dann z.B. so aufgerufen:

WoL=http://192.168.2.10:8080/wol-pc01.php

Neben der Variante aus PHP heraus einen Befehl auszuführen gibt es die Möglichkeit, die für Wake-on-LAN benötigten Magic Pakets auch direkt aus PHP heraus zu versenden:

PHP.de – Wake-on-Lan mit PHP (gelöst)

Synology – Wiki – Wake on LAN (WOL) nur mit PHP, auch über das Internet

Das habe ich allerdings nie getestet.

Unter Linux kann man statt der „wol.exe“ z.B. die Befehle „wakeonlan“ (Debian & Co.) oder „wol“ (RedHat & Co.) verwenden.

2 Kommentare

  • Hallo,
    ich wäre sehr an einer PHP variante interessiert, und würde mich freuen wen Sie diese nachreichen würden.

    Mit freundlichen Grüßen

    Max

  • Hallo Max,

    danke für dein Kommentar. Habe den Beitrag soeben ergänzt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.