I want to send a WOL magic packet using PowerShell, without falling back on any third party tools.
1 Answers
Here is the working PowerShell one-liner I am using to send a WakeOnLan packet:
$mac = '01-23-45-67-89-AB'; [System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() | Where-Object { $_.NetworkInterfaceType -ne [System.Net.NetworkInformation.NetworkInterfaceType]::Loopback -and $_.OperationalStatus -eq [System.Net.NetworkInformation.OperationalStatus]::Up } | ForEach-Object { $targetPhysicalAddressBytes = [System.Net.NetworkInformation.PhysicalAddress]::Parse(($mac.ToUpper() -replace '[^0-9A-F]','')).GetAddressBytes(); $packet = [byte[]](,0xFF * 102); 6..101 | Foreach-Object { $packet[$_] = $targetPhysicalAddressBytes[($_ % 6)] }; $client = [System.Net.Sockets.UdpClient]::new([System.Net.IPEndPoint]::new(($_.GetIPProperties().UnicastAddresses | Where-Object { $_.Address.AddressFamily -eq [System.Net.Sockets.AddressFamily]::InterNetwork })[0].Address, 0)); try { $client.Send($packet, $packet.Length,[System.Net.IPEndPoint]::new([System.Net.IPAddress]::Broadcast, 9)) | Out-Null } finally { $client.Dispose() } }
And here is a more readable version:
$mac = '01-23-45-67-89-AB';
[System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() | Where-Object { $_.NetworkInterfaceType -ne [System.Net.NetworkInformation.NetworkInterfaceType]::Loopback -and $_.OperationalStatus -eq [System.Net.NetworkInformation.OperationalStatus]::Up } | ForEach-Object {
$networkInterface = $_
$localIpAddress = ($networkInterface.GetIPProperties().UnicastAddresses | Where-Object { $_.Address.AddressFamily -eq [System.Net.Sockets.AddressFamily]::InterNetwork })[0].Address
$targetPhysicalAddress = [System.Net.NetworkInformation.PhysicalAddress]::Parse(($mac.ToUpper() -replace '[^0-9A-F]',''))
$targetPhysicalAddressBytes = $targetPhysicalAddress.GetAddressBytes()
$packet = [byte[]](,0xFF * 102)
6..101 | Foreach-Object { $packet[$_] = $targetPhysicalAddressBytes[($_ % 6)] }
$localEndpoint = [System.Net.IPEndPoint]::new($localIpAddress, 0)
$targetEndpoint = [System.Net.IPEndPoint]::new([System.Net.IPAddress]::Broadcast, 9)
$client = [System.Net.Sockets.UdpClient]::new($localEndpoint)
try { $client.Send($packet, $packet.Length, $targetEndpoint) | Out-Null } finally { $client.Dispose() }
}
All common MAC address formats are supported and casing doesn't matter, for example:
0123456789aB
01-23-45-67-89-aB
01:23:45:67:89:aB
0123.4567.89aB
Works in powershell.exe
(.NET Framework) and pwsh.exe
(.NET/.Net Core).
Loosely based on code from Wake on LAN using C#.

- 4,749
- 1
- 20
- 40
-
You probably want to give the MAC without ':' signs. – Bartosz Rosa Jan 22 '23 at 21:03
-
@BartoszRosa There are multiple formats supported (including macs without `:` separators). See [PhysicalAddress.Parse Method](https://learn.microsoft.com/en-us/dotnet/api/system.net.networkinformation.physicaladdress.parse) for more information. – lauxjpn Jan 23 '23 at 12:22
-
Yes, but in my case, PowerShell `Parse()` method raises an exception with this format. In any case, thanks for the code. – Bartosz Rosa Jan 23 '23 at 20:36
-
1@BartoszRosa Yes, if you are using an older PowerShell version (like one that ships with Windows instead of `pwsh`), it will not support this format (see [PhysicalAddress.Parse Method](https://learn.microsoft.com/en-us/dotnet/api/system.net.networkinformation.physicaladdress.parse)). I'll can change the MAC format in the sample code to something that works in all versions. – lauxjpn Jan 24 '23 at 11:15
-
Note you'd have to be on the same network, fast startup would have to be disabled in windows 10, probably on dells wake on lan would have to be enabled, and deep sleep disabled. – js2010 Jan 24 '23 at 12:55
-
I updated the answer so that all common Mac address formats work with both: `powershell.exe` and `pwsh.exe`. – lauxjpn Jan 27 '23 at 12:39
-
The dell bios utility "cctk" doesn't work with all dell models either. – js2010 Jan 27 '23 at 14:23