تنظیم IP کارت شبکه از طریق کدنویسی

توسط قطعه کد زیر می‌توانید از طریق کدنویسی IP Address و Default Getway و همچنین DNS Server مربوط به کارت شبکه مورد نظرتان را تغییر دهید.


این برنامه ابتدا مشخصات کارت شبکه مورد نظر را خوانده و با مشخصاتی که در فایل کانفیگ برنامه تعیین شده است تطابق می‌دهد. در صورتی‌که اطلاعات مغایرت داشته باشد، مشخصات داخل فایل کانفیگ را برای کارت شبکه مورد نظر اعمال می‌کند.

این قطعه کد، زمانی مفید است که بعنوان مثال شما یک سرور اختصاصی (VPS) دارید که به صورت Remote به آن دسترسی دارید. اگر به هر علت IP این سرور تغییر کند، سرور به کلی از دسترس خارج می‌شود و باید به شرکت ارائه دهنده سرویس تماس بگیرید تا مجدداً  IP سرور را تنظیم کنند.

 این برنامه را می‌توان در یک Task ویندوزی تنظیم کرد که در بازه‌های معین اجرا شود تا در صورتی که سرور از دسترس خارج شده باشد، با تنظیم مجدد IP سرور در دسترس قرار گیرد.

کد اصلی برنامه


using System;
using System.Collections.Generic;
using System.Configuration;
using System.Threading;

namespace SetIP
{
    class Program
    {
        private const int TryCount = 20;

        static void Main(string[] args)
        {
            try
            {
                var i = 0;
                var isEqual = false;
                while (!isEqual && i < TryCount)
                {
                    Console.WriteLine("Checking number: {0}", i + 1);
                    isEqual = checkAdapter();
                    i++;
                    Thread.Sleep(5000);
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        private static bool checkAdapter()
        {
            var networkAdapterHelper = new NetworkAdapterHelper();

            var baseAdapter = new Adapter()
            {
                AdaptorName = ConfigurationManager.AppSettings["EthernetName"],
                Ip = ConfigurationManager.AppSettings["IP"],
                Subnet = ConfigurationManager.AppSettings["SubnetMask"],
                Getway = ConfigurationManager.AppSettings["DefaultGetway"],
                DnsServer = ConfigurationManager.AppSettings["DnsServer"],
                AlternativeDns = ConfigurationManager.AppSettings["AlterNativeDnsServer"]
            };

            networkAdapterHelper.Execute(new List<string>()
            {
                String.Format("netsh interface set interface name=\"{0}\" admin=enabled", baseAdapter.AdaptorName)
            }); 

            var currentAdapter = networkAdapterHelper.GetAdapterInformation(baseAdapter.AdaptorName);
            if (currentAdapter == null)
            {
                Console.WriteLine("Adapter not found!");
                return false;
            }
            if (networkAdapterHelper.IsEqual(currentAdapter, baseAdapter))
                return true;
            networkAdapterHelper.SetEthernetInformation(baseAdapter);
            return false;
        }
    }
}


کلاس Adapter

namespace SetIP
{
    public class Adapter
    {
        public string AdaptorName;
        public string Ip;
        public string Subnet;
        public string Getway;
        public string DnsServer;
        public string AlternativeDns;

        public Adapter()
        {
        }

        public Adapter(string adaptorName, string ip, string subnet, string getway, string dnsServer, string alternativeDns)
        {
            this.AdaptorName = adaptorName;
            this.Ip = ip;
            this.Subnet = subnet;
            this.Getway = getway;
            this.DnsServer = dnsServer;
            this.AlternativeDns = alternativeDns;
        }
    }
}


کلاس کمکی NetworkAdapterHelper

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.NetworkInformation;
using System.Net.Sockets;

namespace SetIP
{
    public class NetworkAdapterHelper
    {
        public Adapter GetAdapterInformation(string adapterName)
        {
            var adapter = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(x => x.Name == adapterName);
            if (adapter == null)
            {
                Console.WriteLine("Adapter {0} not found!", adapterName);
                return null;
            }

            var ip = getIpAddress(adapter);
            if (String.IsNullOrEmpty(ip))
            {
                Console.WriteLine("Cannot grab IP address information!");
                return null;
            }

            //var subnet = unicastIpAddressInformation.IPv4Mask.ToString();
            var subnet = GetSubnetMask(adapter);

            var result = new Adapter()
            {
                AdaptorName = adapter.Name,
                Ip = ip,
                Subnet = subnet,
                Getway = GetDefaultGateway(adapter)
            };

            GetDnsAddresses(adapter, out result.DnsServer, out result.AlternativeDns);
            return result;
        }

        private string getIpAddress(NetworkInterface adapter)
        {
            UnicastIPAddressInformationCollection addresses = adapter.GetIPProperties().UnicastAddresses;
            var ipAddressInformation = addresses.FirstOrDefault(x => x.Address.AddressFamily == AddressFamily.InterNetwork);
            if (ipAddressInformation == null)
            {
                return null;
            }

            return ipAddressInformation.Address.ToString();
        }

        public string GetSubnetMask(NetworkInterface adapter)
        {
            var query =
                from properties in adapter.GetIPProperties().UnicastAddresses
                where properties.Address.AddressFamily == AddressFamily.InterNetwork && properties.IPv4Mask != null
                select properties.IPv4Mask;

            var firstOrDefault = query.FirstOrDefault();
            return firstOrDefault != null ? firstOrDefault.ToString() : "";
        }

        /// The Default Gateway's IP address as a string. 
        public string GetDefaultGateway(NetworkInterface adapter)
        {
            var defaultGateway =
            from props in adapter.GetIPProperties().GatewayAddresses
            select props.Address.ToString();

            return defaultGateway.First();
        }

        public void GetDnsAddresses(NetworkInterface adapter, out string dnsServer, out string alternative)
        {
            dnsServer = "";
            alternative = "";

            var dnsServers = adapter.GetIPProperties().DnsAddresses;

            if (dnsServers.Count <= 0) return;

            dnsServer = dnsServers[0].ToString();

            if (dnsServers.Count == 2)
            {
                alternative = dnsServers[1].ToString();
            }
        }

        public void SetEthernetInformation(Adapter adapter)
        {
            var commands = new List<string>
            {
                String.Format("netsh interface set interface name=\"{0}\" admin=enabled", adapter.AdaptorName),
                String.Format("netsh interface ip set address \"{0}\" static {1} {2} {3} 1", adapter.AdaptorName,
                    adapter.Ip, adapter.Subnet, adapter.Getway),
                String.Format("netsh interface ipv4 delete dnsservers \"{0}\" all", adapter.AdaptorName)
            };
            if (!String.IsNullOrEmpty(adapter.DnsServer))
            {
                commands.Add(String.Format("netsh interface ipv4 add dnsserver \"{0}\" address={1}", adapter.AdaptorName, adapter.DnsServer));
            }
            if (!String.IsNullOrEmpty(adapter.AlternativeDns))
            {
                
                commands.Add(String.Format("netsh interface ipv4 add dnsserver \"{0}\" address={1} index=2", adapter.AdaptorName, adapter.AlternativeDns));
            }
            Execute(commands);
        }

        public bool IsEqual(Adapter currentAdapter, Adapter baseAdapter)
        {
            return currentAdapter.Ip == baseAdapter.Ip
                   && currentAdapter.Subnet == baseAdapter.Subnet
                   && currentAdapter.Getway == baseAdapter.Getway
                   && currentAdapter.DnsServer == baseAdapter.DnsServer
                   && currentAdapter.AlternativeDns == baseAdapter.AlternativeDns;
        }

        public void Execute(List<string> commands)
        {
            var p = new Process();
            var info = new ProcessStartInfo
            {
                FileName = "cmd.exe",
                WindowStyle = ProcessWindowStyle.Hidden,
                RedirectStandardInput = true,
                UseShellExecute = false
            };

            p.StartInfo = info;
            p.Start();

            using (StreamWriter sw = p.StandardInput)
            {
                foreach (var command in commands)
                {
                    if (sw.BaseStream.CanWrite)
                    {
                        sw.WriteLine(command);
                    }
                }
            }
        }
    }
}


نمونه‌ای از فایل پیکربندی (کانفیگ) برنامه

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="EthernetName" value="Ethernet" />
    <add key="IP" value="192.168.1.2" />
    <add key="SubnetMask" value="255.255.255.0" />
    <add key="DefaultGetway" value="192.168.1.1" />
    <add key="DnsServer" value="8.8.8.8" />
    <add key="AlterNativeDnsServer" value="8.8.4.4" />
  </appSettings>
</configuration>


دریافت سورس کامل برنامه

ارسال نظر

Loading