Send-MagicPacket.ps1


<#PSScriptInfo
 
.VERSION 1.0.3
 
.GUID cc0177f1-70ca-466f-81e5-ec2a37e67157
 
.AUTHOR saw-friendship
 
.COMPANYNAME
 
.COPYRIGHT saw-friendship
 
.TAGS Windows Network WOL Wake-on-Lan Magic Packet
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
 
 
#>


<#
 
.DESCRIPTION
 Send MagicPacket to NIC WOL supported
 
.LINK
 https://sawfriendship.wordpress.com/
 
.EXAMPLE
 Send-MagicPacket 00155df63102
 
.EXAMPLE
 Get-DhcpServerv4Reservation -ScopeId 192.168.1.0 | Send-MagicPacket
  
 
#>
 


[CmdletBinding()]
param (
[Parameter(Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)][Alias("LinkLayerAddress","PhysicalAddress","ClientId")][string[]]$MacAddress,
[IPAddress]$Broadcast = [System.Net.IPAddress]::Broadcast,
[int32[]]$Ports = @(7..9)
)

    Process{
        foreach ($Mac in $MacAddress) {
            
            [string]$Mac = $Mac.ToUpper() -replace "[g-z]|[^\w\d]"
            if($Mac.Length -ne 12){Write-Error -Message 'Invalid PhysicalAddress format'; break}
            [string[]]$SplitMac = $Mac -split '([\w\d]{2})' -match '[\w\d]'
            [byte[]]$packet = @( [byte] [convert]::ToInt32('FF',16) ) * 6
            $packet += @( $SplitMac | % { [byte] [convert]::ToInt32($_,16)} ) * 16

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

            $Ports | % {
                $UdpClient.Connect($broadcast, $_)
                $UdpClient.Send($packet, $packet.Length) | out-null
            }
            
            $UdpClient.Close()
            
            [pscustomobject][ordered]@{
                'Mac' = $Mac
                'Port' = $Ports
            }
        }
    }