首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用WMI更改Win32_NetworkAdapter NetConnectionID属性

如何使用WMI更改Win32_NetworkAdapter NetConnectionID属性
EN

Stack Overflow用户
提问于 2012-02-16 17:34:59
回答 1查看 1.9K关注 0票数 1

我正在编写一个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

代码语言:javascript
复制
NetConnectionID 
Data type: string 
Access type: Read/write

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

代码语言:javascript
复制
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为OK,但此属性值未更改。

代码语言:javascript
复制
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方法没有生效?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-12-06 16:11:37

据我所知,IWbemClassObject::Put()只在内存中更新类实例的属性值。要将更改提交到WMI存储库,您需要调用IWbemServices::PutInstance()来更新整个类实例。

所以在你的代码中添加一些类似这样的东西应该会让它工作起来:

代码语言:javascript
复制
IWbemCallResult* callResult = nullptr;
HRESULT hr = wbemSvc_->PutInstance(pClass, WBEM_FLAG_UPDATE_ONLY,
    nullptr, &callResult);
if (SUCCEEDED(hr) && callResult)
    callResult->Release();

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9308705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档