c++ - 如何使用 WMI 更改 Win32_NetworkAdapter NetConnectionID 属性

标签 c++ windows networking wmi

我正在编写一个需要更改网络连接名称(例如“本地连接”)的 VC++ 程序。

Windows的IPHELPER提供了获取网络连接的API,但是没有提供write方法。 而且我知道我可以使用“netsh”来更改此网络连接名称,是的,在英文 Windows 中,此方法可以正常工作,但在日文或中文 Windows 中此方法无法正常工作。

在阅读了MSDN 中的一些文档后,我发现WMI Win32_NetworkAdapter 类有一个属性“NetConnectionID”。此属性包含适配器的网络连接名称及其读/写属性。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa394216(v=vs.85).aspx

NetConnectionID 
Data type: string 
Access type: Read/write

因此,我编写了一个 WMI 代码来更改此属性值。

int RasWmiAdapterSetInfo(void *pWmiAdapterCfg)
{
    if(pWmiAdapterCfg)
    {
        int retVal = -1;
        HRESULT hres;
        VARIANT varWrite;
        RAS_WMI_W32_ADAPTER_PTR *pRasWmiAdapterCfg = (RAS_WMI_W32_ADAPTER_PTR*)pWmiAdapterCfg;

        VariantInit(&varWrite);
        V_VT(&varWrite) = VT_BSTR;
        V_BSTR(&varWrite) = SysAllocString(L"My New Connection 1");
        hres = pRasWmiAdapterCfg->pclsObj->Put(L"NetConnectionID", 0, &varWrite, 0);
        if(FAILED(hres))
        {
            printf("RasWmiAdapterSetInfo Failed HR=%08x\n", hres);
            goto CLEARUP;
        }
        retVal = 0;
CLEARUP:

        VariantClear(&varWrite);
        return retVal;
    }
    return -1;
}

返回值hres没问题,但是这个属性值没有改变。

IWbemLocator         *pLoc;
IWbemServices        *pSvc;
IEnumWbemClassObject *pEnumerator; 
 ...
 ... (ignore some code to init pLoc, pSvc, pEnumerator)
 ...
IWbemClassObject *pclsObj;
IWbemClassObject *pClass;
pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
pSvc->GetObject( bstr_t(adapterClsName), 0, NULL, &pClass, NULL );

谁能告诉我为什么pclsObj->Put方法没有生效?

谢谢。

最佳答案

据我了解,IWbemClassObject::Put() 仅更新内存中类实例的属性值。要提交对 WMI 存储库的更改,您需要调用 IWbemServices::PutInstance() 来更新整个类实例。

所以在你的代码中添加这样的东西应该可以让它工作:

IWbemCallResult* callResult = nullptr;
HRESULT hr = wbemSvc_->PutInstance(pClass, WBEM_FLAG_UPDATE_ONLY,
    nullptr, &callResult);
if (SUCCEEDED(hr) && callResult)
    callResult->Release();

希望对您有所帮助!

关于c++ - 如何使用 WMI 更改 Win32_NetworkAdapter NetConnectionID 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9308705/

相关文章:

windows - 从 Windows 机器 SSH 到 Kubernetes 主节点

c++ - 修复 "disconnected"Windows 驱动器映射

python - 我的套接字程序不打印输出

c++取消引用通过引用传递分配的指针,给出随机值

c++ - 为什么 int x{ y = 5 } 可能?

c++ - 如何使用 C++ 将数据写入大于 4GB 的文件?

c++ - 当我们覆盖 cv::Mat.data 时会发生什么

c - 未定义对 `_fcloseall' 的引用

windows - git svn clone -> 巨大存储库的转换一直崩溃 - 有补救措施吗?

java - RMI 线程阻止 JVM 在 main() 完成后退出