64bit環境のPC上で、WMIでマザーボードとバイオスのIDを取得する必要があります。
32bit PCでは以下のコードで問題なく取得できたのですが、64bit環境では取得できませんでした。
(CPU IDなどは両環境で取得できました)
64bit環境でWMIを使用してマザーボードとバイオスのIDを取得する方法をご存知の方がいましたら、
教えていただけないでしょうか?WMI以外でも取得方法がありましたら教えていただきたいです。
よろしくお願いたします。
開発言語:C++
マザーボードID:Win32_BaseBoard (SerialNumber)
バイオスID:Win32_BIOS (SerialNumber)
IWbemLocator* pLoc = NULL;
IWbemServices* pSvc = NULL;
--中略--
//マザーボードID取得
IEnumWbemClassObject* pEnumerator = NULL;
HRESULT hRes02 = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("Select * from Win32_BaseBoard"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (SUCCEEDED(hRes02)) {
IWbemClassObject *pclsObj = NULL;
_bstr_t bstrCpuID;
while (1)
{
ULONG uReturn;
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if(0 == uReturn)
{
break;
}
VARIANT vtProp;
VariantInit(&vtProp);
hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);
if(vtProp.vt == 1) {
break;
}
bstrCpuID = vtProp;
char* p = bstrCpuID;
strMbId = CString(p); //取得
break;
}
if(pclsObj) pclsObj->Release();
}
多分同じコードをvs2008で組んで試してみたけど、64BitVistaで”SerialNumber”を含む他情報は取れた。
32bitアプリとしてビルドしたexeをWOW64上で動かした時も、64Bitアプリとしてビルドしたexeを64BitVistaで動かした時も同じ結果が取れた。
http://msdn.microsoft.com/en-us/library/aa390789%28v=VS.85%29.aspx
上記ページに判りやすい図が載ってるけど、WOW64上で動いている32Bitアプリはデフォルトでは64BitOSの素?のレジストリ領域を見に行かない模様。
> 32bit PCでは以下のコードで問題なく取得できたのですが、64bit環境では取得できませんでした。
32bit環境では”素のレジストリ”を参照していたので情報を得られた。64bit環境では上記ページの図でいう”Registry WOW6432Node”を参照した。
だが”Registry WOW6432Node”には”素のレジストリ”にはあるのと同じ情報が登録されていなかったので失敗した。
とか仮定はできないだろうか?
改めてだけど、俺の環境では 32/64 bitアプリ共に情報取れてるポイ。よって↑は「マサさんの環境では」という仮定。
http://msdn.microsoft.com/en-us/library/aa393067%28v=VS.85%29.aspx
デフォルト参照先以外のレジストリを参照する為の情報…だと思われる(内容確認まではしてないんで…違ったらゴメン)
返信遅れて申し訳ありません。ありがとうございます。
環境によって取れたり取れなかったり、ということだと少し困ります。
上記のリンク先を熟読させていただきます。
PC単位でユニークな情報がほしかったので、マザーボードとバイオスのIDのシリアル値を使用しようとしましたが、他のユニークな値が使用できないかも含めて考え直そうと思います。
ツイート | ![]() |