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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值