关于对IP的一些操作

    技术2022-05-11  70

    最近看到一些对IP的操作,感觉不错,而且以后可能会用到,所以收集过来,以备以后使用.

    1.获取MAC地址操作:

    using   System;     using   System.Runtime.InteropServices;         namespace   UtilityControl     {     ///   <summary>     ///   关于IP地址的若干操作     ///   </summary>     public   class   IP     {     public   IP()     {     //     //   TODO:   在此处添加构造函数逻辑     //     }         [DllImport("Iphlpapi.dll")]     private   static   extern   int   SendARP(Int32   dest,Int32   host,ref   Int64   mac,ref   Int32   length);     [DllImport("Ws2_32.dll")]       private   static   extern   Int32   inet_addr(string   ip);         ///   <summary>     ///   根据ip得到网卡mac地址     ///   </summary>     ///   <param   name="ip">给出的ip地址</param>     ///   <returns>对应ip的网卡mac地址</returns>     public   static   Int64   GetMACByIP(string   ip)       {       Int32   ldest=   inet_addr(ip);   //目的地的ip       try       {       Int64   macinfo   =   new   Int64();       Int32   len   =   6;       int   res   =   SendARP(ldest,0,   ref   macinfo,   ref   len);       return   macinfo;       }       catch(Exception   err)       {       Console.WriteLine("Error:{0}",err.Message);       }       return   0;       }       }     }  

    -----------------------------------------------------------------

    用C#编写获取远程IP,MAC的方法

    [DllImport("Iphlpapi.dll")]private  static  unsafe  extern  int  SendARP(Int32  dest,Int32  host,ref  IntPtr  mac,ref  IntPtr  length);[DllImport("Ws2_32.dll")]private  static  extern  Int32  inet_addr(string  ip);

    Int32  ldest=  inet_addr("157.60.68.163");//目的地的ipInt32  lhost=  inet_addr("157.60.68.33");//本地的ip

    try{Byte[]  macinfo=new  Byte[6];Int32  length=6;

    IntPtr  mac=new  IntPtr(macinfo[0]);IntPtr  len=new  IntPtr(6);int  ii=SendARP(ldest,lhost,  ref  mac,  ref  len);

    Console.WriteLine("Mac  Add:"+mac);Console.WriteLine("length:"+len);

    }catch(Exception  err){Console.WriteLine(err);} 

    -----------------------------------------------

    用WMI使用时首先添加System.Management.dll,然后引用using System.Management;using System.Threading;      {            ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");             ManagementObjectCollection moc = mc.GetInstances();             foreach(ManagementObject mo in moc)             {                 if((bool)mo["IPEnabled"] == true)                     Response.Write("MAC address"+mo["MacAddress"].ToString()+"<br/>");                 mo.Dispose();             }         }

     

    2.手动设置IP或设置动态IP

    如果是winform的话,需要添加对System.Management.dll的引用

    然后使用下面的类就可以实现你的前2个要求:namespace modify{    public class ChangeIP    {

            public static readonly System.Version myVersion = new System.Version(1, 1);        private ManagementBaseObject iObj = null;        private ManagementBaseObject oObj = null;        private ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");        private readonly ManagementObjectCollection moc;

            /// <summary>         /// example:         /// <code>         /// ArLi.CommonPrj.ChangeIP o = new ArLi.CommonPrj.ChangeIP();         /// string[] ipList = new string[]{"192.168.0.253","192.168.0.250"};         /// string[] subnetList = new string[]{"255.255.255.0","255.255.255.0"};         /// o.ChangeTo(ipList,subnetList);         /// </code>         /// </summary>         public ChangeIP()        {            moc = mc.GetInstances();        }

            /// <summary>cortrol</summary>         /// <param name="ipAddr">IPAddr List</param>         /// <param name="subnetMask">subnetMask List</param>         public void ChangeTo(string[] ipAddr, string[] subnetMask)        {            foreach (ManagementObject mo in moc)            {                if (!(bool)mo["IPEnabled"]) continue;

                    iObj = mo.GetMethodParameters("EnableStatic");                iObj["IPAddress"] = ipAddr;                iObj["SubnetMask"] = subnetMask;                oObj = mo.InvokeMethod("EnableStatic", iObj, null);            }        }

            /// <summary>cortrol</summary>         /// <param name="ipAddr">IPAddr List</param>         /// <param name="subnetMask">subnetMask List</param>         /// <param name="gateways">gateway List</param>         /// <param name="gatewayCostMetric">gateway CostMetric List, example: 1</param>         public void ChangeTo(string[] ipAddr, string[] subnetMask, string[] gateways, string[] gatewayCostMetric)        {            foreach (ManagementObject mo in moc)            {                if (!(bool)mo["IPEnabled"]) continue;

                    iObj = mo.GetMethodParameters("EnableStatic");                iObj["IPAddress"] = ipAddr;                iObj["SubnetMask"] = subnetMask;                oObj = mo.InvokeMethod("EnableStatic", iObj, null);

                    iObj = mo.GetMethodParameters("SetGateways");                iObj["DefaultIPGateway"] = gateways;                iObj["GatewayCostMetric"] = gatewayCostMetric;                oObj = mo.InvokeMethod("SetGateways", iObj, null);            }        }

            /// <summary>cortrol</summary>         /// <param name="ipAddr">IPAddr List</param>         /// <param name="subnetMask">subnetMask List</param>         /// <param name="gateways">gateway List</param>         /// <param name="gatewayCostMetric">gateway CostMetric List, example: 1</param>         /// <param name="dnsServer">DNSServer List</param>         public void ChangeTo(string[] ipAddr, string[] subnetMask, string[] gateways, string[] gatewayCostMetric, string[] dnsServer)        {            foreach (ManagementObject mo in moc)            {                if (!(bool)mo["IPEnabled"]) continue;

                    iObj = mo.GetMethodParameters("EnableStatic");                iObj["IPAddress"] = ipAddr;                iObj["SubnetMask"] = subnetMask;                oObj = mo.InvokeMethod("EnableStatic", iObj, null);

                    iObj = mo.GetMethodParameters("SetGateways");                iObj["DefaultIPGateway"] = gateways;                iObj["GatewayCostMetric"] = gatewayCostMetric;                oObj = mo.InvokeMethod("SetGateways", iObj, null);

                    iObj = mo.GetMethodParameters("SetDNSServerSearchOrder");                iObj["DNSServerSearchOrder"] = dnsServer;                oObj = mo.InvokeMethod("SetDNSServerSearchOrder", iObj, null);            }        }

            /// <summary>DHCPEnabled</summary>         public void EnableDHCP()        {            foreach (ManagementObject mo in moc)            {                if (!(bool)mo["IPEnabled"]) continue;

                    if (!(bool)mo["DHCPEnabled"])                {                    iObj = mo.GetMethodParameters("EnableDHCP");                    oObj = mo.InvokeMethod("EnableDHCP", iObj, null);                }            }        }    }}

    测试代码:using System.Management;using modify;namespace WindowsApplication13{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();            //对第二个问题验证            ChangeIP test = new ChangeIP();            string[] str1 = new string[] {"192.168.1.5"};            string[] str2 = new string[] { "255.255.255.0" };            test.ChangeTo(str1, str2);

                MessageBox.Show("IP已经更改,请验证");

                //对第一个问题的验证,如果IP可用,当前并不是自动获取IP,这时下面的方法会自动获取IP            test.EnableDHCP();        }    }}

     


    最新回复(0)