如何获取局域网中映射网络驱动器Z:的硬盘序列号?
网络映射驱动器获取远程硬盘序列号的解决方案
你遇到的问题根源在于:映射的网络驱动器Z:是本地系统建立的逻辑链接,指向远程共享资源,并非本地物理磁盘设备。用CreateFile(L"\\.\Z:", ...)这种访问本地磁盘设备的方式完全不适用,必然返回INVALID_HANDLE_VALUE。
正确实现思路
要获取远程计算机(比如COMP1)的物理硬盘序列号,需通过**Windows管理规范(WMI)**跨网络查询目标机器的硬件信息,这是Windows平台下远程硬件信息采集的标准方式。
具体步骤与代码示例
获取映射驱动器对应的UNC路径
先把Z:转换成远程共享的UNC路径(比如\\COMP1\SharedFolder),可通过WNetGetConnection函数实现:wchar_t uncPath[MAX_PATH] = {0}; DWORD bufferSize = MAX_PATH; if (WNetGetConnection(L"Z:", uncPath, &bufferSize)) { // 处理错误:驱动器未映射或无权限 } // 从uncPath中提取远程计算机名,例如"COMP1"通过WMI查询远程硬盘序列号
以下是C++中使用WMI连接远程计算机并查询硬盘序列号的核心代码片段:// 初始化COM环境 HRESULT hres = CoInitializeEx(0, COINIT_MULTITHREADED); hres = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL ); // 连接远程计算机的WMI服务 IWbemLocator* pLoc = NULL; hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc); IWbemServices* pSvc = NULL; wchar_t wmiPath[256]; swprintf_s(wmiPath, L"\\\\COMP1\\root\\cimv2"); hres = pLoc->ConnectServer( _bstr_t(wmiPath), NULL, // 需要权限时填写远程用户名 NULL, // 需要权限时填写远程密码 0, NULL, 0, 0, &pSvc ); // 设置安全级别 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 ); // 查询Win32_DiskDrive类获取硬盘序列号 IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT SerialNumber FROM Win32_DiskDrive"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator ); // 遍历查询结果 IWbemClassObject* pclsObj = NULL; ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (uReturn == 0) break; VARIANT vtProp; hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0); if (vtProp.vt == VT_BSTR && vtProp.bstrVal) { // 此处获取到远程硬盘的序列号 wprintf(L"硬盘序列号: %s\n", vtProp.bstrVal); } VariantClear(&vtProp); pclsObj->Release(); } // 释放资源 pEnumerator->Release(); pSvc->Release(); pLoc->Release(); CoUninitialize();
关键注意事项
- 目标计算机必须开启**Windows Management Instrumentation(WMI)**服务(服务名Winmgmt)
- 当前程序运行用户需拥有远程计算机的管理员权限或WMI访问权限
- 远程计算机防火墙需允许WMI通信(默认开放135端口及动态RPC端口)
- 部分硬盘未设置序列号会返回空值,需做好容错处理
内容的提问来源于stack exchange,提问作者pucher
相关产品推荐
相关产品推荐

