ドライブのGuidを取得する

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

WindowsにてHDDなどのドライブを認識する際、デバイスIDとしてGUIDが設定されています。これを取得してライセンス認証等に使えないかなと思い、情報を探してみたら…あっさり見つかりました。
ライセンスなどの固有のキーが必要な時に便利なんじゃないかなって思います。CドライブのGUIDを…ってすればそのコンピューターのそのOSでのみ認識なんてことができますからね

system-management

参照設定

さて、まずドライブの詳細情報を取得するために使うクラスはManagementObjectSearcherクラスです。
System.Managementアセンブリに定義されているので参照設定しておきましょう。
このクラスでドライブの、OSで管理されている情報を取得することができます。
例えばこのような感じ
\\SHARORON-PC\root\cimv2:Win32_Volume.DeviceID=”\\\\?\\Volume{53b8d820-c68a-453f-8553-33b09cb7fcf2}\\”
この後ろの部分のGUIDを取り出して使います。
コンピューターで認識している、ドライブ文字をもったドライブを列挙する場合はこのようになります。

ManagementObjectSearcher ms = new ManagementObjectSearcher("Select * from Win32_Volume");
foreach (ManagementObject mo in ms.Get())
{
    string guid = mo["DeviceID"].ToString();
    // ドライブレターが設定されていない場合判定しない
    if (!(mo["DriveLetter"] == null || !(mo["DriveLetter"] is string) || mo["DriveLetter"].ToString().Length == 0))
    {
        var mct = Regex.Match(guid, @"{([A-Fa-f0-9]{8})\-([A-Fa-f0-9]{4})\-([A-Fa-f0-9]{4})\-([A-Fa-f0-9]{4})\-([A-Fa-f0-9]{12})}");
        if (mct != null)
            guid = mct.Groups[0].Value;
        Console.WriteLine("{0}: {1}", mo["DriveLetter"].ToString().Substring(0, 1), guid);
    }
}

正規表現でGUIDを取り出しています。 多分ないとは思いますが、GUIDが含まれていなければそのままのデバイスIDを渡しています。
drive-guid
私の作っているソフトウェアで、コンピュータ別に認証するタイプのライセンスを組み込む際はこの方法も取り入れています。
ドライブのデバイスGuidは変更することはできないと思いますし、その辺りの問題はないかと思って…
問題は、同じコンピュータを使っていてもOSが変わればライセンスが認証しなくなるということ。かなり厳しめのライセンスになっちゃいますね