ソフトにプロテクトをかけたい、特定のパソコンだけで使えるようにしたい、というときには、まずはパソコンの識別情報をゲットする必要がある。
普通の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());
}
}
*
コメント
コメントを投稿