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

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

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


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

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

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

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

まずは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());
    }
}

コメント

このブログの人気の投稿

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