学习笔记之Management命名空间
using System.Management;
ManagementClass(string WIM_NAME);
通过 ManagementClass类,访问某WMI;
ManagmentClass.GetInstances() 返回关于WMI的实例,返回类型:ManagementObjectCollection,。表示通过 WMI 检索到的管理对象的不同集合,此集合中的对象为从 ManagementBaseObject 派生的类型,包括 ManagementObject 和 ManagementClass。通过 ManagementObjectSearcher 对象执行 WMI 查询,或者通过表示指定类型的 ManagementClass 检索该类型管理对象的枚举,可得到此集合。此外,这也可能是以指定方式与特定管理对象相关的管理对象集合 — 在这种情况下,此集合可以通过诸如 GetRelated() 之类的方法检索到。此集合可以通过 ManagementObjectCollection.ManagementObjectEnumerator 遍历,并且能够针对各种管理任务对集合中的对象进行检查或操作。
ManagemenObjectCollection.Count 属性表示这个返回的WMI实例的集合中的条目,
比如Win32_IP4RouteTable 返回的实例的Count 属性就是当前电脑的路由表中路由条数,你也可以用CMD命令route print来进行显示路由条数进行对比确认
foreach(ManagementObject mo in ManagementObjectCollection )
通过循环取出集合 的单个路由可以进行操作。
mo.put(); 这个函数官方解释是提交对ManagementObject 的修改操作,
但如果你修改mo 的某个属性,再执行put,其实是添加了新的一条路由,而不是在的来的基础上进行的修改,原来的路由还是会保留。
所以,如果你想要修改某条路由,可以先复制一份,再执行put,然后执行Delete(),把原来的那条进行删除操作。达到修改的效果。
以上两个操作在 win7中会抛出UnauthorizedAccessException异常,原因在于WIN7的UAC权限限制了。只有用管理员方式运行就不会出现异常,请注意处理异常,
Win32_IP4RouteTable 官方说明http://msdn.microsoft.com/en-us/library/aa394162(v=vs.85).aspx
其中我们常用的字段为:
Destination 目标IP
Mask 子网掩码
NextHop 网关,也就是俗称下一跳
Metric1 跳数,也就是到达目标要经过的路由器数量,值越小越优先,
InterfaceIndex 就称为网卡的ID吧,每张网卡在电脑里都会有个唯一对应ID,通过route print CMD命令可以查看到网卡对应ID。
接口列表
13...bc ae c5 25 07 0f ......JMicron PCI Express Gigabit Ethernet Adapte
11...48 5d 60 26 7c 3d ......Atheros AR5007EG Wireless Network Adapter
14...00 50 56 c0 00 01 ......VMware Virtual Ethernet Adapter for VMnet1
15...00 50 56 c0 00 08 ......VMware Virtual Ethernet Adapter for VMnet8
这个接口列表就是我电脑上的接口列表 11 就是我笔记本无线网卡的接口,13是有线网卡的接口,14,15 是虚拟机的网卡,
更多字段详见官方说明了。
说差不多了,上个源码,更明白
ManagementClass routeClass = new ManagementClass("Win32_IP4routeTable");
ManagementObjectCollection routeColl = routeClass.GetInstances();
if (routeColl.Count > 0)
{
foreach (ManagementObject mo in routeColl)
{
Console.WriteLine("目标IP: {0}\t掩码: {1}\t网关: {2}\t跳数: {3}",mo["Destination"], mo["Mask"], mo["NextHop"], mo["Metric1"]);
if (mo["Destination"].ToString() == "0.0.0.0") //不用直接用mo["Destination"]进行比对,会提示需要
//警告 1 可能非有意的引用比较;若要获取值比较,请将左边转换为类型“string” 并且结果是 false
{
//mo["Nexthop"] = "192.168.1.6";
//mo["Type"] = 2; //不管用,Type = 2 表示无效,用put提交后没效果,
try
{
mo.Delete(); //删除这条路由。
}
catch (UnauthorizedAccessException)
{
MessageBox.Show("添加修改路由表无权限,请以管理员权限执行程序");
}
Console.WriteLine("目标IP: {0}\t掩码: {1}\t网关: {2}\t跳数: {3} 修改版", mo["Destination"], mo["Mask"], mo["NextHop"], mo["Metric1"]);
}
}
}
好了,暂时只了解到这么多,有问题再回来修改,网上都找不到用WMI 修改东西的路由表的资料,用的好多是一个DLL API函数