PowerShell. WakeOnLan

Для небольшого офиса MAC-адреса можно получить один раз,
сохранить в текстовом документе, и в дальнейшем уже брать из него.
Например я написал для этой цели такой скрипт:

# Выполнять под доменным администратором( необходимо для работы wmi)
$ErrorActionPreference = 'SilentlyContinue'
# Получаем текущий адрес для определение подсети
$ip = ( Test-Connection $env:COMPUTERNAME -Count 1 ).IPV4Address.IPAddressToString -replace('\.\d+$')
# Получаем все MAC в текущей подсети
$MACS = ( Get-NetNeighbor | ?{ $_.AddressFamily -eq 'IPv4' -and $_.State -ne 'Unreachable' -and $_.IPAddress -match $ip } )
$Table = @()
foreach($MAC in $MACS){
    if( Test-Connection -Count 1 -ComputerName $MAC.IPAddress -ErrorAction Ignore ){
        if( $Hostname = ( gwmi -ComputerName $MAC.IPAddress -Query “SELECT name FROM Win32_ComputerSystem” ).name ){           
            $Table += @( @{MAC=$MAC.LinkLayerAddress;HostName=$Hostname;IP=$MAC.IPAddress}) | % { New-Object object | Add-Member -NotePropertyMembers $_ -PassThru }
            "Компьютер $Hostname добавлен в таблицу"
            }
        }  
    }
$Table | ft HostName,MAC

 

Hostname получаем  не через DNS а через WMI, потому что DNS может выдавать устаревшую информацию


Magic Packet
состоит из цепочки синхронизации размером 6 байт равных 0xFF,
и MAC-адреса повторяющегося 16 раз

Запускаем для выбранного MAC-адреса скрипт, который отправляет Magic пакет:

$Mac='bc-ee-4b-74-8a-6a'
$BroadcastProxy=[System.Net.IPAddress]::Broadcast
$Ports = 0,7,9

$synchronization = [byte[]](,0xFF * 6)
$bmac = $Mac -Split '-' | ForEach-Object { [byte]('0x' + $_) }
$packet = $synchronization + $bmac * 16

$UdpClient = New-Object System.Net.Sockets.UdpClient

ForEach ($port in $Ports) { $UdpClient.Connect($BroadcastProxy, $port)
$UdpClient.Send($packet, $packet.Length) | Out-Null }
$UdpClient.Close()

 

Если вы предварительно включили WakeOnLan на материнской плате, то ваш компьютер получив Magic Packet начнет включение

Добавить комментарий

Ваш адрес email не будет опубликован.