Wake On Lan Script WOL mit PowerShell

Um eure Computer per Wake On LAN / WOL in euren Netzwerk starten zu können, ist ein einfaches PowerShell Script notwendig. Dieses Script sendet ein Magic Paket an die Netzwerkkarten der gelisteten MAC – Adressen. Diese Funktion ist sehr hilfreich, wenn man Beispielsweise  mehrere Computer am Wochenende updaten will. Noch ein Anwendungsgebiet ist, wenn man einen Computer starten will, den man von der Entfernung her sehr schwer erreichen kann. (Anderer Standort / Büro). Praktisch wäre das natürlich als Aufgabenplanung auszuführen, um den Computern am Wochenende Updates installieren zu lassen. 😉

wake on lan

Als erstes brauchen wir eine Liste von MAC – Adressen der Clients in einem Textfile:

(WakeOnLanMAC.txt – SAMPLE)

90FBA678C858
90FBA678C7DB
90FBA678C7C8
90FBA678C517
90FBA678C80B
90FBA678C87F
90FBA678C52F
90FBA678C7DE
90FBA678C80D
8C89A5ED4770
0019999A9012
4437E6C9E468

Die MAC – Adressen für WOL müssen untereinander gelistet werden, ohne ein Komma oder einem anderen Trennzeichen.

 

Danach brauchen wir noch ein Wake On Lan / WOL PowerShell Script:

JuralMin / Pixabay

(wakeonlan.ps1)

#Eingabedatei
$InputFile = "C:\JOBS\WakeOnLanMAC.txt"

function Send-Packet([string]$MacAddress)
{
try
{
$Broadcast = ([System.Net.IPAddress]::Broadcast)

## Create UDP client instance
$UdpClient = New-Object Net.Sockets.UdpClient

## Create IP endpoints for each port
$IPEndPoint = New-Object Net.IPEndPoint $Broadcast, 9

## Construct physical address instance for the MAC address of the machine (string to byte array)
$MAC = [Net.NetworkInformation.PhysicalAddress]::Parse($MacAddress.ToUpper())

## Construct the Magic Packet frame
$Packet = [Byte[]](,0xFF*6)+($MAC.GetAddressBytes()*16)

## Broadcast UDP packets to the IP endpoint of the machine
$UdpClient.Send($Packet, $Packet.Length, $IPEndPoint) | Out-Null
$UdpClient.Close()
}
catch
{
$UdpClient.Dispose()
$Error | Write-Error;
}
}

#Fuer jede MAC in Zeile: Function 'Send-Paket + MAC'
ForEach ($MacAddress in get-content $InputFile)
{
Send-Packet $MacAddress
}

Zuletzt müssen wir nur noch die Zeile 2 anpassen (Pfad zur Datei mit den Adressen), das Powershell Script ausführen und die Computer fahren hoch 🙂

[thrive_text_block color=”red” headline=”Hinweis”]

Bitte denkt daran, dass im BIOS des Computers natürlich Wake On LAN aktiviert sein muss.

[/thrive_text_block]

    • Hallo Robert,

      nein – außer dem input-File in Zeile 2 muss nichts mehr angepasst werden.
      Bitte achte darauf, dass jede MAC-Adresse in einer Zeile stehen muss.


      MACADRESSE1
      MACADRESSE2
      MACADRESSE3
      ...

      Gruß Johannes

  • Hallo,

    kann man das Skript auf einem Server ablegen und es dort über eine Freigabe und einen selbst erstellten Nutzer dafür ausführen lassen?

    Gruß Joe

    • Hallo Joe,

      im Endeffekt ist es dem Script egal wo es liegt.
      Es muss nur auf folgende Dinge geachtet werden:

      – Der Pfad zu der MAC – Adressen – Liste muss verfügbar sein
      – Die Clients müssen evtl. im selben IP – Subnetz sein
      – Je nach dem wie eure Struktur ist, benötigt man erhöhte Rechte

      Aber zurück zu deiner Frage, JA ansich sollte das kein Problem darstellen.

      Gruß Johannes

  • man kann den (dynamischen) pfad des laufenden scrips ermitteln,
    damit kann man zusätzliche dateien, relativ vom ort des scrips, ermitteln. dadurch braucht man keinen festen pfad mehr für die “WakeOnLanMAC.txt” verwenden, wenn diese z.B. im selben verzeichnis ist wie das script.

  • Danke für den Beitrag.
    Das funktioniert aber nicht, wenn der Haken in der Netzkarte
    “gerät kann den computer aus dem ruhezustand aktivieren” nicht gesetzt ist, was Windwos bei jedem Upgrade wieder ausschaltet.
    Hast Du dazu auch einen Beitrag? Danke

    • Hallo BeMe,

      danke für deine Nachricht.
      Ja da hast du Recht, der Haken muss gesetzt sein.
      Dass dieser bei jedem Update wieder ausgeschalten ist, ist mir tatsächlich neu.
      Spontan habe ich keine Antwort dafür 🙁

      Das lässt sich aber bestimmt über die Registry lösen.
      Ich habe aber irgendwo im Hinterkopf, dass es etwas mit den Energie-Einstellungen von Windows zu tun hat. Vielleicht ist das ein Ansatzpunkt?!

      Gruß Johannes

      • Hallo, auf einem Client fiel mir auf, dass das Magic Packet über die gewollte Netzwerkkarte rausgeschickt wurde, erst als ich die anderen deaktiviert hatte. Aber du hast recht, in einer Serverumgebung dürfte das nicht unbedingt relevant sein.

  • Hallo Johannes,

    angenommen ich möchte nur ein PC starten und dafür keine Text-Datei nutzen… Wie müsste man die “InputFile” – Zeile anpassen?

    MfG Valentin

  • Hallo, leider funktioniert das Skript bei mir nicht (Windows 10, Powershell 7). Andere WakeOnLan-Tools funktionieren dagegen aber, wie z.B. die WOL-Funktion der Fritzbox. Irgendwie muss es noch etwas geben, was diese Tools anders machen. Evtl. wird das Paket ins falsche Netzwerksegment geschickt. Das Tool von Gammadyne funktioniert z.B. nur, wenn man das Netzwerksegment angibt (mit /d)

    • Hallo Gerit,

      du kannst zwischen Zeile 35 & 36 ein write-host "test" einfügen um zu sehen, ob der Befehl pro MAC-Adresse ausgeführt wird.
      Außerdem ist im Textfile natürlich wichtig, dass die MAC-Adressen folgendermaßen eingefügt werden:
      – untereinander
      – keine Leerzeichen
      – keine Bindestriche oder sonstige Zeichen

      Gruß Johannes

  • Hallo zusammen,

    ich habe das ganze mal mit Batch kombiniert…falls man nur einzelne Geräte starten möchte.

    @echo off & setlocal enableextensions enabledelayedexpansion
    title Wake-On-LAN Device

    :START
    cls
    color 0a
    echo.

    :: RegEx pattern für eine IP
    set patternIP=”^[0-9][0-9]*.[0-9][0-9]*.[0-9][0-9]*.[0-9][0-9]*$”
    set EIP=
    set /p inputDEV=Please enter Hostname or IP Address:
    for %%i in (%inputDEV%) do echo %%i|findstr /R %patternIP% >nul && set “EIP=!EIP!%%i”
    if defined EIP goto :IPOK

    :: nslookup zur ermittlung der ip adresse
    nslookup %inputDEV% 1>%temp%lookup.stdout 2>%temp%lookup.stderr
    if exist %temp%lookup.stderr for /f “tokens=1,2 ” %%a in (%temp%lookup.stderr) do if %%a == *** cls & color 0c & echo. & echo hostname “%%b” cannot be resolved & echo. & echo hit any key to restart with an ip address or other hostname & pause>nul & goto :START
    if exist %temp%lookup.stdout for /f “tokens=1,2 skip=4” %%a in (%temp%lookup.stdout) do set EIP=%%b
    :: cleanup
    del %temp%lookup.stderr
    del %temp%lookup.stdout

    :: alte Methode zur ermittlung der ip addresse (unsauber)
    ::for /f “tokens=1,4,5,6 delims=[] ” %%a in (‘ping -n 1 %inputDEV%^|findstr ^”[ “^”‘) do if %%a == Ping-Anforderung (echo. & echo hostname %%b cannot be resolved & echo. & echo hit any key to exit & pause>nul & goto :EOF) else (set EIP=%%d)

    :IPOK
    echo.
    CHOICE /C YN /N /T 30 /D Y /M “wanna use the following IP %EIP% to start WoL? [Y/n]”
    if errorlevel 2 goto :START

    :GETMAC
    echo.
    echo resolving mac address via arp cache…please wait
    ping -n 1 -4 %EIP%>nul
    for /f “tokens=1,2 skip=3 ” %%a in (‘arp -a’) do if %%a == %EIP% set MAC=%%b
    if defined MAC for /f “tokens=1-6 delims=-” %%a in (‘echo %mac%’) do set EMAC=%%a:%%b:%%c:%%d:%%e:%%f& goto :MACOK

    :SETMAC
    cls
    echo.
    :: RegEx pattern für eine MAC
    set patternMAC=”^[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]$”
    set EMAC=
    set /p inputMAC=nothing found…please enter MAC address manually [e.g. d0:21:f9:e4:1b:3f]:
    for %%i in (%inputMAC%) do echo %%i|findstr /I /R %patternMAC% >nul && set “EMAC=!EMAC!%%i”
    if not defined EMAC echo. & echo wrong format…hit any key to re-enter MAC address & pause>nul & goto :SETMAC

    :MACOK
    echo.
    echo hit any key to wake up the following device: [IP: %EIP%] – [MAC: %EMAC%]&pause>nul

    :: WoL Commando via powershell
    powershell -EP ByPass -Command “&{$mac = ‘%EMAC%’ -replace ‘[|:]’,”;$UDPclient = new-Object System.Net.Sockets.UdpClient; $UDPclient.Connect(‘%EIP%’,9);[void]$UDPclient.Send((,[byte]255 * 6) + ((0,2,4,6,8,10 | %% {[convert]::ToByte($mac.substring($_,2),16)}) * 16) , 102)}”
    echo.
    echo sending Magic Paket to %inputDEV% …please wait…
    echo.
    ping %EIP% -t

  • {"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}
    >