Windows下C语言mingw64获取硬盘和网卡cpu序列号
在Windows下,可以使用WMI(Windows Management Instrumentation)来获取硬盘和网卡的序列号。以下是使用C语言和mingw64编译器获取硬盘和网卡序列号的示例代码:
#include <windows.h>
#include <stdio.h>
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
void GetDiskSerialNumber()
{
HRESULT hres;
// 初始化COM库
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
printf("Failed to initialize COM library. Error code = 0x%x\n", hres);
return;
}
// 设置COM安全级别
hres = CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
NULL);
if (FAILED(hres))
{
printf("Failed to initialize security. Error code = 0x%x\n", hres);
CoUninitialize();
return;
}
// 创建WMI服务
IWbemLocator* pLoc = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID*)&pLoc);
if (FAILED(hres))
{
printf("Failed to create IWbemLocator object. Error code = 0x%x\n", hres);
CoUninitialize();
return;
}
// 连接WMI服务
IWbemServices* pSvc = NULL;
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"),
NULL,
NULL,
0,
NULL,
0,
0,
&pSvc);
if (FAILED(hres))
{
printf("Failed to connect to IWbemServices. Error code = 0x%x\n", hres);
pLoc->Release();
CoUninitialize();
return;
}
// 设置WMI查询语言
hres = CoSetProxyBlanket(
pSvc,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE);
if (FAILED(hres))
{
printf("Failed to set proxy blanket. Error code = 0x%x\n", hres);
pSvc->Release();
pLoc->Release();
CoUninitialize();
return;
}
// 执行查询
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery(
_bstr_t("WQL"),
_bstr_t("SELECT * FROM Win32_PhysicalMedia"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
printf("Failed to execute query. Error code = 0x%x\n", hres);
pSvc->Release();
pLoc->Release();
CoUninitialize();
return;
}
// 获取查询结果
IWbemClassObject* pclsObj = NULL;
ULONG uReturn = 0;
while (pEnumerator)
{
hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (0 == uReturn)
{
break;
}
VARIANT vtProp;
hres = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);
if (SUCCEEDED(hres))
{
printf("Disk Serial Number: %ls\n", vtProp.bstrVal);
VariantClear(&vtProp);
}
pclsObj->Release();
}
// 释放资源
pSvc->Release();
pLoc->Release();
CoUninitialize();
}
void GetMACAddress()
{
HRESULT hres;
// 初始化COM库
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
printf("Failed to initialize COM library. Error code = 0x%x\n", hres);
return;
}
// 设置COM安全级别
hres = CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
NULL);
if (FAILED(hres))
{
printf("Failed to initialize security. Error code = 0x%x\n", hres);
CoUninitialize();
return;
}
// 创建WMI服务
IWbemLocator* pLoc = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID*)&pLoc);
if (FAILED(hres))
{
printf("Failed to create IWbemLocator object. Error code = 0x%x\n", hres);
CoUninitialize();
return;
}
// 连接WMI服务
IWbemServices* pSvc = NULL;
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"),
NULL,
NULL,
0,
NULL,
0,
0,
&pSvc);
if (FAILED(hres))
{
printf("Failed to connect to IWbemServices. Error code = 0x%x\n", hres);
pLoc->Release();
CoUninitialize();
return;
}
// 设置WMI查询语言
hres = CoSetProxyBlanket(
pSvc,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE);
if (FAILED(hres))
{
printf("Failed to set proxy blanket. Error code = 0x%x\n", hres);
pSvc->Release();
pLoc->Release();
CoUninitialize();
return;
}
// 执行查询
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery(
_bstr_t("WQL"),
_bstr_t("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
printf("Failed to execute query. Error code = 0x%x\n", hres);
pSvc->Release();
pLoc->Release();
CoUninitialize();
return;
}
// 获取查询结果
IWbemClassObject* pclsObj = NULL;
ULONG uReturn = 0;
while (pEnumerator)
{
hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (0 == uReturn)
{
break;
}
VARIANT vtProp;
hres = pclsObj->Get(L"MACAddress", 0, &vtProp, 0, 0);
if (SUCCEEDED(hres))
{
printf("MAC Address: %ls\n", vtProp.bstrVal);
VariantClear(&vtProp);
}
pclsObj->Release();
}
// 释放资源
pSvc->Release();
pLoc->Release();
CoUninitialize();
}
int main()
{
printf("Getting disk serial number:\n");
GetDiskSerialNumber();
printf("\nGetting MAC address:\n");
GetMACAddress();
return 0;
}
请注意,此代码需要链接wbemuuid.lib库。你可以在命令行中使用以下命令编译代码:
gcc your_code.c -o your_code.exe -lole32 -lwbemuuid
其中your_code.c是保存上述代码的文件名,your_code.exe是生成的可执行文件名
原文地址: http://www.cveoy.top/t/topic/h4tW 著作权归作者所有。请勿转载和采集!