如何使用WMI更改Win32_NetworkAdapter NetConnectionID属性
How to change Win32_NetworkAdapter NetConnectionID property using WMI
我正在编写一个VC++程序,该程序需要更改网络连接名称(例如"本地连接")。
Windows的IPHELPER提供了获取网络连接的API,但不提供写入方法。我知道我可以用"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=%08xn", 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();
希望能有所帮助!
相关文章:
- 没有找到相关文章