2012-02-16 53 views
1

我在寫一個需要更改網絡連接名稱(例如「本地連接」)的VC++程序。如何使用WMI更改Win32_NetworkAdapter NetConnectionID屬性

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=%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方法沒有生效嗎?

謝謝。

回答

0

據我所知,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(); 

希望幫助!