通过C#语言判断本地计算机物理网络接口的研究
2021-12-24胡迪
胡迪
摘要:为避免桌面终端运维工程师在工作中则经常面临各类重复性的操作,拟通过“多用途运维软件包的研制”项目是将企业中运维运维工程师常用的操作进行集成,并以.NET平台为底层,利用C#语言将注册表操作、PowerShell命令执行等进行整合的一套自研软件包。该项目通过WPF框架在统一的前端界面中完成可视化的显示,简化工程師操作,提高工作效率,减少误操作率,保证操作过程的标准化并满足企业信息化安全标准。
关键词:.NET Core;C#;注册表
中图分类号:TP3 文献标识码:A
文章编号:1009-3044(2021)29-0128-02
1背景
我公司一直承担着集团内京直地区各下属公司的桌面计算机终端运维工作,涉及设备数量超过4000千台。终端运维工程师在工作中则经常面临各类重复性的操作,如:打开传统控制面板、修改计算机名称、计算机加域及退域、打印机添加及管理、办公软件及操作系统激活、驱动程序安装及检查、应用软件安装及删除、浏览器配置等。工程师需要不断切换工作场景,分别打开各功能所对应模块手动进行设置,不仅影响工作效率,还增加了误操作率,特别是对新员工培训上岗容易造成混乱,也影响新入职员工的上岗速度。
为避免上述情况,拟通过“多用途运维软件包”的研制,将桌面终端运维工程师常用的操作进行集成。在统一界面中完成可视化的前端显示,简化工程师操作,提高工作效率,减少误操作率,保证操作过程的标准化。同时满足企业内的信息化安全规定及标准。
本软件包共有激活、系统配置、设备管理、软件管理四个分类,包含激活操作系统、激活办公套件、显示操作系统授权信息、显示办公套件版本及授权信息、修改计算机名、加入退出 AD域、操作系统代理配置、打开控制面板、关闭系统休眠、打开 PowerShell控制台、打开设备管理器、打印机管理、添加打印机、显示网卡信息、磁盘管理、连接服务器、添加或删除程序、打开 Internet选项等功能。
考虑到该项目成果主要应用于微软Windows操作系统平台上,且后期可能出现的跨平台需求,实施过程以.NET Core为底层平台,前端界面使用WPF框架展示,实现主流现代化的展示界面,后台代码则通过C#程序设计语言进行开发。其中.Net Core、WPF、C#产品均已开放源代码,且可实现跨平台的支持能力,为未来可能出现的平台迁移及跨多平台情况设计好底层框架。
2现状
鉴于企业信息化管理规定中关于“所有计算机必须绑定网卡的物理地址方可准入公司内部局域网络”的要求,在多用途运维软件包中设计了输出本地计算机网络接口数据的模块,对本机物理网络接口在前端界面中完成输出显示,以方便终端运维工程师快速获取本机网卡的物理地址。但是在微软公司 Windows操作系统中还存有大量的虚拟网卡,此类网卡无论在用户的日常应用中抑或是工程师的运维操作中均不存在任何意义,甚至对工程师在故障排查操作过程中的判断产生了迷惑及不利因素。
本文通过调用类与方法,结合对注册表的判断,以实现在前端界面中过滤本地计算机虚拟网络接口,仅输出显示物理网络接口数据的功能,并满足项目实施需求。
在微软公司关于.NET平台的文档中,阐述了其提供的一种对网络流量数据、网络地址信息和本地计算机地址变更通知访问权限的命名空间,在该命名空间中包含了提供网络接口配置和统计接口信息的类。该类可用于封装本地计算机上网络接口的数据。
在本项目实施中,首先创建了用于获取本地计算机上全部网络接口数据的私有方法,在该方法中将本地计算机全部网络接口的数据存入名为category 的NetworkInterface类型数组变量中。而后对该数组变量进行遍历循环,将网络名称、网卡物理地址的值以字符串型式输出显示至名为lstAdapter的前端界面列表框组件中。然后通过方法将网络接口的IPv4地址信息保存至UnicastIPAddressInformationCollection类型的ipCollection变量中,最后对该变量其进行遍历、判断及输出。
通过对该私有方法的代码进行编译及执行,可以看到如图1所示前端界面中正常输出并显示了本地计算机上的网络接口数据。
对输出结果进行分析,发现其中包含了本地计算机所有的网络接口数据,既有物理网络接口,又有虚拟网络接口。而虚拟网络接口在本项目中被设定为无效信息,无需进行输出显示。所以还需要在代码中对此类接口的数据进行判断,进而过滤并跳过在前端界面中的输出显示操作,从而达到前端界面仅输出显示物理网络接口数据的需求。
3思路
针对现状,实施方案拟将在代码中增加判断节点作为切入点,通过对网络接口的名称或网络接口的类型增加判断,进而实现对网络接口为物理接口或虚拟接口的划分。
通过对微软公司关于驱动程序的文档进行分析,发现该公司在操作系统接口中为设备安装程序类提供了固定的系统定义唯一标识(GUID)。考虑到微软公司操作系统底层的注册表中包含了所有硬件设备的全部信息,又在注册表中对该唯一标识进行了分析,发现该键中包含数个以其他唯一标识(GUID)命名的子键,再将各子键中的Name值项与设备管理器中网络适配器内的所有网络接口名称进行比对,确定了该值项即对应了其网络接口的名称。证实了上述关于注册表中包含了本地计算机所有硬件设备的全部信息的思路。
而在分析子键中的PnPInstanceId值项后发现其为操作系统中对该设备设置的唯一标识。将所有Name子键中的PnPIn⁃stanceId值项中的数据进行比对可以发现均以 PCI、SWD 或 GUID 为起始,再结合对 Name值项的分析,可以发现以PCI 为前三个字符的PnPInstanceId值项,其对应的Name值项均为本地计算机中的物理网络接口,其余则对应蓝牙、Miniport等虚拟网络接口。进一步证实了可以通过对注册表的判断来区分本地计算机所有网络接口数据类型的思路。
根据以上思路,最终确定采用在私有方法中添加对注册表内PnPInstanceId值项的轮询遍历,并在该过程中将值项数据的前三个字符与“PCI”进行比对,用于判断物理或虚拟网络接口的方案。对结果与”PCI”一致的执行在前端界面的输出显示,对非一致的结果执行过滤跳过,以实现对本地计算机所有网络接口数据的筛选及过滤。
4实现
在项目实施中,首先依然通过私有方法获取本地计算机上全部网络接口的数据,并将全部网络接口数据存入名为catego⁃ry的NetworkInterface类型数组变量中。然后在对该数组变量进行循环遍历时,先创建用于保存注册表值项PnPInstanceId对应路径的字符串类型变量adapterRegKey,并对该变量执行只读打开操作。随后对其变量中的字符串值进行非空判断,对空内容,认为该计算机中无任何网络接口,并结束输出本地计算机网络接口数据模块的执行;对非空内容,将其PnPInstanceId的值转换为字符串类型并保存到代码中名为pnpInstanceID的字符串类型变量中,再对其字符串长度及前三个字符进行判断,长度大于3且前三个字符等于“PCI”,说明该网络接口类型为物理网络接口,将其输出至前端界面中;否则判断其表示为虚拟网络接口,代码执行跳出本次循环并继续进行下一次循环判断其他PnPInstanceId值项的操作。
string macAddress;
NetworkInterface[] category = NetworkInterface. GetAllNet⁃workInterfaces();
foreach (NetworkInterface adapter in category)
{
string adapterRegKey =@"SYSTEM\CurrentControlSet\Con⁃trol\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\" + adapter.Id +@"\Connection";
RegistryKeyopenKey = Registry.LocalMachine.OpenSubKey (adapterRegKey, false);
if (openKey != null)
{
string pnpInstanceID = openKey. GetValue("PnPInstanceId", "").ToString();
if (pnpInstanceID.Length>3 &&pnpInstanceID.Substring(0, 3)=="PCI")
{
lstAdapter.Items.Add("名称:"+ adapter.Name);
…
}
在代码中增加了通过注册表对物理网络接口及虚拟网络接口的判断后再次进行编译和执行,并将前端界面显示的输出结果与本地计算机设备管理器中的网络适配器列表进行比对。
5结论
通过在C#程序中对命令空间、类、私有方法的使用,结合对操作系统设备安装程序类的分析,结合对注册表的判断,完成了通过C#语言判断本地计算机物理网卡差在前端界面进行展示输出的需求。
作为微软公司在.NET 时代的旗帜性语言,C#语言是由 C 和 C++衍生出来的面向对象的编程语言,运行于.NET Frame⁃ work和.NET Core平台之上的高级程序设计语言,其兼具安全、稳定、简单、优雅等特性,以强大的操作能力、优雅的語法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。
同时,C#程序设计语言与Windows操作系统同出于微软公司之手,其操作系统中存在大量的基础类库、动态链接库、接口可以被 C#语言轻易地调用,以对操作系统进行更深层次的操作。
在本研究中,将.NET平台中提供的类、方法与注册表进行组合,满足项目需求。而对于项目中如修改计算机名、加入或退出AD域等的其他需求,同样需要充分利用.NET平台与Windows操作系统深度结合的优势,调用操作系统中的其他动态链接库,不断拓展思路,满足项目需求,推动项目顺利开展。
目前市场上针对桌面运维工程师的运维软件包数量较少且功能单一,可定制性低,既不能满足企业实际需求,更无法满足企业内的信息化安全标准。通过本项目的自研,既满足了工程师实际应用中的需求,减少操作步骤以及误操作率,在提高工作效率、统一工作标准的同时也符合了企业内部信息化安全的标准。
参考文献
[1] 左成,虞红芳.可靠性感知下的虚拟数据中心映射算法[J].计算机应用,2015,35(2):299-304.
[2] 陈春凯 . 云计算环境下基于拓扑感知的虚拟网络映射研究[J].计算机应用与软件,2014,31(12):156-160.
[3] 刘光远,苏森.面向底层单节点失效的轻量级可靠虚拟网络映射算法[J].电子与信息学报,2013,35(11):2644-2649.
【通联编辑:朱宝贵】