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"
Инструкция по использованию:
- Сохраните скрипт как
Wake-Device.ps1 - Запустите PowerShell от имени администратора (не всегда требуется, но рекомендуется):powershellStart-Process powershell -Verb RunAs
- Разрешите выполнение скрипта (если нужно):powershellSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
- Запустите скрипт:powershell.\Wake-Device.ps1
Требования для работы Wake-on-LAN:
- ✅ Целевое устройство должно поддерживать Wake-on-LAN
- ✅ Wake-on-LAN должен быть включен в BIOS/UEFI устройства
- ✅ Устройство должно быть подключено к питанию
- ✅ Ваш компьютер и целевое устройство должны быть в одной сети
- ✅ Сетевой адаптер устройства должен поддерживать WoL
Примечания:
- Скрипт отправляет UDP-пакет на порт 9
- Можно изменить порт на 7 или другой в строке с
[System.Net.IPEndPoint] - Для устройств в другой подсети укажите правильный широковещательный адрес
- Некоторые роутеры могут блокировать широковещательные пакеты