福岡の香月です。
コロナ対応で世の中はリモートワークが進んでいるようです。中程度スペックの中古PCもたくさん売れているようで、在庫が少なくなっているようですね。
自宅作業する場合、会社のPCにリモートデスクトップでつないで作業することも多いと思いますが、気付いたらPCがシャットダウンしていることがあります。間違って電源切ったとか、夜中にWindows Updateが動いたとか。
そんな時はWOL(Wake-on-LAN)ですが、私はこれについて知識が無かったので調べがてらC#プログラムのWOLツールを作ってみました。プラットフォームは.Net Core 3.1です。
以下全文です。どん!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
[crayon-6767ad227249a185877097 ] using System; using System.IO; using System.Net.Sockets; using System.Reflection; using Microsoft.Extensions.Configuration; namespace WakeOnLAN { class Program { static void Main(string[] args) { string name = Assembly.GetEntryAssembly().GetName().Name; ConfigurationBuilder builder = new ConfigurationBuilder(); builder.SetBasePath(Directory.GetCurrentDirectory()); builder.AddIniFile(name + ".ini"); IConfiguration config = builder.Build(); string host = config["host"]; string sport = config["port"]; string macAddr = config["macAddr"]; if (string.IsNullOrEmpty(host)) { Console.WriteLine("設定ファイルに host が設定されていません。"); return; } if (string.IsNullOrEmpty(sport)) { Console.WriteLine("設定ファイルに port が設定されていません。"); return; } if (string.IsNullOrEmpty(macAddr)) { Console.WriteLine("設定ファイルに macAddr が設定されていません。"); return; } int port = 0; if (!int.TryParse(sport, out port)) { Console.WriteLine("ポート番号が不正です。"); return; } // macアドレス文字列をバイト配列に string[] bsary = macAddr.Split('-'); if (bsary.Length != 6) { Console.WriteLine("macアドレスが正しくありません。\nipconfig /all で確認してください。\n例)1A-2B-3C-D4-EE-99"); return; } byte[] bmac = new byte[6]; for (int i = 0; i < 6; ++i) bmac[i] = Convert.ToByte(bsary[i], 16); byte[] packet = new byte[6 + 6 * 16]; Array.Copy(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, 0, packet, 0, 6); for (int i=1; i<=16; ++i) Array.Copy(bmac, 0, packet, i * bmac.Length, bmac.Length); try { UdpClient udp = new UdpClient(); udp.Send(packet, packet.Length, host, port); } catch (Exception e) { Console.WriteLine("マジックパケットの送信時に例外が発生しました。\n" + e.ToString()); } } } } |
特徴
- マジックパケットを飛ばします。マジックパケットとは…
- UDPで送信するパケット
- 先頭6バイトに{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }
- 続けて対象PCのmacアドレスを16回
- 合わせて102バイトのパケットとなる。
- exeと同じ名前のiniファイルを設定ファイルとして読み込む
- 設定ファイルにて以下を設定
- host=対象PCのIPアドレス
- post=UDPポート(ルータが許可したポートであれば何でもOK)
- macアドレス=対象PCのmacアドレス
- エラーが発生した場合はコンソール上にエラーを表示
プログラムは案外簡単でびっくりしました。
それよりもWOLが使える環境の設定が大変そうですね。BIOS、ネットワークカード、Windowsの設定など、情報はぐぐればいろいろ出てきますので一度お試しあれ。