Magic Pack PowerShell скрипт для отправки Wake-on-LAN (WOL) пакета на устройство с MAC-адресом 00-11-11-8A-72-3A

powershell

# Скрипт для отправки Wake-on-LAN пакета
# MAC-адрес: 00-11-11-8A-72-3A

function Send-WakeOnLan {
param(
[string]$MacAddress
)

# Очищаем MAC-адрес от разделителей
$MacAddress = $MacAddress -replace '[-:]', ''

# Проверяем длину MAC-адреса
if ($MacAddress.Length -ne 12) {
Write-Error "Неверный формат MAC-адреса. Ожидается 12 символов."
return $false
}

# Преобразуем MAC-адрес в массив байтов
$MacBytes = for ($i = 0; $i -lt 12; $i += 2) {
[byte]::Parse($MacAddress.Substring($i, 2), 'HexNumber')
}

# Создаем магический пакет:
# 6 байт 0xFF + 16 повторов MAC-адреса
$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++) {
for ($j = 0; $j -lt 6; $j++) {
$MagicPacket[$i * 6 + $j] = $MacBytes[$j]
}
}

try {
# Создаем UDP клиент
$UdpClient = New-Object System.Net.Sockets.UdpClient

# Устанавливаем опции для широковещательной рассылки
$UdpClient.EnableBroadcast = $true

# Отправляем пакет на порт 7 (echo) или 9 (discard) - стандартные для Wake-on-LAN
# Можно также использовать порт 0 (любой)
$UdpClient.Send($MagicPacket, $MagicPacket.Length,
[System.Net.IPEndPoint]::new([System.Net.IPAddress]::Broadcast, 9))

Write-Host "Wake-on-LAN пакет отправлен на MAC-адрес: $MacAddress" -ForegroundColor Green
Write-Host "Время отправки: $(Get-Date -Format 'HH:mm:ss')" -ForegroundColor Cyan

$UdpClient.Close()
return $true
}
catch {
Write-Error "Ошибка при отправке пакета: $_"
return $false
}
}

# Улучшенная версия с поддержкой подсетей
function Send-WakeOnLanToSubnet {
param(
[string]$MacAddress,
[string]$Subnet = "192.168.1.255" # Широковещательный адрес подсети
)

# Очищаем MAC-адрес
$MacAddress = $MacAddress -replace '[-:]', ''

if ($MacAddress.Length -ne 12) {
Write-Error "Неверный формат MAC-адреса"
return $false
}

# Преобразуем MAC-адрес в байты
$MacBytes = for ($i = 0; $i -lt 12; $i += 2) {
[byte]::Parse($MacAddress.Substring($i, 2), 'HexNumber')
}

# Создаем магический пакет
$MagicPacket = [byte[]]::new(102)
for ($i = 0; $i -lt 6; $i++) {
$MagicPacket[$i] = 0xFF
}
for ($i = 1; $i -le 16; $i++) {
for ($j = 0; $j -lt 6; $j++) {
$MagicPacket[$i * 6 + $j] = $MacBytes[$j]
}
}

try {
$UdpClient = New-Object System.Net.Sockets.UdpClient
$UdpClient.EnableBroadcast = $true

# Отправляем на конкретную подсеть
$TargetEndpoint = [System.Net.IPEndPoint]::new([System.Net.IPAddress]::Parse($Subnet), 9)
$UdpClient.Send($MagicPacket, $MagicPacket.Length, $TargetEndpoint)

Write-Host "Пакет отправлен в подсеть: $Subnet" -ForegroundColor Green
Write-Host "MAC-адрес: $MacAddress" -ForegroundColor Cyan

$UdpClient.Close()
return $true
}
catch {
Write-Error "Ошибка: $_"
return $false
}
}

# Функция для отправки пакета несколько раз (для надежности)
function Send-WakeOnLanMultiple {
param(
[string]$MacAddress,
[int]$Count = 3,
[int]$DelayMs = 100
)

Write-Host "Отправка Wake-on-LAN пакетов ($Count попыток)..." -ForegroundColor Yellow
Write-Host "MAC-адрес: $MacAddress" -ForegroundColor Cyan

$successCount = 0
for ($i = 1; $i -le $Count; $i++) {
Write-Host "Попытка $i из $Count..." -NoNewline
if (Send-WakeOnLan -MacAddress $MacAddress) {
$successCount++
Write-Host " [УСПЕХ]" -ForegroundColor Green
}
else {
Write-Host " [ОШИБКА]" -ForegroundColor Red
}

if ($i -lt $Count) {
Start-Sleep -Milliseconds $DelayMs
}
}

Write-Host "`nИтого успешных отправок: $successCount из $Count" -ForegroundColor $(if ($successCount -gt 0) { "Green" } else { "Red" })
return $successCount -gt 0
}

# Основной блок выполнения
$MacAddress = "00-11-11-8A-72-3A"

Write-Host "=== Wake-on-LAN Magic Packet Sender ===" -ForegroundColor Magenta
Write-Host "Целевое устройство: $MacAddress" -ForegroundColor Yellow
Write-Host "Текущее время: $(Get-Date -Format 'HH:mm:ss dd.MM.yyyy')" -ForegroundColor Cyan
Write-Host "`nВыберите режим отправки:" -ForegroundColor White
Write-Host "1. Стандартная отправка (один пакет)" -ForegroundColor Gray
Write-Host "2. Надежная отправка (несколько пакетов)" -ForegroundColor Gray
Write-Host "3. Отправить в конкретную подсеть" -ForegroundColor Gray

$choice = Read-Host "`nВведите номер [1-3] (по умолчанию 1)"

switch ($choice) {
"2" {
Write-Host "`n[Режим: Надежная отправка]" -ForegroundColor Blue
Send-WakeOnLanMultiple -MacAddress $MacAddress -Count 5 -DelayMs 200
}
"3" {
Write-Host "`n[Режим: Отправка в подсеть]" -ForegroundColor Blue
$subnet = Read-Host "Введите широковещательный адрес подсети (например: 192.168.1.255)"
if (-not $subnet) { $subnet = "192.168.1.255" }
Send-WakeOnLanToSubnet -MacAddress $MacAddress -Subnet $subnet
}
default {
Write-Host "`n[Режим: Стандартная отправка]" -ForegroundColor Blue
Send-WakeOnLan -MacAddress $MacAddress
}
}

Write-Host "`n=== Готово ===" -ForegroundColor Magenta
Write-Host "Проверьте, что:" -ForegroundColor Yellow
Write-Host "1. Устройство подключено к сети и питанию" -ForegroundColor Gray
Write-Host "2. Wake-on-LAN включен в BIOS/UEFI устройства" -ForegroundColor Gray
Write-Host "3. Устройство находится в той же подсети" -ForegroundColor Gray

# Пауза для PowerShell ISE или если скрипт запущен двойным кликом
if ($Host.Name -match "ISE") {
Read-Host "`nНажмите Enter для выхода"
}

Дополнительный упрощенный скрипт (если нужен минималистичный):

powershell

# Минималистичный скрипт Wake-on-LAN
$Mac = "00-11-11-8A-72-3A" -replace '[-:]', ''
$MacBytes = for ($i=0; $i -lt 12; $i+=2) { [byte]::Parse($Mac.Substring($i,2), 'HexNumber') }

$Packet = [byte[]]::new(102)
0..5 | % { $Packet[$_] = 0xFF }
1..16 | % { $i=$_; 0..5 | % { $Packet[$i*6+$_] = $MacBytes[$_] } }

$Udp = New-Object System.Net.Sockets.UdpClient
$Udp.EnableBroadcast = $true
$Udp.Send($Packet, $Packet.Length, [System.Net.IPEndPoint]::new([System.Net.IPAddress]::Broadcast, 9))
$Udp.Close()

Write-Host "Wake-on-LAN пакет отправлен на $Mac"

Инструкция по использованию:

  1. Сохраните скрипт как Wake-Device.ps1
  2. Запустите PowerShell от имени администратора (не всегда требуется, но рекомендуется):powershellStart-Process powershell -Verb RunAs
  3. Разрешите выполнение скрипта (если нужно):powershellSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
  4. Запустите скрипт:powershell.\Wake-Device.ps1

Требования для работы Wake-on-LAN:

  1. ✅ Целевое устройство должно поддерживать Wake-on-LAN
  2. ✅ Wake-on-LAN должен быть включен в BIOS/UEFI устройства
  3. ✅ Устройство должно быть подключено к питанию
  4. ✅ Ваш компьютер и целевое устройство должны быть в одной сети
  5. ✅ Сетевой адаптер устройства должен поддерживать WoL

Примечания:

  • Скрипт отправляет UDP-пакет на порт 9
  • Можно изменить порт на 7 или другой в строке с [System.Net.IPEndPoint]
  • Для устройств в другой подсети укажите правильный широковещательный адрес
  • Некоторые роутеры могут блокировать широковещательные пакеты

Оставьте комментарий