如何使用PowerShell发送Wake-on-LAN魔术数据包
原生PowerShell发送Wake-on-LAN魔术包实现方案
无需安装任何第三方模块、外部工具,仅依靠PowerShell内置的.NET基础类库即可实现WOL魔术包构造与发送,兼容PowerShell 5.1、PowerShell 7+全版本。
核心原理
WOL标准魔术包结构固定,总长度102字节:
- 前6字节为固定填充值
0xFF - 后续连续重复16次目标设备的6字节MAC地址
数据包通常通过UDP协议发往目标子网的广播地址,常用端口为7或9。
实现代码
将以下代码直接粘贴到PowerShell窗口执行,即可获得Send-WOLPacket命令:
function Send-WOLPacket { param( [Parameter(Mandatory = $true, ValueFromPipeline = $true)] [string]$MacAddress, [string]$BroadcastAddress = '255.255.255.255', [int]$Port = 9 ) process { # 清洗MAC地址,移除所有非十六进制分隔符 $macClean = $MacAddress -replace '[^0-9A-Fa-f]', '' if ($macClean.Length -ne 12) { throw "MAC地址格式无效,标准MAC地址应包含12位十六进制字符" } # 转换MAC为字节数组 $macBytes = [byte[]]::new(6) for ($i = 0; $i -lt 6; $i++) { $macBytes[$i] = [Convert]::ToByte($macClean.Substring($i * 2, 2), 16) } # 构造魔术包 $magicPacket = [byte[]]::new(102) # 填充前6个0xFF字节 for ($i = 0; $i -lt 6; $i++) { $magicPacket[$i] = 0xFF } # 重复填充16次MAC地址 for ($i = 1; $i -le 16; $i++) { [Array]::Copy($macBytes, 0, $magicPacket, 6 + ($i - 1) * 6, 6) } # 发送UDP数据包 $udpClient = [System.Net.Sockets.UdpClient]::new() try { $udpClient.Connect($BroadcastAddress, $Port) $udpClient.Send($magicPacket, $magicPacket.Length) | Out-Null } finally { $udpClient.Close() $udpClient.Dispose() } } }
使用示例
- 基础唤醒(同子网设备,默认广播地址、9端口)
支持的MAC格式包括冒号分隔(Send-WOLPacket -MacAddress 'AA-BB-CC-DD-EE-FF'AA:BB:CC:DD:EE:FF)、横杠分隔、点分隔(AABB.CCDD.EEFF)、无分隔符(AABBCCDDEEFF),无需提前手动格式化。 - 跨网段唤醒(指定目标子网广播地址、自定义端口)
Send-WOLPacket -MacAddress 'AA:BB:CC:DD:EE:FF' -BroadcastAddress '192.168.3.255' -Port 7 - 批量唤醒多台设备
@('AA-BB-CC-DD-EE-FF', '11-22-33-44-55-66', 'aabb.ccdd.eeff') | ForEach-Object { Send-WOLPacket -MacAddress $_ }
注意:WOL功能需要提前在目标设备的BIOS/UEFI设置、网卡属性中开启,跨网段唤醒需要对应路由器配置允许定向广播包转发。
内容的提问来源于stack exchange,提问作者lauxjpn
相关产品推荐
相关产品推荐

