admin 管理员组

文章数量: 1086019


2024年4月20日发(作者:127的原码怎么来的)

…… 

NETWORK&C0啊啊UNi哪ION………………………………………………………………………………… 

基于 xML和 l(擀 

≯|≯。 

港鼙理 峨 |j I ii l 

. .

Ij | 

羹 誊 胡晓】炙|毒 

摘 要:设计了一款基于XML和C≠≠的网络配置管理软件,把用到的网络配置用一个唯一的名称 

保存在XML文件中。修改网络配置时,只要选择相应网络配置名称,单击一次按钮就可以实现 

IP地址、网关、DNS等所有网络配置的自动修改。 

关键词:XML;C#;网络配置;IP地址 

1 引言 

由于网络配置不同,移动办公人员经常修改网络配置,给 

工作带来不便。如果把常用的网络配置存储起来,用一个唯一 

<lpEntity name=“办公室”> 

<lD>27.1 26.1 69.71</Ip> 

<SubNet>255.255.255.1 28</SubNet> 

、 

<NetGate>27.12&169.1</NetGate> 

<FirstDns>27.1 26.160 252</FirstDns> 

<SecondDns>27.1 26.1 69.1</SecondDns> 

的名称命名,修改时只要点击相应的网络配置名称,就把IP 

地址、子网掩码、网关等所有的网络配置修改为新环境下的配 

置,能给工作提供很多方便。 

</IpEntity> 

其中,<IpEntity></IpEntity>节存储一个网络配置信息, 

name属性保存网络配置名称。<lp></Ip>等子节点用来存储IP 

2 系统功能 

本程序实现的功能有网络配置的存储、获取当前网络配置 

和修改网络配置3个功能。 

地址等信息。 

为提高程序的可读性,定义IpEntity类存储网络配置信 

息,每个属性对应一个网络配置项。 

public class IpEntity 

2.1 网络配置存储 

采用XML文件格式存储IP地址、子网掩码、网关、首选 

{ 

f)n。vate string strDIpEntityName; 

f3rivate string strDIp; 

f)r‘ivate string strDSubNet; 

DNS服务器、备用DNS服务器信息。 

2.2读取当前网络配置 

读取当前连接网络的网络适配器IP地址、子网掩码、网 

f)rivate string strDNetGate; 

f)r lvate string strDFirstDns; 

关、首选DNS服务器、备用DNS服务器信息,显示在用户界 

面上。用户修改网络配置前可以看到当前的网络配置。 

f3rivate string strDSecOndDns 

///<summaryr> 

2.3修改网络配置 

用户选择新的网络配置名称后,单击“确定”按钮。把网 

络配置修改为选择的配置。 

,,/网络配置名称 

‘/summary> 

public string strlpEntityName 

{ 

3 系统实现 

程序实现的功能有网络配置的存储、获取当前网络配置和 

) 

get{return strDlPEntityName;) 

set{strDIpEntityName=value;) 

///<summary> 

修改网络配置,这3个功能从技术角度分析,核心技术是3项: 

(1)网络配置存储,选择合理的结构把用户录入的网络配置写 

到文件中加以保存; (2)获取网络配置,用户可以看到当前操 

作系统的网络配置信息; (3)修改网络配置,选择新的网络配 

,//lP地址 

///<Isummary> 

public string strip 

置后,能够把操作系统的网络配置修改为用户选择的配置。 

{ 

get{return strDIp;) 

set{strDIp=value:) 

} 

///<summary> 

3.1 网络配置存储 

网络配置采用XML文件格式保存,文件名为:[pSet.xml, 

结构如下所示。 

j彗宓隹 西I讪7K 

实用第 一 诬 

///子网掩码 

fi/</summary> 

public string strSubNet 

{ 

get{return strDSubNet;} 

set f strDSubNet=value;} 

) 

///<summary> 

lll 关 

///</summary> 

public string strNetGate 

( 

get{return strDNetGate;) 

set{strDNetGate=value;} 

} 

///<summary> 

ffi首逸DNS 

lfl</summary> 

public string strFirstDns 

{ 

get{return strDFirstDns;) 

set{strDFirstDns=value;} 

) 

///<summary> 

IlI爸 DNS 

///</summary> 

public string strSecondDns 

{ 

get{return strDSecondDns:) 

set{strDSecondDns=value;) 

添加网络配置信息的界面如图1所示。 

用户录入网络配置各项信息后,AS-“确定”按钮,信息 

写入IpSet.xml文件中。 “确定”按钮的单击事件代码为: 

///<summary> 

,//把录入的网络配置写人XML文件中 

///</summary> 

///<param name=…ip。>网络配置具体参数</param> 

private void Wnte×m pEr、t i p) 

{ 

XmlDocument xmllpDocument=new XmlDocument0 

if{File.Exists( IpSet.xml )) 

xmllpDocument Load(”IpSet.xml“): 

else 

xmtlpDocument.LoadXml(“<?xml version= 1.O ”4-”< 

IpSet author= huxiaoqing0007 version= 1.0 >”4-“</IpSet>“): 

XmlElement xmlRootElement=xmllpDocument.Docu 

mentElement; 

XmlElement xmiNewlp=xmllpDocument.CreateElement 

(“IpEntity”) 

xmtNewlp.SetAttribute(“name“,ip.strlpEntity Name); 

XmlElement xmllp=xmllpDocument.CreateElement(“Ip“) 

xmllP.InnerText=ip.strip; 

XmtElement xmlNewSubNet=xmllpDocument.Create 

Element(”SubNet“): 

xmlNewSubNet.InnerText=ip.strSubNet; 

XmlElement xmlNewNetGate=xmllpDocument.Create 

Element(“NetGate“): 

xmlNewNetGate.InnerText=ip strNetGate; 

XmlElement xmlNewFirstDns=xmllpDocument.Create 

Element(”FirstDns“): 

xmlNewFirstDns.[nnerText:lp.strFirstDns; 

XmlElement xmINewSecondDns=xmllpDocument.Create 

Element(“SecondDns ): 

xmlNewSecondDns.InnerText=ip.strSecOndDns: 

xmINewlp.AppendChild(xmllp); 

xmlNewlp.AppendChild(xmlNewSubNet); 

xmlNewlp.AppendChild(xmlNewNetGate); 

xmINewlp.AppendChild(xmlNewFirstDns); 

xmINewlp.AppendChild(xmINewSecondDns); 

xmIRootElement.AppendChild(xmlNewlp); 

xmllpDocument.Save(”IpSet.xml“): 

) 

3_2获取网络配置 

获取当前操作系统的网络配置可以通过读取注册表或WMI 

(Wind0 s管理规范)提供的类实现,这两种方法也是目前公开资 

料中介绍最多的方法,具体代码不再赘述,有兴趣的读者可查阅 

相关资料。除前两种方法外,通过研究MSDN,作者发现,.NET 

命名空间SysteI11.Net中的类也可以获取网络配置信息。首先在代 

码顶部添加对System.Net命名空间引用,实现代码如下: 

///<summary> 

///.NET类库法获取网络配置信息 

///</summary> 

///'<param name=“NetAdapterDescription“>网卡 ̄_</param> 

publicvoid GetNetAdapterUbrary ̄string NetAdapterDescription) 

( 

,/获取本地连接信息 

Networklnterface[J Networklnterfaces=Networklnterface. 

GetAIINetworklnterfaces0; 

foreach(Networklnterface Networklntf in Networklnterfaces) 

{ 

if(Networklntf.NetworklnterfaceType==Networklnterface 

匾 隧

…一 

 

NETWORK&COMMUNIC盯ION一…… ………… … ……………一…-“ …一… … …………一 -… …一 

Type.Ethernet&&Networklntf.Description==NetAdapter 

Description) 

{ 

JPlnterfacePrOperties IPInterfacePrOperties=Networklntf. 

GetlPPrOpe es(): 

∥获取本机IP地址信息,子网掩码信息 

UnicastlPAddresslnformationCollection UnicastlPAddressln 

formation 

Collection=IPInterfacePrODerties.UnicastAddresses: 

if(UnicastlPAddresslnformationCollection.Count>0) 

{ 

label1.Text=UnicastlPAddresslnformationCollection【O1. 

Address.ToString0; 

label2.Text=UnicastlPAddresslnformationCollection 

【01.I Pv4Mask.ToString0; 

) 

else 

{ 

label1.Text=”0.0.0.0”: 

label2.Text=”0.0.0.0 : 

) 

f 关 

GatewaylPAddresslnformationCollection GWAddress = 

IPInterfacePrO0erties.GatewayAddresses; 

.f(GWAddress.Count>0) 

label3.Text=GWAddress[0].Address.ToString0; 

else 

label3.Text:“0.0.0.0”: 

//获取当前DNS设置 

IPAddressCollection DNSAddress=IPInterface 

Properties.DnsAddresses: 

switch(DNSAddress.Count) 

{ 

case 1: 

label4.Text=DNSAddress【0】.ToString0; 

label5.Text=“0.0.0.0’‘: 

break; 

case 2: 

label4.Text=DNSAddress【O】 ToString0; 

label5.Text=DNSAddress[1】.ToString0; 

break; 

default: 

label4.Text=”0.0.0.0“: 

label5.Text ”0.0.0.0”: 

break; 

) 

) 

) 

) 

3.3修改网络配置 

研究.NET类库,没有发现修改网络配置的方法。因此修 

改网络配置只好通过WMI提供的类或者修改注册表实现。 

WMI类提供的方法可以很容易修改网络配置。该方法需要引 

用System.Management命名空间,实现代码如下: 

///<summary > 

,//WMI法修改网络配置信息 

///</summary> 

///<param name=”NetAdapterDescription”>网卡描述</param> 

///<returns>修改成功返回true,修改失败返回faIse</retums> 

private bool VerifyrNetWorkConfigWM l(string NetAdapterDes 

cription) 

{ 

bool blFlag=true; 

trv 

( 

ManagementBaseObject inPar=null: 

ManagementBaseObject outPar:null; 

ManagementClass mc=new ManagementClass(” 

Win32

NetworkAdapterConfiguration“); 

ManagementObjectCollection moc=mc.GetInstances(): 

foreach(ManagementObject mo in moc) 

{ 

if((boo1)mo【llIPEnabled”1&&mo【”Description“】. 

ToString()==NetAdapterDesc riptiOn) 

{ 

∥设置网络配置为指定IP地址和指定DNS服务器 

.f(radioButton1.Checked) 

{ 

//网关、IP地址、子网掩码的参数。 

string[]strlpAddress=new string[1 l{textBox1.Text}: 

string[】strSubnetMask=new string[1】(textBox2.Text}: 

string[】strGateWay=new string[1 l{textBox3.Text): 

∥设置WMI法的DNS参数,一个参数为一个数组元素。 

string[】strNameServerWM l: 

l{(textBox5.Text!=””) 

strNameServerWM I=new string【2】{ 

textBox4.Text,textBox5.Text) 

else 

strNameServerWMI=new string[1】{textBox4.Text}: 

设置ip地址和子网掩码 

inPar:mo.GetMethodParameters(”EnableStatic“): 

inPar[“IPAddress”】=strlpAddress; 

inPar[“SubnetMask”】=strSubnetMask; 

outPar=mo.InvokeMethod(“EnableStatic“,inPar,nul1); 

//i殳置网关地址 

inPar=mo.GetMethodParameters(”SetGateways“): 

inPar[”DefaultlPGateway”l=strGateWay; 

outPar=mo.InvokeMethod(”SetGateways“,inPar,nul1); 

||设置DNS 

inPar=mo.GetMethodParameters 

( SetDNSServerSearchOrder“): 

inPar[”DNSServerSearchOrder“】=strNameServerWM}: 

outPar=mo.InvokeMethod(“ 

辩 12 . 

…………………………………………………… …… 

实用第一 智慧密集 

SetDNSServerSearch0rder”。inPar,nul1); 

) 

∥设置网络配置为自动获取 

else if(radioButton2.Checked) 

{ 

mo.InvokeMethod( EnableDHCP ,nul1): 

mo.tnvokeMethod("SetGateways“,nul1); 

mo.InvokeMethod( SetDNSServerSearchOrder ,nul1); 

} 

break; 

} 

) 

) 

catch{ManagementException){ 

blFlag=false; 

) 

return blFlag; 

) 

利用WMI类修改网络配置代码简单,容易理解,但是作 

者在实验中发现.该方法在某些电脑上会抛出 

ManagementException的异常,导致修改不成功,因此该方法 

的可靠性还存在不足。相比较而言,修改注册表的方法可靠性 

更高。Windows系统的网络配置信息记录在注册表中的 

SYS I'EM\、CuⅡ_entC0ntmlSet、\SeⅣices\、1Icpip 'ammeters nte血ces 

项中,只要修改相关值即可达到修改网络配置目的,但该方法 

需要重启电脑或者把本地链接先禁用再启用才能生效。有资料 

介绍通过调用DhcpNotifyConfigChange函数实现不重启生效, 

但作者实验中未获得成功。重启电脑使修改生效也不方便。故 

通过C#先禁用然后再启用本地链接使修改生效是比较合理的 

方法。该方法需要引用NETCONLib、NATUPNPIJib、 

NetFwTypeLib 3个命名空间。实现代码如下: 

///<summary> 

///注册表法修改网络配置 

///</summary> 

///<param name= NetAdapterDescription">网卡描述<, 

///param> 

///<returns>修改成功返回true,失败返回false<,retums> 

private void VerifyNetConfigRegister(string NetAdapterDescrip 

tion) 

{ 

Networklnterface[】Networktnterfaces=Networklnterface. 

GetAIINetworklnterfaces(): 

foreach(Networklnterface Networklntf in Networklnterfaces) 

{ 

if fNetworklntf.NetworklnterfaceTy’pe == 

NetworklnterfaceType.Ethernet&&Networklntf.Description 

==NetAdapterDescription) 

{ 

RegistryKey rk=Registry.LocaIMachine.OpenSubKey( 

2012.09 

电奠缡穗技巧与 

SYSTEM\\CurrentControlSet\kServices\\TcpipkkParameters\kln— 

teffaces”): 

string[】strSubKeys=rk.GetSubKeyNamesO; 

foreach{string strSubKey in strSubKeys) 

{ 

if(Networklntf.Id=:strSubKey) 

{ 

RegistryKey rkNetWork=rk.OpenSubKey 

(Networklntf.Id,true); 

,/设置网络配置为指定IP地址和指定DNS服务器 

If《radioButton1.Checked) 

{ 

∥网关、lP地址、子网掩码的参数用数组表示 

string[】strlpAddress:new string[1】{textBox1.Text): 

string[1 strSubnetMask:new string[1 l{textBox2.Text}: 

string[]strGateWay=new string[1】{textBox3.Text): 

//设置注册表法的DNS参数,如果有多个,相 

//邻之间用逗号相连 

string strNameServer=null; 

if(textBox5.Text!= ) 

strNameServer:textBox4.Text+ .”+textBox5 Text; 

else 

strNameServer:textBox4.Text; 

rkNetWork.SetValue (”EnableDHCP ,0, 

RegistryValueKind.DWord); 

r{kNetWork.SetValue( DefaultGateway“,strGateWay, 

RegistryValueKind.MultiString); 

rkNetWork.SetValue(”IPAddress“,strlpAddress. 

RegistryValueKind.MultiString); 

rkNetWork.SetValue(“SubnetMask“,strSubnetMask, 

RegistryValueKind.MultiString); 

rkNetWork.SetValue{ NameServer“.strNameServer, 

RegistryValueKind.String); 

) 

殳置网络配置为自动获取 

else if(radioButton2.Checked) 

{ 

rkNetWork.SetValue(”EnableDHCP“,1, 

RegistryValueKind DWord); 

rkNetWork.SetValue(”DefaultGateway”,new string[】{ 

),RegistryValueKind.MultiString): 

JrkNetWork.SetValue('NameServer", RegistryValueKind.String); 

) 

∥先禁用网络连接然后再启用网络连接 

NetSharingManagerClass netSharingMgr= 

new NetSharingManagerClass(); 

I1NetSharingEveryConnectionCollection connections= 

netSharingMgr.EnumEveryConnection; 

foreach(INetCOnnectiOn connection in connections) 

{ 

INetConnectionProps connProps:netSharingMgr. 

(下转第79页) 

…… 

B胁PHICS AND I眦BE PROCESSING……………… ………………………………………………………… 

i 1) 动完成所有宗地标注,如图1所示。 

(while(setq cur(nth i offplvers)) 

(setq dist(distance pre cur) 

ang(/《 (angle pre cur)1 8O.O)pi)) 

) 

(if(>dist 1 00) 

(progn 

(setq cen《list(/{+(car pre)(car cur))2)(/(+(cadr 

pre)(cadr cur))2))) 

//边长标注 

): 

):lf 

(setq pre cur 

i(+i 1)) 

);while 

4.2边长的标注 

(cond 

图1 宗地标注成果图 

《(or《and【>:ang 0)(<=ang 90)) 

(and(>:ang 270)(<=ang 360)) 

) 

6结语 

利用此方法标注界址点编号和坐标一体化。自动标注坐 

标、边长、面积,这样不仅能保证标注内容准确无误,还可以 

节约时间提高效率。 

{command“text…S“等线体“”jlIIIMC“cen 1 ang(strcat 

(rtos dist 2 2) m )) 

): 

((and(>ang 90)(<ang 270)) 

《setq ang(+180 ang)) 

参考文献 

[1】别建晓.Auto CAD中坐标标注的改进.城市勘测,2008, 

(1):120—121. 

(command text~S~等线体~j—MC“cen 1 ang(strcat(rtos 

dist 2 2)“m“)) 

) 

);cond 

[2】冯瑞莲,毛卫民,等.城镇勘测定界中运用Visual LISP语 

言快速制作宗地图[J].城市勘测,2008,(1):104—105. 

5程序运行 

程序加载之后,在命令行输入bzxy就可以启动程序,全自 

[3】高艳,顾有兵.AutoCAD中多义线的坐标标注【J].工程 

与建设,20o7,(06):875—876. 

(收稿日期:2011-12—09) 

(上接第74页) 

get NetCOnnectiOnPrOps(cOnnection): 

if(connProps.MediaType =tagNETCON—MEDI △ PE 

NCM

LAN&&connProps.Name=:Networklntf.Name) 

4结语 

通过程序修改网络配置,只需点击一次鼠标就能修改IP 

地址、网关等全部网络配置,相对于手工修改,操作简洁、效 

率更高.而且不需要记忆网络配置的具体内容,给移动办公的 

人员带来了方便。作者通过查阅资料和相关帮助,对C#存储、 

{ 

connection.Disconnect();∥禁用网络 

connection.Connect0; //启用网络 

break; 

获取和修改网络配置的方法进行了总结和实验,设计和开发了 

可靠的网络配置修改程序。文中代码在VS 2008和Windows 

Server 2003中编译通过,编译程序在多台电脑的Windows XP、 

Windows Server 2003和Windows Server 2008中测试通过 

) 

) 

break; 

) 

) 

break; 

参考文献 

【1】易向东,陈蓓,万英.C#程序员开发指南【M】.北京:中 

国林业出版社,2006. 

(收稿日期:2012—01—28) 

) 

) 

) 

琏螭 ’ 


本文标签: 配置 网络 修改 方法 标注