2012-02-16 21 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; 
} 

戻り値は正常ですが、このプロパティ値は変更されませんでした。

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(); 

希望を!