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