A: Would you like to be able to wake up a remote machine by only having to remember its name, rather than its MAC address?

In a previous FAQ, I had a Windows PowerShell script that sent the magic packet needed to wake up a machine over the network (see my FAQ "How can I easily send a magic packet...?" here at Windows IT PRO).

However, it required you to enter the MAC address of the machine.

The script below grabs a data file called wakeup.dat (update to where you have the dat file), and reads in name and MAC address pairs in the format below:


Save the script below as wakeup.ps1:

#param ([String]$HostName = $(throw 'No host passed, please pass hostname'))   #either format
if ($args.Length -ne 1)
    throw "No host passed, please pass host parameter"
$HostName = $args[0].ToUpper()

$FoundMatch = $FALSE

$data = Get-Content "d:\projects\powershell\wakeup.dat"
# write-host $data.count total lines read from file

foreach ($line in $data)
    $linesplit = $line.split("|")
    if ($linesplit.Length -ne 2)
     	throw 'Each line should have | format, e.g. host|00:23:23:00:23:23'
    if ($HostName.CompareTo($linesplit[0].ToUpper()) -eq 0) #if they are equal
        $FoundMatch = $TRUE

        $MACStr = $linesplit[1]
        $MACAddr = $MACStr.split(':') | %{ [byte]('0x' + $_)}
        $MACAddrParts = $MACStr.split(':') 
        if ($MACAddrParts.Length -ne 6)
         	throw 'MAC address must be format xx:xx:xx:xx:xx:xx'
        $UDPclient = new-Object System.Net.Sockets.UdpClient
        $packet = [byte[]](,0xFF * 6)
        $packet += $MACAddr * 16
        [void] $UDPclient.Send($packet, $packet.Length)
        write "Wake-On-Lan magic packet sent to $MACStr, length $($packet.Length)"

if ($FoundMatch -eq $FALSE)
    write-host "Never found match for " $HostName

You can then run it as follows:

PS D:\projects\PowerShell> .\wakeup.ps1 savdalscs02
Wake-On-Lan magic packet sent to 00:1F:D0:81:36:77, length 102

To see more FAQs, please go to John Savill's FAQs page on Windows IT Pro.