パソコンの識別情報を得る

ソフトにプロテクトをかけたい、特定のパソコンだけで使えるようにしたい、というときには、まずはパソコンの識別情報をゲットする必要がある。

プロテクトをするならUSBキーのような物理的なものが確かなのだけど、最近はパソコンのUSBの差込口が塞がれたりしているので、ソフトで実現する方法を考えてみる。


ユニバーサルアプリなら「ASHWID」というデータが使えるらしい。
アプリが実行されている端末を識別するには?

普通のWindowsアプリでは、どうするか。素人考えだと以下のようなデータが思い浮かぶ。
  • ハードディスクのボリュームシリアル番号
  • MACアドレス
  • BIOSのシリアル番号
しかし、ボリュームシリアル番号もMACアドレスも割と簡単に変更できるらしいので、プロテクトに使うのは問題ありそう。そもそも、MACアドレスは、パソコンに複数個あったりするので(有線と無線とか、仮想アダプターも)どれを使えばよいのか。

あと、BIOSのシリアル番号は、メーカーごと?型番ごと?に振っているだろうから、(可能性は低いが)2台のパソコンで番号が同じということもあるかもしれない。

ということで、どれもいまいちなのだけど、情報をゲットするクラスを作ってみた。

まずはusing。DLLを参照設定に追加するのも必要。

  1. using System.Management;
  2. using System.Net.NetworkInformation;

クラスは以下の通り。複数個ゲットできた情報は文字列で連結している。このままでは識別情報として使うのは難しいね、確かに。

  1. /// <summary>
  2. /// パソコンの識別情報を得る
  3. /// </summary>
  4. class deviceInfo
  5. {
  6.     /// <summary>
  7.     /// Cドライブのボリュームシリアル番号を得る
  8.     /// </summary>
  9.     /// <returns></returns>
  10.     static public string getVolumeNo()
  11.     {
  12.         System.Management.ManagementObject mo = new System.Management.ManagementObject("Win32_LogicalDisk=\"C:\"");
  13.  
  14.         return (string)mo.Properties["VolumeSerialNumber"].Value;
  15.     }
  16.  
  17.     /// <summary>
  18.     /// BIOSのシリアル番号を得る
  19.     /// </summary>
  20.     /// <returns></returns>
  21.     static public string getBiosNo()
  22.     {
  23.         ManagementScope scope = new ManagementScope("root\\cimv2");
  24.         scope.Connect();
  25.  
  26.         System.Management.ObjectQuery q = new System.Management.ObjectQuery("select SerialNumber from Win32_BIOS");
  27.  
  28.         ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, q);
  29.         ManagementObjectCollection co = searcher.Get();
  30.  
  31.         var lst = co.Cast<ManagementObject>().Select(o => o.GetPropertyValue("SerialNumber").ToString());
  32.  
  33.         return string.Join("-", lst.ToArray());
  34.     }
  35.  
  36.     /// <summary>
  37.     /// MACアドレスを得る(複数個)
  38.     /// </summary>
  39.     /// <returns></returns>
  40.     static public string getMacAddr()
  41.     {
  42.         var ifs = NetworkInterface.GetAllNetworkInterfaces();
  43.  
  44.         var lst = ifs.Select(nif => nif.GetPhysicalAddress().ToString());
  45.  
  46.         return string.Join("-", lst.ToArray());
  47.     }
  48. }

コメント

このブログの人気の投稿

varchar をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。