HDDのSerianNumberを取得する方法
レジストリキーの
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi
以下のTreeに
\Scsi Port w\Scsi Bus x\Target Id y\Logical Unit Id z\SerialNumber
という値が存在するので、これを利用することにしました。
Wmi32_DiskDriveを使って、次のようなロジックで処理しました。
WmiResult disk_drive = wmi.access(_T("SELECT * FROM Win32_DiskDrive")); if (disk_drive.items() == 0) { String msg = wmi.getErrorMessage(); return; } COUT << disk_drive.print(); for (size_t i = 0; i < disk_drive.size(); i++) { String reg_key = WmiCall::createSelect(_T("HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port %d\\Scsi Bus %d\\Target Id %d\\Logical Unit Id %d"), disk_drive.getLong(_T("SCSIPort"), i), disk_drive.getLong(_T("SCSIBus"), i), disk_drive.getLong(_T("SCSITargetId"), i), disk_drive.getLong(_T("SCSILogicalUnit"), i), NULL); HKEY hkey = NULL; int rc = ERROR_SUCCESS; if ((rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg_key.c_str(), 0, KEY_READ, &hkey)) == ERROR_SUCCESS) { DWORD buffSize = 0; DWORD valueType = 0; rc = RegQueryValueEx(hkey, _T("SerialNumber"), 0, &valueType, NULL, &buffSize); String result; if (rc == ERROR_SUCCESS) { buffSize++; char *buff = (char *)calloc(buffSize, sizeof(char)); if (buff != NULL) { if (RegQueryValueEx(hkey, _T("SerialNumber"), 0, &valueType, (unsigned char *)buff, &buffSize) == ERROR_SUCCESS) { _bstr_t value = _bstr_t(buff); result = String((_TCHAR *)buff); } free(buff); } } RegCloseKey(hkey); if (!result.empty()) { COUT << _T("SerialNumber = ") << result << endl; } } }