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:

savdalscs01|00:1B:21:BD:E2:DB
savdalscs02|00:1F:D0:81:36:77
savdalbfs01|00:15:17:C4:E1:05

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
        $UDPclient.Connect(([System.Net.IPAddress]::Broadcast),4000)
        $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.