如果你不想使用C++11标准,可以尝试以下方法获取硬盘序列号:
- 使用Windows API(适用于Windows系统):
#include <iostream>
#include <windows.h>
std::string getHardDriveSerialNumber() {
DWORD serialNumber;
if (GetVolumeInformation("C:\\", NULL, 0, &serialNumber, NULL, NULL, NULL, 0)) {
char buffer[20];
snprintf(buffer, sizeof(buffer), "%04X-%04X", HIWORD(serialNumber), LOWORD(serialNumber));
return std::string(buffer);
}
return "";
}
int main() {
std::string serialNumber = getHardDriveSerialNumber();
if (!serialNumber.empty()) {
std::cout << "Hard Drive Serial Number: " << serialNumber << std::endl;
} else {
std::cout << "Failed to retrieve the hard drive serial number." << std::endl;
}
return 0;
}
这段代码使用了GetVolumeInformation
函数来获取C盘的卷序列号。
- 使用WMI(适用于Windows系统):
#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
std::string getHardDriveSerialNumber() {
HRESULT hr;
// 初始化COM库
hr = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hr)) {
throw std::runtime_error("Failed to initialize COM library.");
}
// 设置COM安全级别
hr = CoInitializeSecurity(
nullptr,
-1,
nullptr,
nullptr,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
nullptr,
EOAC_NONE,
nullptr
);
if (FAILED(hr)) {
CoUninitialize();
throw std::runtime_error("Failed to initialize COM security.");
}
// 获取WMI服务
IWbemLocator* pLocator = nullptr;
hr = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
reinterpret_cast<LPVOID*>(&pLocator)
);
if (FAILED(hr)) {
CoUninitialize();
throw std::runtime_error("Failed to create WbemLocator instance.");
}
IWbemServices* pServices = nullptr;
// 连接WMI服务
hr = pLocator->ConnectServer(
L"ROOT\\CIMV2",
nullptr, nullptr, nullptr, 0, nullptr, nullptr, &pServices
);
if (FAILED(hr)) {
pLocator->Release();
CoUninitialize();
throw std::runtime_error("Failed to connect to WMI service.");
}
// 设置验证信息
hr = CoSetProxyBlanket(
pServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE,
NULL, EOAC_NONE
);
if (FAILED(hr)) {
pServices->Release();
pLocator->Release();
CoUninitialize();
throw std::runtime_error("Failed to set proxy blanket.");
}
IEnumWbemClassObject* pEnumerator = NULL;
hr = pServices->ExecQuery(
BSTR(L"WQL"), BSTR(L"SELECT * FROM Win32_PhysicalMedia"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
if (FAILED(hr)) {
pServices->Release();
pLocator->Release();
CoUninitialize();
throw std::runtime_error("Failed to execute WQL query.");
}
IWbemClassObject* pObject = nullptr;
ULONG returnedCount = 0;
std::string serialNumber;
// 遍历查询结果
while ((hr = pEnumerator->Next(WBEM_INFINITE, 1, &pObject, &returnedCount)) == S_OK) {
VARIANT vtProp;
// 获取序列号属性
hr = pObject->Get(L"SerialNumber", 0, &vtProp, 0, 0);
if (SUCCEEDED(hr) && vtProp.vt == VT_BSTR) {
serialNumber = _com_util::ConvertBSTRToString(vtProp.bstrVal);
break;
}
VariantClear(&vtProp);
// 释放对象资源
pObject->Release();
}
// 释放资源
pEnumerator->Release();
pServices->Release();
pLocator->Release();
CoUninitialize();
return serialNumber;
}
int main() {
try {
std::string serialNumber = getHardDriveSerialNumber();
if (!serialNumber.empty()) {
std::cout << "Hard Drive Serial Number: " << serialNumber << std::endl;
} else {
std::cout << "Failed to retrieve the hard drive serial number." << std::endl;
}
return 0;
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
return 1;
}
}
这段代码使用了WMI(Windows Management Instrumentation)来查询硬盘的序列号。需要链接wbemuuid.lib
库,并确保编译器支持COM。
这些方法适用于Windows系统,如果你在其他操作系统上使用C++获取硬盘序列号,可能需要使用不同的方法或者库。
内容由零声教学AI助手提供,问题来源于学员提问