您的位置:首页 > 代理IP资讯
发布时间:2020-02-26 15:53:46
ip更改、基于WMI.NET动态修改IP地址的实现方法

  动态实时修改Windows系统[P地址组,是实现某些特定计算机安全管理目标的必要技术之一。但微软并未公开相关的Windows API函数,从而徒增实现难度。尽管有方法称借助未文档化的函数DhcpNotify ConfigChange()可以实现目的,不过却由于蕴含着不可测的风险而不能用于正式系统。本文将介绍基于WMI·N技术实现动态修改IP地址组的方法及其实际应用。


  2 WMI·N技术


  WMl(Windows Management Instrumenta—tion,Windows管理规范)是一项核心的Windows管理技术,是Windows2000及以后版本的一个内置组件。WMI使用基于“公共信息模型(CIM)"行业标准的类表示目标计算机的操作系统、进程、网络、设备和其他计算机组件,可以通过脚本语言或API编程实现对本地管理客户端系统中几乎一切软硬件信息的访问和管理田。正因如此,目前市面上很多专业的网络管理工具都是基于WMI开发的。


  .NET Framework中的WMI(简称"WMI.NET")是基于原始WMI技术的一种托管模式,属于·N Framework高级应用范畴。它不但可以实现与原始WMI相同的WMI数据访问和操作,而且能享有.NET Framework具有的诸多优势一一例如,利用公共语言运行库(CLR)功能、类定义和实例发布规范化、开发和调试简单、对象组织标准化较强等[2]。当然,WMI.NET的托管模式也带来局限性,例如不支持刷新器、不能在托管代码中创建“事件使用者提供程序"、暂不支持群集环境等原始WMI所没有的限制。


  WMI.NET相关类集中组织在System.Management和System.Management.Instrume—ntation这两个·N Framework命名空间,前者包括用于执行WMI查询和操作的类(例如收集WMI类信息、查询数据、执行方法等),后者包括实现向应用程序中添加WMI提供程序的类(创建数据提供程序、创建事件提供程序、注册提供程序)。


  3实现原理


  3·]WMI,N盯体系结构分层


  分层结构是WMI体系的显著特征,各层分别组织不同的对象、实现不同的功能。WM《体系主要分三层.客户访问层(Client Access Layer)、对象管理层(Objects Management Layer)、提供程序层(Provider Layer),如图1。其中,对象管理器是WMI提供程序层与客户访问层之间的中间装置,它提供一所a Expenence实践经验163计算机系统应用些关键服务,例如标准事件发布和订阅、事件筛选、查询引擎以及其他管理配置服务等[引。一般的管理工具软件主要作用在对象管理层,而较少涉及提供程序


  在.NET Framework托管平台中,对应该体系结构分别是口).NET应用程序。采用VB.NET、c#、」#、C++.NET、ASP·N訂等编程语言开发的Windows、Web应用程序或脚本程序。2)System.Management命名空间。承担了对WM《对象枚举或检索、调用WM丨类方法、订阅事件等诸多功能。其中有4个类较常用ManagementCIass,表示单个WMI类Manage mentObject,表示单个类实例;ManagementObJect Search,根据指定的条件查询或枚举检索类或实例的集合,ManagementQuery,用作所有查询类的基础。3)System.Management.lnstrumentation命名空间的类可以实现用户自行创建符合WMI规范的提供程序。


  3·2 WQL语句


  WMI类,实际上就是对一些给定软件或硬件组件的属性和功能的'抽象描述'。由于存在许多种类,因此WMI将它们组织到命名空间层次结构中(与·N


  Framework命名空间并无关联[3]),核心Windows OS类的命名空间称为root\cimv2,类按"Win32-XXX'格式命名。检索和管理必须基于类实例进行,所谓“实例"是指当前系统中“实际存在的类"。


  WQL(WMI Query Language)语言用来检索某WMI类的实例集合,它是标准SQL的一个子集加上164实践经验Pruncal ExpenenceWMI的扩展,只能执行SELECT操作,而其他如UPDATE、DELETE等DML语句无效。例如,"SELE CT*FROM Win32 NetworkAdapter'语句将检索到当前系统中所有网络适配器对象(包含物理网卡和虚拟网卡);而条件检索.SELECT*FROM Win32-Logi calDisk WHERE FileSystem IS"NTFS""只返回当前启用的NTFS格式逻辑磁盘。


  3·3 WMI公开方法的统一调用格式


  WMI类种类繁多,每种类各具有不同的属性和方法,WMI.NET并没有直接给出针对每个类WMI对象的访问方法,而是提供统一的访问途径.首先,通过ManagementClass类获取某WMI类的实例集合然后,枚举集合中的每个实例(以ManagementObject类实例表示),读取该实例具有的属性值(可能为空


  如果需要调用某WM《实例的公开方法,则应先通过ManagementObject.GetMeth0dParameters()获取该公开方法的传入参数组,并给该参数组賦值,接着执行ManagementObject.InvokeMethod()实现对WMI公开方法的同步或异步调用,最后,检索」nvokeMethod()返回的参数组(如果存在返回值的话),判断方法调用是否成功或/和错误代码(代码具体含义请参考MSDN文档)。


  总之,枚举某WM《类的实例集合,然后读取实例的相关公开属性值、执行相关公开方法,从而实现查询和管理单个或多个WM《对象的目的,这即是本文阐述方法的实现原理。


  4具体步骤及方法改进


  根据上述原理,我们探讨动态修改IP地址的具体实现步骤,以及如何提高执行效率。以c#伪代码为例。


  第1步,在应用程序项目中添加并引入system·Management命名空间。由于本方法不需要创建WM《提供程序,故不引入System.Management.Instrumentation叩名空间。


  Imports System.Management;第2步,利用WQL语句检索系统中网络适配卡类及实例集合(Win32-NetworkAdapter,提供约40 2009年第9期


  个属性和4个公开方法),根据实例的属性值找出满足某约定条件所需的单个或多个对象,返回标识该目标网卡的唯一设备序号。例如,在WindowsXP系统中


  可以根据AdapterType=“Ethernet 802·3"和NetConnectiontd!=nuII&&NetConnectld=N来确定第N块以太网类型网卡对象。


  ManagementClass mc:


  New ManagementClass("Win32-Network Adapter");ManagementObjectCoIIection mos=mc.GetInstances();


  Foreach(ManagementObJect mo in mos)


  If(mo["xx"]=:××&&•••)//根据属性值找到目标网卡


  return(uint)mo["lndex"l;//返回该网卡设备序号//没有找到,返回0(非有效的设备序号)


  return 0;第3步,根据目标网卡设备序号,检索其对应的可配置对象(可读写的Win32-NetworkAdapterCon figuration类)。


  ManagementObject moSet=new Management Object('Win32-NetworkAdapterConfiguration.I ndex—+Index.TOString());


  第4步,调用moset对象公开方法,完成《P地址设置。Win32-NetworkAdapterConfiguration类


  公开了近60个属性值、约40个方法用于操作《P地址相关动作。其中,与本方法相关的几个方法及其简要说明见表1。这些方法,均按WM以NET约定的统一调用格式一一唯一区别的就是方法名和传入参数


  (组),以下伪代码演示调用"fnA"公开方法


  //1·获取目标WM《对象公开方法的传入参数(组)


  ManagementObject molnParameters一molnstanceA.GetMethodParameters("fnA");//假设方法名为fnA0


  //2·依次给各传入参数赋值molnParameters['XX1"]:参数值1


  计算机系统应用


  表1与中修改相关的方法


  方法名传入参数功能


  EnableStatic string IPAddress(]string SubnetMask[]同时修改IP地址、


  子网掩码〈必须成对)


  SetGateWays string DefaultIPGateway[J,uint16 GatewayCostMetric修改默认网关


  SetDHSSerwerSeach0rder string DNSServerSearch Order[]修改DNS服务器


  EnableDHCP无启用DHCP获取IP地址


  EnableDNS启用静态DNS地址


  返回值:以上函数均返回unit32值:0成功,非0错误代码(参见MSDN资料)molnParameters["XXn"l:参数值n;//3·执行方法(同步或异步),获取返回值(组)


  ManagementObJect moOutParameters=//同步执行


  molnstanceA.lnvokeMethod("fnA",molnPara meters)•


  //4·简单返回执行结果(0一执行成功;非0一失败或其他含义)


  Return((uint)moOutParameters["ReturnVaIue"I=


  如果成功调用某方法,则可以完成对应的《P修改。例如,传入IP、子网掩码新值(必须成对)给


  EnableStatic()方法,将实现对甲地址(含子网掩码)的修改。其他修改操作类似。


  上述步骤在将地址分配方式由DHCP改变为静态时,执行速度比较缓慢(从几秒到十几秒不等)。笔者经过分析和实验,提出了克服该弊端的一种改进方法先修改Windows注册表中该网络适配器TCP/《P参数的"EnableDHCP"项为0×0(即不采用DHCP分配地址),然后再执行前述第1一4步骤。实验结果显示操作延滞几乎觉察不到,执行效率得到明显提高。//获取该网络适配器的设备标识号·{x×x×一string Settingld:moSet["SettingID"],


  //修改Windows注跚表项


  RegistryKey r=Registry.LocalMachine.OpenSubKey


  Practical Expenence实践经验165


  计算机系统应用


  ("SYSTEM\CurrentControISet\Services\Tcpip\


  Parameters\lnterfaces\"+Settingld,true)


  r.SetValue("EnableDHCP't,OXO);//将启用静态分配


  r.CIose();


  5应用实例


  现以笔者参与开发的某高校公共计算机房管理软件为例,演示WMI.NET动态修改IP地址的应用及效果。


  项目简介:该管理软件目前同时管理6个机房近500台计算机,需要根据学生上机的性质类型(教学集体、课外上机、收费上网)而不是属于哪个机房,自动、动态禁止或允许某台计算机访问Internet—甚至教学集体上机也要动态控制学生端访问Internento


  实现思路:能访问到机房局域网通往Internet的网关A,是学生端访问Internet的必备条件,而通过控制学生端Windows系统"默认网关'IP地址则可以达到目的:当允许上网时》将学生端“默认网关"《P地址修改成可通往外部的网关A(不可上网);反之,则修改成内部网关B的《P地址。


  实现步骤.1)管理服务器端根据学生端的当前上机性质,决定是否准予上网;2)如果允许上网,则发送指令A(并附带网关A的旧给目标学生端;3)目标学生端收到指令A后,执行本文所述方法,将学生端当前默认网关修改为网关A的IP;4)学生端通过网关


  A,顺利访问外部Internent资源。如果不再允许上网,则通过修改学生端默认网关为内部网关B的甲地址,即可切断通往外部的桥梁。本过程可根据管理要求和学生端状态变化实时、动态执行。


  效果评价:实际结果表明,利用本方法实现控制访问Internet简单易行,执行高效,效果良好。同时,本方法还可用于机房自动批量修改计算机初始《P地址的场合。


  6结语


  WMI.NET是.NET Framework编程的高级部分,利用本技术不但能实现原始WM《非常丰富的功能,而且·N訂编程具有的诸多优势能提高开发可能性、可靠性、标准性。本文论述的借助WMI.NET技术实现动态修改IP地址就是一个较好的例证。


上一篇 下一篇