HEXA BLOG
ヘキサブログ
プログラム
ドングル
すっかり梅雨ですが雨
にも負けず、
休日はバイクで駆け抜けるgood sun
こと山口です。
お久しぶりで御座います。
さて少し前に自宅での3DCGのアニメーション用に
messiah studio(http://www.projectmessiah.com/)というソフトを超キャンペーン価格で購入したのですが、
このソフトのライセンス認証が少し面白い仕組みになっていました。
市販のUSBメモリをハードウェアキーとして動作させるのです。
昔はライセンス認証の為だけに専用のドングルと呼ばれるハードウェアを使っていたのですが、
果たして市販のUSBメモリがその役目を果たせるのか気になったので少し調べてみました。
するとWindowsではWMIという機能でディスクドライブのユニークなIDを取得できるようです。
ソースコードも沢山見つける事が出来たのですが、
C#やVBのコードばかりでしたので、C++ではどう書いたら良いのか試しに書いてみました。
今回はUSBのディスクドライブを列挙してその固有IDを表示するものです。
(ソースコードはVisualStudio2010のコンソールアプリケーションで動作確認しています。)
#define _WIN32_DCOM
#include <iostream>
#include <windows.h>
#include <chstring.h>
#include <comdef.h>
#include <Wbemidl.h>
using namespace std;
#pragma comment(lib, "wbemuuid.lib")
int main(int argc, char **argv){
IWbemLocator *wbem_locator = NULL;
IWbemServices *wbem_services = NULL;
IEnumWbemClassObject *wbem_enumerator = NULL;
// まずはCOMの初期化とか
CoInitializeEx(0, COINIT_MULTITHREADED);
CoInitializeSecurity(NULL, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL, EOAC_NONE, NULL);
// WMIにアクセスするためのインスタンス作成
CoCreateInstance(CLSID_WbemLocator, 0,
CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<LPVOID*>&wbem_locator));
// root\cimv2名前空間に接続
wbem_locator->ConnectServer(_bstr_t(L"\\\\.\\ROOT\\CIMV2"),
NULL, NULL, 0, NULL,
0, 0, &wbem_services);
CoSetProxyBlanket(wbem_services,
RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
// USBインターフェースのディスクドライブを取得するクエリを発行
wbem_services->ExecQuery(bstr_t(L"WQL"),
bstr_t(L"SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'"),
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY,
NULL, &wbem_enumerator);
IWbemClassObject *wbem_object = NULL;
ULONG returned = 0;
while(wbem_enumerator){
wbem_enumerator->Next(WBEM_INFINITE, 1, &wbem_object, &returned);
if(returned == 0){
break;
}
VARIANT value;
VariantInit(&value);
// ここで取得できる文字列がUSBの固有ID
wbem_object->Get(L"PNPDeviceID", 0, &value, 0, 0);
cout << static_cast<char*>(bstr_t(value)) << endl;
VariantClear(&value);
}
wbem_services->Release();
wbem_locator->Release();
wbem_enumerator->Release();
if(wbem_object){
wbem_object->Release();
}
CoUninitialize();
return 0;
}
COMの初期化関係で行数が多いですが、
実質はインスタンス作成部分から固有ID取得までが目的の処理になります。
この固有IDを基にしたライセンスファイルを作成して、
アプリケーション起動時に二つの整合性を確認出来れば確かにハードウェアキーとして使えそうです。
面白くなってきたのでもしかしたら次回に続くかもしれないです。
CATEGORY
- about ヘキサ (166)
- 部活動 (6)
- CG (18)
- プロジェクトマネジメント (1)
- 研修 (5)
- 美学 (1)
- いいモノづくり道 (227)
- 採用 -お役立ち情報も- (149)
- プログラム (189)
- デザイン (99)
- ゲーム (273)
- 日記 (1,104)
- 書籍紹介 (113)
- その他 (889)
- 就活アドバイス (20)
- ラーメン (3)
- ライフハック (25)
- イベント紹介 (10)
- 料理 (23)
- TIPS (7)
- 怖い話 (3)
- サウンド (6)
- 子育て (1)
- 筋トレ (1)
- NicO (3)
- MakeS (9)
- 商品紹介 (21)
- アプリ紹介 (31)
- ソフトウェア紹介 (33)
- ガジェット紹介 (12)
- サイト紹介 (10)
- 研究・開発 (35)
- 回路図 (4)
- アナログゲーム (40)
- 交流会 (21)
- 報告会 (3)
- インフラ (25)
- グリとブラン (6)
- カメラ (9)
- クラフト (27)
- 部活 (14)
- 画伯 (15)
- カレー (6)
- 音楽(洋楽) (6)
- 映画・舞台鑑賞 (43)
- 飼育 (5)
- いぬ (8)
- ねこ (19)
ARCHIVE
- 2025年
- 2024年
- 2023年
- 2022年
- 2021年
- 2020年
- 2019年
- 2018年
- 2017年
- 2016年
- 2015年
- 2014年
- 2013年
- 2012年
- 2011年
- 2010年
- 2009年
- 2008年
- 2007年




