您的位置:首页 > 其它

WMI在VC中的使用 -- 设置DHCP和DNS

2012-08-10 20:14 78 查看
http://hi.baidu.com/vansbluge/item/4f0d94610e9a0d91c4d24934

此基础上加上了Index的获取,适用于多网卡的使用,Win7系统获取可以考虑InterfaceIndex的使用,因为Win32_NetworkAdapterConfiguration的interfaceIndex就是GetAdapterInfo中的Index。未实际尝试。

传入参数strAdapterName 为"{4D-...................3E}"类似格式,即IP_ADAPTER_INFO结构体中的AdapterName成员。可以用getadaptersinfo来获取。注意如果使用GetInterfaceInfo, struct IP_INTERFACE_INFO中的Adapter成员中的Name成员的格式是""\DEVICE\TCPIP_{C76EDB66-D5E5-45CF-99D6-0D0CB63D143D}"

前面带有前缀 "\DEVICE\TCPIP_",这个要处理掉前缀才能使用,有点多此一举,所以不如用GetAdaptersInfo.

HRESULT CNetworkBasicSettingWnd::EnableDHCPOnAdapter(CString strAdapterName)

{

HRESULT hr;

IWbemLocator *pLocator = NULL;

IWbemServices *pSvc = NULL;

IWbemClassObject *pClass = NULL;

IWbemClassObject *pInputParamClass = NULL;

IWbemClassObject *pInputParamInstance = NULL;

IWbemClassObject *pOutInst = NULL;

IEnumWbemClassObject * pEnumerator = NULL;

hr = CoInitializeEx(0, COINIT_MULTITHREADED);

hr = CoInitializeSecurity(NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_PKT_PRIVACY,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_SECURE_REFS,NULL);

int fIndex;

BSTR Path = SysAllocString(L"root\\cimv2");

BSTR ClassPath = SysAllocString(L"Win32_NetworkAdapterConfiguration");

BSTR MethodName1 = SysAllocString(L"SetDNSServerSearchOrder");

BSTR MethodName2 = SysAllocString(L"EnableDHCP");

LPCWSTR MethodName1ArgName = L"DNSServerSearchOrder";

hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void **)&pLocator);

hr = pLocator->ConnectServer(Path,NULL, NULL, NULL, 0, NULL, NULL, &pSvc);

hr = CoSetProxyBlanket( pSvc,

RPC_C_AUTHN_WINNT,

RPC_C_AUTHZ_NONE,

NULL,

RPC_C_AUTHN_LEVEL_CALL,

RPC_C_IMP_LEVEL_IMPERSONATE,

NULL,

EOAC_NONE);

if(!SUCCEEDED(hr))

{

PrintWMIError(hr);

return hr;

}

IWbemLocator *pLoc = 0;

hr = pSvc->ExecQuery(

bstr_t("WQL"),

bstr_t("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'and SettingID = '"+strAdapterName+"'"),

WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,

NULL,

&pEnumerator);

if (FAILED(hr))

{

cout << "Query for processes failed. "

<< "Error code = 0x"

<< hex << hr << endl;

PrintWMIError(hr);

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1; // Program has failed.

}

else

{

IWbemClassObject *pclsObj;

ULONG uReturn = 0;

if (pEnumerator)

{

hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

if(0 == uReturn)

{

PrintWMIError(hr);

}

VARIANT vtProp;

hr = pclsObj->Get(L"Index", 0, &vtProp, 0, 0);

wcout << "Process Name :" << vtProp.uintVal << endl;

fIndex = vtProp.uintVal;

VariantClear(&vtProp);

}

else

{

fIndex = 8;//我的XP机器单网卡的是index刚好是8,不知道是不是巧合

}

}

char indexString[10];

itoa(fIndex, indexString, 10);

char instanceString[100];

wchar_t w_instanceString[100];

strcpy(instanceString, "Win32_NetworkAdapterConfiguration.Index='");

strcat(instanceString, indexString);

strcat(instanceString, "'");

mbstowcs(w_instanceString, instanceString, 100);

BSTR InstancePath = SysAllocString(w_instanceString);

if(SUCCEEDED(hr))

hr = pSvc->GetObject(ClassPath, 0, NULL, &pClass, NULL);

if(!SUCCEEDED(hr))

{

PrintWMIError(hr);

return hr;

}

if(SUCCEEDED(hr))

hr = pClass->GetMethod(MethodName1, 0, &pInputParamClass, NULL);

if(!SUCCEEDED(hr))

{

PrintWMIError(hr);

return hr;

}

if(SUCCEEDED(hr))

hr = pInputParamClass->SpawnInstance(0, &pInputParamInstance);

if(!SUCCEEDED(hr))

{

PrintWMIError(hr);

return hr;

}

if(SUCCEEDED(hr))

hr = pInputParamInstance->Put(MethodName1ArgName, 0, NULL, 0);

if(!SUCCEEDED(hr))

{

PrintWMIError(hr);

return hr;

}

if(SUCCEEDED(hr))

hr = pSvc->ExecMethod(InstancePath, MethodName1, 0, NULL, pInputParamInstance, &pOutInst, NULL);

if(!SUCCEEDED(hr))

{

PrintWMIError(hr);

return hr;

}

if(SUCCEEDED(hr))

hr = pSvc->ExecMethod(InstancePath, MethodName2, 0, NULL, NULL, &pOutInst, NULL);

if(!SUCCEEDED(hr))

{

PrintWMIError(hr);

return hr;

}

SysFreeString(InstancePath);

SysFreeString(Path);

SysFreeString(ClassPath);

SysFreeString(MethodName1);

SysFreeString(MethodName2);

if(pOutInst)

pOutInst->Release();

if(pInputParamInstance)

pInputParamInstance->Release();

if(pInputParamClass)

pInputParamClass->Release();

if(pClass)

pClass->Release();

if(pSvc)

pSvc->Release();

if(pLocator)

pLocator->Release();

if(pLoc)

pLoc->Release();

CoUninitialize();

return 0;

}

void PrintWMIError(HRESULT hr)

{

IWbemStatusCodeText * pStatus = NULL;

HRESULT hres = CoCreateInstance(CLSID_WbemStatusCodeText, 0,

CLSCTX_INPROC_SERVER,IID_IWbemStatusCodeText, (LPVOID *) &pStatus);

if(S_OK == hres)

{

BSTR bstrError;

hres = pStatus-> GetErrorCodeText(hr, 0, 0, &bstrError);

if(S_OK != hres)

bstrError = SysAllocString(L"Get last error failed");

_bstr_t bstrTError = bstrError;

char* lpszError = bstrTError;

printf("%s\n", lpszError);

pStatus-> Release();

SysFreeString(bstrError);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: