システム開発備忘録 Visual Basic ネットワーク経由でのパソコンの起動と終了
WOL(Wake up On Lan)
マジックパケットを送信して指定した端末を起動する
※受信側のNICがWOLに対応している必要がある。
※マジックパケットは、
最初にFF(255)を6回(6バイト)
次にIPアドレス(6バイト)を16回繰り返す
とういだけの単純なもの。これをUDPで送信するだけ。
※VB6あたりだと、WinSockAPIが必要だが.NET Frameworkだとあっけないほど簡単。
Dim strIP As String = "192.168.1.1" 'IPアドレス
Dim strMAC As String = "00-00-00-00-00-00" 'マックアドレス
'送信データを作成
Dim intCounter As Integer = 0
Dim sendBytes(0 To 101) As Byte
'最初に&hFFを6個付ける
For I = 1 To 6
sendBytes(intCounter) = &HFF
intCounter += 1
Next
'MACアドレスを16回繰り返す
For I = 1 To 16
'MACアドレス読込み
For J = 0 To 5
'16進数を変換して読込み
sendBytes(intCounter) = Byte.Parse(strMAC.Substring(J * 3, 2), Globalization.NumberStyles.HexNumber)
intCounter += 1
Next
Next
'データを送信するポート番号
Dim RemotePort As Integer = 2304 '何でも良い
'送信先IP指定(ブロードキャストとピンポイントの両方に送信してみる)
Dim BCIP As System.Net.IPAddress
Dim EP As System.Net.IPEndPoint
Dim UDP As New System.Net.Sockets.UdpClient'UDP接続
'ブロードキャストアドレス指定で送信するとき
BCIP = System.Net.IPAddress.Parse("255.255.255.255")
EP = New System.Net.IPEndPoint(BCIP, RemotePort)
'送信先を指定してデータを送信する
UDP.Send(sendBytes, sendBytes.Length, EP)
'ピンポイントのIPアドレス指定して送信するとき
BCIP = System.Net.IPAddress.Parse(strIP)
EP = New System.Net.IPEndPoint(BCIP, RemotePort)
'送信先を指定してデータを送信する
UDP.Send(sendBytes, sendBytes.Length, EP)
'UDP接続を終了
udp.Close()
Shutdownコマンド(Windows XP から標準装備されている)
シャットダウンコマンドを送信する
'環境変数ComSpecからコマンドプロンプトのパスを取得する
PSI.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
'出力を読み取れるようにする
PSI.RedirectStandardInput = False
PSI.RedirectStandardOutput = True
PSI.UseShellExecute = False
'ウィンドウを表示しないようにする
PSI.CreateNoWindow = True
'コマンドラインを指定("/c"は実行後閉じるために必要)
PSI.Arguments = "/c shutdown -s -m " & strHostname & " -t 10" '10秒後にシャットダウン
'指定した端末にシャットダウンコマンドを送信する
Dim P As System.Diagnostics.Process = System.Diagnostics.Process.Start(PSI)
'コマンドラインを指定("/c"は実行後閉じるために必要)
PSI.Arguments = "/c shutdown -a -m " & strHostname 'シャットダウン中止
'待機中のシャットダウンを中止するコマンド送信
Dim P As System.Diagnostics.Process = System.Diagnostics.Process.Start(PSI)
|