パソコンの識別情報を得る
ソフトにプロテクトをかけたい、特定のパソコンだけで使えるようにしたい、というときには、まずはパソコンの識別情報をゲットする必要がある。
普通のWindowsアプリでは、どうするか。素人考えだと以下のようなデータが思い浮かぶ。
あと、BIOSのシリアル番号は、メーカーごと?型番ごと?に振っているだろうから、(可能性は低いが)2台のパソコンで番号が同じということもあるかもしれない。
ということで、どれもいまいちなのだけど、情報をゲットするクラスを作ってみた。
まずはusing。DLLを参照設定に追加するのも必要。
クラスは以下の通り。複数個ゲットできた情報は文字列で連結している。このままでは識別情報として使うのは難しいね、確かに。
*
ユニバーサルアプリなら「ASHWID」というデータが使えるらしい。
アプリが実行されている端末を識別するには?
アプリが実行されている端末を識別するには?
普通のWindowsアプリでは、どうするか。素人考えだと以下のようなデータが思い浮かぶ。
- ハードディスクのボリュームシリアル番号
- MACアドレス
- BIOSのシリアル番号
しかし、ボリュームシリアル番号もMACアドレスも割と簡単に変更できるらしいので、プロテクトに使うのは問題ありそう。そもそも、MACアドレスは、パソコンに複数個あったりするので(有線と無線とか、仮想アダプターも)どれを使えばよいのか。
ということで、どれもいまいちなのだけど、情報をゲットするクラスを作ってみた。
まずはusing。DLLを参照設定に追加するのも必要。
using System.Management; using System.Net.NetworkInformation;
クラスは以下の通り。複数個ゲットできた情報は文字列で連結している。このままでは識別情報として使うのは難しいね、確かに。
/// <summary> /// パソコンの識別情報を得る /// </summary> class deviceInfo { /// <summary> /// Cドライブのボリュームシリアル番号を得る /// </summary> /// <returns></returns> static public string getVolumeNo() { System.Management.ManagementObject mo = new System.Management.ManagementObject("Win32_LogicalDisk=\"C:\""); return (string)mo.Properties["VolumeSerialNumber"].Value; } /// <summary> /// BIOSのシリアル番号を得る /// </summary> /// <returns></returns> static public string getBiosNo() { ManagementScope scope = new ManagementScope("root\\cimv2"); scope.Connect(); System.Management.ObjectQuery q = new System.Management.ObjectQuery("select SerialNumber from Win32_BIOS"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, q); ManagementObjectCollection co = searcher.Get(); var lst = co.Cast<ManagementObject>().Select(o => o.GetPropertyValue("SerialNumber").ToString()); return string.Join("-", lst.ToArray()); } /// <summary> /// MACアドレスを得る(複数個) /// </summary> /// <returns></returns> static public string getMacAddr() { var ifs = NetworkInterface.GetAllNetworkInterfaces(); var lst = ifs.Select(nif => nif.GetPhysicalAddress().ToString()); return string.Join("-", lst.ToArray()); } }
*
コメント
コメントを投稿