Для небольшого офиса 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
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 начнет включение