C++通过WMI修改IP,网关,DNS不重启(支持WIN7,VISTA)
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
以前也做过修改IP的方法,感觉都不是最完美的,我觉得最完美的方法就是WMI了,所有在上次封装的WMI类中再封装了一下,可以简单的修改IP,GATEWAY ,DNS。
主要在上一篇文章中的网卡类中添加了四个成员函数
HRESULT SetIPAddress(CComBSTR* pArraybstrIp,CComBSTR* pArraybstrMask,const int& arraryCount,LONG* plReturn = NULL)
HRESULT EnableDCPH(LONG* plReturn = NULL)
HRESULT SetDNS(CComBSTR* pArraybstrDNS,const int& arraryCount,LONG* plReturn = NULL)
HRESULT SetGateWay(CComBSTR* pArraybstrGateWay,BYTE* pArraybyteMetric,const int& arraryCount,LONG* plReturn = NULL)
下面我来说一下这四个函数的用法。
第一个是设置IP:
第一个参数pArraybstrIp是指向一个IP地址的数组,可以添加多个IP
例如:CComBSTR ip[2] = {L”172.16.202.47″,L”192.168.1.27″}
第二个参数; pArraybstrMask指向一个子网掩码的数组,
例如:CComBSTR mask[2] = {L”255.255.255.0″,L”255.255.255.0″};
第三个参数:arraryCount要修改IP地址的个数
第四个参数:plReturn是修改IP后的返回值
这个函数的返回值是指这个函数是否调用成功
IP和子网掩码是一一对应的,所有第一个参数元素的个数一定要与第二个参数个数一样,否则无法修改成功
如果要把IP修改为172.16.202.47和192.168.1.27完整代码如下
CComBSTR ip[2] = {L”172.16.202.47″,L”192.168.1.27″};
CComBSTR mask[2] = {L”255.255.255.0″,L”255.255.255.0″};
hres = pObj.SetIPAddress(ip,mask,2);
第二个函数:设置IP为自动获取
第三个函数:设置DNS
第四个函数:设置网关
另外三个函数的用法第一个函数差不多这里我就不多介绍了,需要详细了解可以去我的给出的地址下载。
这里我再贴一个个完整修改IP,GATEWAY,DNS的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#include <iostream> #define ASSERT(f) ATLASSERT(f); #include "..\wmi\CNetAdapterWMI.h" using namespace std; void main() { HongLib::CInitWMI::CoInitializeEx(); HongLib::CInitWMI ai; HRESULT hres = ai.ConnectLocalSrv(L"root\\cimv2"); if(FAILED(hres)) { cout<<"连接网络适配器失败"<<endl; return; } else { cout<<"连接网络适配器成功"<<endl; } ai.EnumExecQuery(L"SELECT * from Win32_NetworkAdapterConfiguration where IPEnable = -1");///////这里修改的是所有能设置IP的网卡 while(1) { CNetAdpCfgObjWMI pObj(ai.GetServicesHandle()); hres = ai.NextClassObject(pObj); if(FAILED(hres)) { break; } ////////MASK的元素个数和ip的要一样,不然函数无法执行成功 CComBSTR ip[2] = {L"172.16.202.47",L"192.168.1.27"}; CComBSTR mask[2] = {L"255.255.255.0",L"255.255.255.0"}; ////////gateway的元素个数和metric的要一样,不然函数无法执行成功 CComBSTR gateway[1] = {L"172.16.202.1"}; BYTE metric[1] = {1};////////网关的阶跃点 CComBSTR dns[2] = {L"24.44.4.47",L"24.44.8.64"}; LONG lRet; HRESULT hres = pObj.SetGateWay(gateway,metric,1); hres = pObj.SetIPAddress(ip,mask,2); hres = pObj.SetDNS(dns,2,&lRet); cout<<"error code:"<<lRet<<endl; /// pObj.EnableDCPH(); if(SUCCEEDED(hres)) { cout<<"执行成功"<<endl; } else { cout<<"执行失败"<<endl; } } ai.CleanEnum(); ai.DisConnect(); HongLib::CInitWMI::CoUninitialize(); } |
学习日记,兼职软件设计,软件修改,毕业设计。
本文出自 学习日记,转载时请注明出处及相应链接。
本文永久链接: https://www.softwareace.cn/?p=543
2条评论
请问 头文件爱那里?
谢谢