20

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 🙂

Hinweis

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

Johannes Huber
 

In seiner Freizeit macht Johannes nichts lieber, als für ITnator Beiträge zu schreiben. Input bekommt er hierfür von Problemen in der IT Administration von Servern, Clients und vielen weiteren IT Komponenten.

  • Robert sagt:

    Hallo,
    muss außer dem Inputfile-Pfad noch etwas angepasst werden?
    Danke und Gruß
    Robert

    • 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

  • Joe sagt:

    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

  • brain sagt:

    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.

  • BeMe sagt:

    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

  • Lukas sagt:

    Hallo und Danke für den Beitrag, kann man in dem Script auch festlegen, auf welcher Netzwerkkarte die Pakete rausgesendet werden?

  • fari sagt:

    krasser Typ, es hat funktioniert.
    Spende folgt!

  • Valentin sagt:

    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

  • Gerrit sagt:

    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)

    • Johannes sagt:

      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

  • DaBernsee sagt:

    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

  • sidebar
    >