You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取局域网中映射网络驱动器Z:的硬盘序列号?

网络映射驱动器获取远程硬盘序列号的解决方案

你遇到的问题根源在于:映射的网络驱动器Z:是本地系统建立的逻辑链接,指向远程共享资源,并非本地物理磁盘设备。用CreateFile(L"\\.\Z:", ...)这种访问本地磁盘设备的方式完全不适用,必然返回INVALID_HANDLE_VALUE。

正确实现思路

要获取远程计算机(比如COMP1)的物理硬盘序列号,需通过**Windows管理规范(WMI)**跨网络查询目标机器的硬件信息,这是Windows平台下远程硬件信息采集的标准方式。

具体步骤与代码示例

  1. 获取映射驱动器对应的UNC路径
    先把Z:转换成远程共享的UNC路径(比如\\COMP1\SharedFolder),可通过WNetGetConnection函数实现:

    wchar_t uncPath[MAX_PATH] = {0};
    DWORD bufferSize = MAX_PATH;
    if (WNetGetConnection(L"Z:", uncPath, &bufferSize)) {
        // 处理错误:驱动器未映射或无权限
    }
    // 从uncPath中提取远程计算机名,例如"COMP1"
    
  2. 通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:52:51