Как изменить свойство WinCon_NetworkAdapter NetConnectionID с помощью WMI - PullRequest
1 голос
/ 16 февраля 2012

Я пишу программу 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=%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 не вступил в силу?

Спасибо.

1 Ответ

0 голосов
/ 06 декабря 2013

Насколько я понимаю, 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();

Надеждаэто помогает!

...