残念ながら私は毎日業務でプログラムを書いているわけではないので、色々やっているうちに忘れてしまう危険があります・・・!!そんなわけで、プログラム系もぼちぼち記事にしていこうと思います。
USBメモリの検知ツールが欲しいという要望があり、C#でドラフト版を作ってみました。ネットワークプログラミングが必要かなと思ったら、そんなことはなく、ローカルマシンの情報だけ取得すれば良いだけでサクサク製作。
USBメモリー検知を行い、ユーザに警告
メールでも通知がいきますが、ユーザにもシステム管理者に通知して貰い、迅速な情報の把握。ユーザにもちゃんと監視されているんだとセキュリティ意識を高めます。
システム管理者へのメール通知
USBやCD/DVDロムがあるとエラー警告とシステム管理者にメール通知がされるようになっており、ログとして活用。
課題
スマホ等のポータブルディスクについては、ライブラリを見つけたのでそれで対応予定。また、レジストリを制御すれば書き込み禁止が出来るので、管理者用の設定フォームを隠しファイルとして作って、そこで禁止と解除を制御できるようにすれば良いかな~。
Form1.cs
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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
using System; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; //using System.Collections.Generic; //using System.ComponentModel; //using System.Data; //using System.Drawing; //using System.Linq; //using System.Text; namespace detectUsbFormApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); //USB検知実行するよ! ========================================================= //* 管理者にメールを送ります。 //* 一度管理者にメール通知した後はUSBを抜くまでアラートが発生。 var task = Task.Run(() => { while (true) { detectUSB(); System.Threading.Thread.Sleep(30000); // 30秒スリープ } }); //USB検知実行するよ! ここまで ================================================= } private void Form1_Load(object sender, EventArgs e) { } // 現在の環境情報を取得 public static string GetLocalMachineEnvironment() { string ret; ret = "コンピュータ名:" + Environment.MachineName + "\r\n" + "ユーザ名:" + Environment.UserName + "\r\n" + "日時:" + System.DateTime.Now + "\r\n"; return ret; } //========================================================================== // USB検知機能 //========================================================================== public static void detectUSB() { DriveInfo[] allDrives = DriveInfo.GetDrives(); // ドライブ情報取得 foreach (DriveInfo d in allDrives) { //USB(Romovableディスク), CD/DVDを検知した場合 if (d.DriveType == DriveType.Removable || d.DriveType == DriveType.CDRom) { //Console.WriteLine("WARNING!! 不正デバイス検知!!!"); string userInfo = GetLocalMachineEnvironment(); // USBドライブが待機状態の場合 if (d.IsReady == true) { string results; string name = d.Name; System.IO.DriveType driveType = d.DriveType; string volumeLabel = d.VolumeLabel; string driveformat = d.DriveFormat; long avalableFreeSpace = d.AvailableFreeSpace; long TotalFreeSpace = d.TotalFreeSpace; long TotalSize = d.TotalSize; results = $"Drive {name}"; results += $"File type: {driveType}"; results += $"Volume label: {volumeLabel} \r\n"; results += $"File system: {driveformat} \r\n"; results += $" Available space to current user:{avalableFreeSpace} bytes \r\n"; results += $" Total available space: {TotalFreeSpace} bytes \r\n"; results += $" Total size of drive: {TotalSize} bytes \r\n"; //=================================================================== // アラートメール送信 Gmailサーバを使用 //=================================================================== string id = "exampleuser@gmail.com"; //GmailID ※アドレス string pass = "xxxxxxxxxxxxxxxxxx"; // Gmailパスワード string fromEMail = "exampleuser@gmail.com"; //From string toEMail = "admin@example.com"; //警告通知 宛先アドレス string subject; //タイトル string body; //本文 subject = "【要 緊急対応】不正デバイス検知アラート"; body = $"【不正デバイス警告 USB検知】: \r\n" + "不正デバイスをPCから抜き取り、システム管理者に報告を行って下さい。 \r\n" + "=================================== \r\n" + $"{userInfo} \r\n" + $"{results}"; System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(); smtp.Host = "smtp.gmail.com"; //SMTPサーバ smtp.Port = 587; //SMTPポート smtp.Credentials = new System.Net.NetworkCredential(id, pass); //認証 smtp.EnableSsl = true; //SSL System.Net.Mail.MailMessage oMsg = new System.Net.Mail.MailMessage(fromEMail, toEMail, subject, body); smtp.Send(oMsg); //メール送信 // メール送信 ここまで ================================================ //ユーザのモニターに警告を表示させ、システム管理者への報告を促す MessageBox.Show(body); } }// end if (d.DriveType == DriveType.Removable || d.DriveType == DriveType.CDRom) } // foreach } // detectUSB() // USB検知機能 ここまで ====================================================================== // 終了ボタンのクリック アプリケーションの終了 ※フォーム表示フラグが1の時のみ可能 private void 終了ToolStripMenuItem_Click(object sender, EventArgs e) { notifyIcon1.Visible = false; Application.Exit(); } }// class Form1 }// namespace detectUsbFormApp |
ドライブ情報取得と出力
1 2 3 |
DriveInfo[] allDrives = DriveInfo.GetDrives(); // ドライブ情報取得 foreach (DriveInfo d in allDrives) |
メール送信部分
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 |
//=================================================================== // アラートメール送信 Gmailサーバを使用 //=================================================================== string id = "exampleuser@gmail.com"; //GmailID ※アドレス string pass = "xxxxxxxxxxxxxxxxxx"; // Gmailパスワード string fromEMail = "exampleuser@gmail.com"; //From string toEMail = "admin@example.com"; //警告通知 宛先アドレス string subject; //タイトル string body; //本文 subject = "【要 緊急対応】不正デバイス検知アラート"; body = $"【不正デバイス警告 USB検知】: \r\n" + "不正デバイスをPCから抜き取り、システム管理者に報告を行って下さい。 \r\n" + "=================================== \r\n" + $"{userInfo} \r\n" + $"{results}"; System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(); smtp.Host = "smtp.gmail.com"; //SMTPサーバ smtp.Port = 587; //SMTPポート smtp.Credentials = new System.Net.NetworkCredential(id, pass); //認証 smtp.EnableSsl = true; //SSL System.Net.Mail.MailMessage oMsg = new System.Net.Mail.MailMessage(fromEMail, toEMail, subject, body); smtp.Send(oMsg); //メール送信 // メール送信 ここまで ================================================ |
Program.cs
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 |
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace detectUsbFormApp { static class Program { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //========================================== // フォーム表示制御 デフォルトは非表示 //========================================== //フラグ 0 = 非表示, 1 = 表示 int showFlag = 0; if (showFlag == 1) { Application.Run(new Form1()); } else if(showFlag == 0) { //非表示にする場合 Form1 form = new Form1(); form.Hide(); Application.Run(); } // 表示制御 ここまで ======================= } } } |
notifyIconで常駐アプリらしくアイコン作ってみました。
監視してますよ~!っという抑止があった方がいいかなと。要件次第ですね。
お疲れ様です。