2020年4月19日日曜日

Magic Packet送信用 PowerShellスクリプト

 Magic Packetを送信するPowerShellのスクリプト作りました。ついでにIPアドレスからMACアドレスを調べる関数、自分自身のIPアドレスからブロードキャストアドレスを調べる関数も作りました。

WakeOnLAN関数
WakeOnLAN “ターゲットのMACアドレス” “ブロードキャストアドレス”

指定されたMACアドレスを持つマシンをWake On LAN機能で起動します。

Ip2Mac関数
Ip2Mac “ターゲットのIPアドレス”

IPアドレスからMACアドレスを調べます。戻りは文字列値で、WakeOnLAN関数の引数として使えます

MyBCAddress関数
MyBCAddress “自分自身のIPアドレス”

自分が所属するネットワークのブロードキャストアドレスを調べます。戻りは文字列。自分のIPアドレスを指定しなければならないのは、複数のネットワークアダプタが存在する可能性があり、複数のIPアドレスを持っている可能性があるから。ネットワークアドレスの指定でもいいけど、この関数使うような人はそもそもネットワークアドレス求めることができないだろうから、一番わかりやすい自分のIPアドレスにした。

01#
02# (C) 2020 Shinji Shioda
03#
04# WakeOnLAN
05#   Magic Packet送信
06# Usage: WakeOnLAN "Terget MAC Address" "Broadcast Address"
07#   "Terget MAC Address"    起動するマシンのMACアドレス(文字列)
08#   "Broadcast Address"     マジックパケットを送るブロードキャストアドレス(文字列)
09# Ex: WakeOnLAN "1F-2E-3D-4C-5B-6A" "192.168.0.255"
10function global:WakeOnLAN (`
11    [string]$MacAddress,`
12    [string]$BroadCastAddress) {
13    $MacPart=($MacAddress.Split("-") `
14    | ForEach-Object { `
15    [System.Convert]::ToByte($_,16) })
16    $EndPoint=New-Object System.Net.IPEndPoint (`
17    [system.net.IPAddress]::Parse(($BroadCastAddress)),10000)
18    $Socket=New-Object System.Net.Sockets.Socket (`
19    [System.Net.Sockets.AddressFamily]::InterNetwork),`
20    ([System.Net.Sockets.SocketType]::Dgram),`
21    ([System.Net.Sockets.ProtocolType]::UDP)
22    $Socket.SetSocketOption(`
23    [System.Net.Sockets.SocketOptionLevel]::Socket,`
24    [System.Net.Sockets.SocketOptionName]::Broadcast,$true)
25    [void] $Socket.SendTo(([byte[]] (@(0xFF) *6))+($MacPart*16),$EndPoint)
26    $Socket.Close()
27}
28#
29# Ip2Mac
30#   IPアドレスをMACアドレスに変換
31# Usage: Ip2Mac "Terget IP Address"
32#   "Terget IP Address"     MACアドレスを調べたいマシンのIPアドレスを指定(文字列)
33# Ex: Ip2Mac "192.168.0.11"
34function global:Ip2Mac([string]$IP){
35    (Get-NetNeighbor -IPAddress $IP `
36    -ErrorAction SilentlyContinue).LinkLayerAddress
37}
38#
39# MyBCAddress
40#   IPアドレスから所属するネットワークのブロードキャストアドレスを計算する
41# Usage: MyBCAddress "My IPAddress"
42#     "My IPAddress"    IPアドレスを指定(文字列)
43# Ex: MyBCAddress "192.168.0.10"
44function global:MyBCAddress([String]$MyIP) {
45    try{
46        $NetMask=(`
47        Get-CimInstance -Class Win32_NetworkAdapterConfiguration `
48        -ErrorAction SilentlyContinue `
49        | Where-Object {$_.IPaddress -contains $MyIP }`
50        ).IPSubnet[0]
51        $mask=-bnot [System.BitConverter]::ToInt32(($NetMask.Split(".") `
52        | ForEach-Object{[System.Convert]::ToByte($_,10)}),0)
53        $Addr=[System.BitConverter]::ToInt32(($MyIP.Split(".")`
54        |ForEach-Object{[System.Convert]::ToByte($_,10)}),0)
55        return [System.BitConverter]::GetBytes($mask -bor $Addr) -join "."
56    }
57    Catch   { Write-Host 'Bad IP Address' }
58}

0 件のコメント:

コメントを投稿