[C#]程式更改電腦IP位置與電腦名稱

更改多個網卡與電腦名稱
程式畫面:
詳細程式碼如下:
using System;
using System.Management; // System.Management 命名空間 需加入參考System.Management
using System.Runtime.InteropServices;
using System.Text.RegularExpressions; // System.Collections 命名空間
using System.Windows.Forms;

namespace SetIPAndHostName
{
    public partial class Form1 : Form
    {
        ManagementObject objCls; // ManagementObject 類別 , 表示 WMI 執行個體。
        string strCls = "Win32_NetworkAdapterConfiguration"; // WMI 名稱空間 ( Namespace )
        string strNS = "root\\CIMV2"; // WMI 類別 (Class)
        string strIndex; // 用來記錄網路介面卡 Index

        [DllImport("kernel32.dll")]
        static extern bool SetComputerName(string lpComputerName);
        [DllImport("kernel32.dll")]
        static extern bool SetComputerNameEx(_COMPUTER_NAME_FORMAT iType, string lpComputerName);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            GetAdtInfo(); // 呼叫 GetAdtInfo 程序來取得網路介面卡資訊
            txt_Old_PCName.Text = System.Windows.Forms.SystemInformation.ComputerName;
        }

        private void GetAdtInfo()
        {
            // 指定查詢網路介面卡組態 ( IPEnabled 為 True 的 )
            string strQry = "Select * from Win32_NetworkAdapterConfiguration where IPEnabled=True";

            // ManagementObjectSearcher 類別 , 根據指定的查詢擷取管理物件的集合。
            ManagementObjectSearcher objSc = new ManagementObjectSearcher(strQry);

            // 使用 Foreach 陳述式 存取集合類別中物件 (元素)
            // Get 方法 , 叫用指定的 WMI 查詢 , 並傳回產生的集合。
            foreach (ManagementObject objQry in objSc.Get())
            {
                // 取網路介面卡資訊
                ComboBox.Items.Add(objQry["Caption"]); // 將 Caption 新增至 ComboBox

            }
            ComboBox.SelectedIndex = 0;//預設選擇第一個
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (IsIPAddress(txtIP.Text))
            {
                string strIP = txtIP.Text;  // IP 位址
                string strSubmask = txtSubmask.Text; // 子網路遮罩
                string strGateway = txtGateway.Text; // 預設閘道
                string strDNS1 = txtDNS1.Text; // 慣用 DNS 伺服器
                string strDNS2 = txtDNS2.Text; // 其他 DNS 伺服器
                strIndex = label7.Text; //取的要設定之網卡Index
                // 呼叫 SetNetCfg 程序 , 設定網路介面卡組態
                SetNetCfg(strIP, strSubmask, strGateway, strDNS1, strDNS2);
            }
            else
            {
                MessageBox.Show("IP位置錯誤,請檢查!", "IP錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void SetNetCfg(string strIP, string strSubmask, string strGateway, string strDNS1, string strDNS2)
        {
            // 建立 ManagementObject 物件 ( Scope , Path , options )
            objCls = new ManagementObject(strNS, strCls + ".INDEX=" + strIndex, null);

            ManagementBaseObject objInPara; // 宣告管理物件類別的基本類別

            objInPara = objCls.GetMethodParameters("EnableStatic");
            objInPara["IPAddress"] = new string[] { strIP }; // 設定 "IP" 屬性
            objInPara["SubnetMask"] = new string[] { strSubmask }; // 設定 "子網路遮罩" 屬性
            objCls.InvokeMethod("EnableStatic", objInPara, null);

            objInPara = objCls.GetMethodParameters("SetGateways");
            objInPara["DefaultIPGateway"] = new string[] { strGateway }; // 設定 "Gateway" 屬性
            objCls.InvokeMethod("SetGateways", objInPara, null);

            objInPara = objCls.GetMethodParameters("SetDNSServerSearchOrder");
            objInPara["DNSServerSearchOrder"] = new string[] { strDNS1, strDNS2 }; // 設定 "DNS" 屬性
            objCls.InvokeMethod("SetDNSServerSearchOrder", objInPara, null);

            // GetMethodParameters 方法 : 用來取得 SetDNSServerSearchOrder 參數清單。
            // InvokeMethod 方法 : 在物件上叫用方法。
            MessageBox.Show("IP設定完成!", "設定完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            GetNetInfo(ComboBox.SelectedItem.ToString());
        }

        void GetNetInfo(string strNetAdapterName)
        {
            // 指定查詢網路介面卡組態 ( IPEnabled 為 True 的 )
            string strQry = "Select * from Win32_NetworkAdapterConfiguration where IPEnabled=True";

            // ManagementObjectSearcher 類別 , 根據指定的查詢擷取管理物件的集合。
            ManagementObjectSearcher objSc = new ManagementObjectSearcher(strQry);

            // 使用 Foreach 陳述式 存取集合類別中物件 (元素)
            // Get 方法 , 叫用指定的 WMI 查詢 , 並傳回產生的集合。
            foreach (ManagementObject objQry in objSc.Get())
            {
                //判斷是否與選取網卡名稱一樣
                if (objQry["Caption"].ToString() == strNetAdapterName)
                {
                    label3.Text = objQry["MACAddress"].ToString();
                    label5.Text = objQry["ServiceName"].ToString();
                    label7.Text = objQry["Index"].ToString();
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            strIndex = label7.Text; //取的要設定之網卡Index
            SetAuto(); // 呼叫 SetAuto 程序 , 設定網路介面卡組態
        }

        private void SetAuto()
        {
            // 建立 ManagementObject 物件 ( Scope , Path , options )
            objCls = new ManagementObject(strNS, strCls + ".INDEX=" + strIndex, null);
            // InvokeMethod 方法 : 在物件上叫用方法。
            objCls.InvokeMethod("EnableDHCP", null); // 設定自動取得 IP
            objCls.InvokeMethod("ReleaseDHCPLease", null); // 釋放 IP
            objCls.InvokeMethod("RenewDHCPLease", null); // 重新取得 IP
            objCls.InvokeMethod("SetDNSServerSearchOrder", null);//設定自動取得DNS
            MessageBox.Show("自動取得IP設定完成!", "設定完成", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }

        public static bool IsIPAddress(string ip)//驗證IP位置是否為正確
        {
            string[] arr = ip.Split('.');
            if (arr.Length != 4)
                return false;
            string pattern = @"\d{1,3}";
            for (int i = 0; i < arr.Length; i++)
            {
                string d = arr[i];
                if (i == 0 && d == "0")
                    return false;
                if (!Regex.IsMatch(d, pattern))
                    return false;
                if (d != "0")
                {
                    d = d.TrimStart('0');
                    if (d == "")
                        return false;
                    if (int.Parse(d) > 255)
                        return false;
                }
            } return true;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                ManagementClass mmc = new ManagementClass("Win32_OperatingSystem");
                mmc.Scope.Options.EnablePrivileges = true; //取得作業系統使用者權限
                foreach (ManagementObject mo in mmc.GetInstances())
                {
                    mo.InvokeMethod("Reboot", null, null); //呼叫一般重新啟動
                }
                mmc.Dispose();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            string MachineName = txt_New_PCName.Text.Trim();
            if (MachineName.Length == 0)
            {
                MessageBox.Show("請填寫電腦名稱!", "錯誤!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            bool succeeded = SetComputerName(MachineName);
            bool succeeded2 = SetComputerNameEx(_COMPUTER_NAME_FORMAT.ComputerNamePhysicalDnsHostname, MachineName);

            if (succeeded && succeeded2)
            {
                MessageBox.Show("更改完成!請重新開機!", "完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
                button3.Enabled = true;
                DialogResult dr = MessageBox.Show("是否立即重新啟動電腦?", "重新啟動", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                if (dr==DialogResult.Yes)
                {
                    button3.PerformClick();//呼叫button3事件
                }
                else
                {
                    return;
                }
            }
            else
            {
                MessageBox.Show("電腦名稱錯誤!", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        enum _COMPUTER_NAME_FORMAT
        {
            ComputerNameNetBIOS,
            ComputerNameDnsHostname,
            ComputerNameDnsDomain,
            ComputerNameDnsFullyQualified,
            ComputerNamePhysicalNetBIOS,
            ComputerNamePhysicalDnsHostname,
            ComputerNamePhysicalDnsDomain,
            ComputerNamePhysicalDnsFullyQualified,
            ComputerNameMax
        };
    }
}
程式碼下載:SetIPAndHostName.rar




資料來源: https://dotblogs.com.tw/box5068/2012/01/30/67097

留言

這個網誌中的熱門文章

[C#]Windows 10 停用與啟用網路卡(連線)[手把手教程][原創]

ASP.NET Web API 將傳回的值轉換從控制器動作至 HTTP 回應訊息的方式。