{"id":449,"date":"2025-03-03T22:32:20","date_gmt":"2025-03-03T14:32:20","guid":{"rendered":"https:\/\/yuthk.com\/?p=449"},"modified":"2025-03-03T22:36:08","modified_gmt":"2025-03-03T14:36:08","slug":"donet%e7%aa%97%e5%8f%a3%e7%a8%8b%e5%ba%8fc%e5%ae%9e%e7%8e%b0%e4%bf%ae%e6%94%b9ip%e5%9c%b0%e5%9d%80","status":"publish","type":"post","link":"https:\/\/yuthk.com\/?p=449","title":{"rendered":"doNet\u7a97\u53e3\u7a0b\u5e8f(C#)\u5b9e\u73b0\u4fee\u6539IP\u5730\u5740"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\"><strong>\u4ee3\u7801\u529f\u80fd\u6982\u8ff0<\/strong><\/h3>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>\u7f51\u7edc\u9002\u914d\u5668\u7ba1\u7406<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u52a0\u8f7d\u7269\u7406\u7f51\u5361\u5217\u8868\uff0c\u8fc7\u6ee4\u865a\u62df\u7f51\u5361\u3002<\/li>\n\n\n\n<li>\u663e\u793a\u9009\u4e2d\u7f51\u5361\u7684\u8be6\u7ec6\u4fe1\u606f\uff08IP\u3001\u5b50\u7f51\u63a9\u7801\u3001\u7f51\u5173\u3001DNS\uff09\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u8f93\u5165\u9a8c\u8bc1<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u9650\u5236 IP \u8f93\u5165\u6846\u53ea\u80fd\u8f93\u5165\u6570\u5b57\u3002<\/li>\n\n\n\n<li>\u9a8c\u8bc1 IP\u3001\u5b50\u7f51\u63a9\u7801\u3001\u7f51\u5173\u3001DNS \u7684\u683c\u5f0f\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u7f51\u7edc\u914d\u7f6e\u4fdd\u5b58<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u4f7f\u7528&nbsp;<code>netsh<\/code>&nbsp;\u547d\u4ee4\u914d\u7f6e\u9759\u6001 IP \u548c DNS\u3002<\/li>\n\n\n\n<li>\u68c0\u6d4b\u5e76\u89e3\u51b3 IP \u51b2\u7a81\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u81ea\u52a8\u83b7\u53d6 IP\/DNS<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u5c06\u7f51\u5361\u8bbe\u7f6e\u4e3a\u81ea\u52a8\u83b7\u53d6 IP \u548c DNS\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u7f51\u5361\u72b6\u6001\u7ba1\u7406<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u542f\u7528\u6216\u7981\u7528\u9009\u4e2d\u7684\u7f51\u5361\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u9875\u9762\u5237\u65b0<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u6e05\u7a7a\u8f93\u5165\u5e76\u91cd\u65b0\u52a0\u8f7d\u9002\u914d\u5668\u5217\u8868\u548c\u9ed8\u8ba4\u503c\u3002<\/li>\n\n\n\n<li><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u6839\u636e\u81ea\u8eab\u4e1a\u52a1\u9700\u8981\uff0c10\u548c34\u4e3a\u9ed8\u8ba4\u8f93\u5165\u7684\u9879\uff0c\u9ed8\u8ba4\u7f51\u5173\u5728ip\u5730\u5740\u8f93\u5165\u540e\u81ea\u52a8\u586b\u5165\u7b2c\u4e09\u6bb5\u7684x<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u6210\u679c\u5c55\u793a<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/03\/image.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"734\" height=\"361\" data-original=\"\/wp-content\/uploads\/2025\/03\/image.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-450\"\/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/03\/image-1.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"734\" height=\"361\" data-original=\"\/wp-content\/uploads\/2025\/03\/image-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-453\"\/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u6e90\u7801<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>using AntdUI;\nusing Microsoft.Win32;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Data;\nusing System.Diagnostics;\nusing System.DirectoryServices.AccountManagement;\nusing System.Drawing;\nusing System.Linq;\nusing System.Management;\nusing System.Net.NetworkInformation;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing Button = AntdUI.Button;\n\nnamespace AntdUIDemo.Views\n{\n    public partial class IPSettings : UserControl\n    {\n        private AntdUI.Window window; \/\/ \u7236\u7a97\u53e3\u5f15\u7528\n\n        public IPSettings(AntdUI.Window _window)\n        {\n            window = _window;\n            InitializeComponent();\n            AttachValidationEvents();  \/\/ \u7ed1\u5b9a\u8f93\u5165\u9a8c\u8bc1\u4e8b\u4ef6\n            LoadNetworkAdapters();    \/\/ \u52a0\u8f7d\u7f51\u7edc\u9002\u914d\u5668\u5217\u8868\n            InitializeInputs();      \/\/ \u521d\u59cb\u5316\u8f93\u5165\u6846\u9ed8\u8ba4\u503c\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u52a0\u8f7d\u7f51\u7edc\u9002\u914d\u5668\u5217\u8868\n        \/\/\/ &lt;\/summary&gt;\n        private void LoadNetworkAdapters()\n        {\n            selectAdapter.Items.Clear(); \/\/ \u6e05\u7a7a\u4e0b\u62c9\u5217\u8868\n            try\n            {\n                \/\/ \u83b7\u53d6\u6240\u6709\u7269\u7406\u7f51\u5361\uff08\u8fc7\u6ee4\u56de\u73af\u548c\u865a\u62df\u7f51\u5361\uff09\n                var physicalAdapters = NetworkInterface.GetAllNetworkInterfaces()\n                    .Where(ni =&gt; ni.NetworkInterfaceType != NetworkInterfaceType.Loopback &amp;&amp;\n                                 !IsVirtualAdapter(ni.Description)) \/\/ \u8fc7\u6ee4\u6389\u865a\u62df\u7f51\u5361\n                    .ToList();\n\n                \/\/ \u5c06\u6240\u6709\u7269\u7406\u7f51\u5361\u6dfb\u52a0\u5230\u4e0b\u62c9\u5217\u8868\n                foreach (var adapter in physicalAdapters)\n                {\n                    selectAdapter.Items.Add(new SelectItem(adapter.Name, adapter.Name));\n                }\n\n                \/\/ \u7ed1\u5b9a\u9009\u4e2d\u4e8b\u4ef6\n                selectAdapter.SelectedValueChanged += SelectAdapter_SelectedValueChanged;\n\n                \/\/ \u9ed8\u8ba4\u9009\u4e2d\u6d3b\u52a8\u7684\u7f51\u5361\n                var activeAdapter = physicalAdapters.FirstOrDefault(ni =&gt; ni.OperationalStatus == OperationalStatus.Up);\n                if (activeAdapter != null)\n                {\n                    var item = selectAdapter.Items.Cast&lt;SelectItem&gt;()\n                        .FirstOrDefault(i =&gt; i.Text.Equals(activeAdapter.Name, StringComparison.OrdinalIgnoreCase));\n                    if (item != null)\n                    {\n                        selectAdapter.SelectedValue = item.Text;\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                MessageBox.Show($\"\u83b7\u53d6\u9002\u914d\u5668\u5931\u8d25: {ex.Message}\");\n            }\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u68c0\u67e5\u662f\u5426\u4e3a\u865a\u62df\u7f51\u5361\n        \/\/\/ &lt;\/summary&gt;\n        private bool IsVirtualAdapter(string adapterName)\n        {\n            \/\/ \u865a\u62df\u7f51\u5361\u7684\u5173\u952e\u5b57\u5217\u8868\n            string&#91;] virtualKeywords = { \"Virtual\", \"Hyper-V\", \"VPN\", \"VMware\", \"VirtualBox\", \"TAP\", \"Tunnel\" };\n\n            \/\/ \u68c0\u67e5\u9002\u914d\u5668\u540d\u79f0\u662f\u5426\u5305\u542b\u865a\u62df\u7f51\u5361\u5173\u952e\u5b57\n            return virtualKeywords.Any(keyword =&gt; adapterName.IndexOf(keyword, StringComparison.OrdinalIgnoreCase) &gt;= 0);\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u5f53\u7528\u6237\u9009\u62e9\u9002\u914d\u5668\u65f6\u66f4\u65b0\u4fe1\u606f\n        \/\/\/ &lt;\/summary&gt;\n        private void SelectAdapter_SelectedValueChanged(object sender, EventArgs e)\n        {\n            string selectedAdapter = selectAdapter.SelectedValue?.ToString();\n            if (!string.IsNullOrEmpty(selectedAdapter))\n            {\n                UpdateAdapterInfo(selectedAdapter); \/\/ \u66f4\u65b0\u7f51\u5361\u4fe1\u606f\n            }\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u66f4\u65b0\u9009\u4e2d\u7684\u9002\u914d\u5668\u4fe1\u606f\n        \/\/\/ &lt;\/summary&gt;\n        private void UpdateAdapterInfo(string adapterName)\n        {\n            var adapter = NetworkInterface.GetAllNetworkInterfaces()\n                .FirstOrDefault(ni =&gt; ni.Name.Contains(adapterName));\n\n            if (adapter != null)\n            {\n                \/\/ \u63d0\u53d6 IP\u3001\u5b50\u7f51\u63a9\u7801\u3001\u7f51\u5173\u3001DNS \u4fe1\u606f\n                var ipProperties = adapter.GetIPProperties();\n                string ipAddress = \"\u672a\u5206\u914d\";\n                string subnetMask = \"\u672a\u5206\u914d\";\n                string gateway = \"\u672a\u5206\u914d\";\n                string dns = \"\u672a\u5206\u914d\";\n\n                \/\/ \u83b7\u53d6 IPv4 \u5730\u5740\u548c\u5b50\u7f51\u63a9\u7801\n                var unicastAddress = ipProperties.UnicastAddresses\n                    .FirstOrDefault(addr =&gt; addr.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);\n                if (unicastAddress != null)\n                {\n                    ipAddress = unicastAddress.Address.ToString();\n                    subnetMask = unicastAddress.IPv4Mask.ToString();\n                }\n\n                \/\/ \u83b7\u53d6\u9ed8\u8ba4\u7f51\u5173\n                var gatewayAddress = ipProperties.GatewayAddresses\n                    .FirstOrDefault(addr =&gt; addr.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);\n                if (gatewayAddress != null)\n                {\n                    gateway = gatewayAddress.Address.ToString();\n                }\n\n                \/\/ \u83b7\u53d6 DNS \u5730\u5740\n                var dnsAddress = ipProperties.DnsAddresses\n                    .FirstOrDefault(addr =&gt; addr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);\n                if (dnsAddress != null)\n                {\n                    dns = dnsAddress.ToString();\n                }\n\n                \/\/ \u663e\u793a\u4fe1\u606f\u5230 Label\n                labelAdapterInfo.Text = $\"\u63cf\u8ff0: {adapter.Description}\\n\" +\n                                       $\"\u72b6\u6001: {adapter.OperationalStatus}\\n\" +\n                                       $\"IP \u5730\u5740: {ipAddress}\\n\" +\n                                       $\"\u5b50\u7f51\u63a9\u7801: {subnetMask}\\n\" +\n                                       $\"\u9ed8\u8ba4\u7f51\u5173: {gateway}\\n\" +\n                                       $\"DNS: {dns}\";\n            }\n            else\n            {\n                labelAdapterInfo.Text = \"\u672a\u627e\u5230\u7f51\u5361\u4fe1\u606f\";\n            }\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u521d\u59cb\u5316\u8f93\u5165\u6846\u9ed8\u8ba4\u503c\n        \/\/\/ &lt;\/summary&gt;\n        private void InitializeInputs()\n        {\n            inputIP1.Text = \"10\";\n            inputIP2.Text = \"34\";\n            inputIP3.Text = \"\";\n            inputIP4.Text = \"\";\n            inputSubnet.Text = \"255.255.255.0\";\n            inputGateway.Text = \"10.34.x.254\";\n            inputDNS.Text = \"10.0.14.14\";\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u7ed1\u5b9a\u8f93\u5165\u9a8c\u8bc1\u4e8b\u4ef6\n        \/\/\/ &lt;\/summary&gt;\n        private void AttachValidationEvents()\n        {\n            \/\/ \u7ed1\u5b9a IP \u8f93\u5165\u6846\u7684\u952e\u76d8\u9a8c\u8bc1\uff08\u4ec5\u5141\u8bb8\u6570\u5b57\uff09\n            inputIP1.KeyPress += InputIP_KeyPress;\n            inputIP2.KeyPress += InputIP_KeyPress;\n            inputIP3.KeyPress += InputIP_KeyPress;\n            inputIP4.KeyPress += InputIP_KeyPress;\n\n            \/\/ IP3 \u8f93\u5165\u53d8\u5316\u65f6\u66f4\u65b0\u7f51\u5173\n            inputIP3.TextChanged += (s, e) =&gt; UpdateGateway();\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u9650\u5236 IP \u8f93\u5165\u6846\u53ea\u80fd\u8f93\u5165\u6570\u5b57\n        \/\/\/ &lt;\/summary&gt;\n        private void InputIP_KeyPress(object sender, KeyPressEventArgs e)\n        {\n            if (!char.IsControl(e.KeyChar) &amp;&amp; !char.IsDigit(e.KeyChar))\n                e.Handled = true;\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u6839\u636e IP3 \u8f93\u5165\u66f4\u65b0\u7f51\u5173\n        \/\/\/ &lt;\/summary&gt;\n        private void UpdateGateway()\n        {\n            string x = inputIP3.Text.Trim();\n            inputGateway.Text = $\"10.34.{(string.IsNullOrEmpty(x) ? \"x\" : x)}.254\";\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u9a8c\u8bc1\u6240\u6709\u8f93\u5165\u6846\n        \/\/\/ &lt;\/summary&gt;\n        private bool ValidateInputs()\n        {\n            bool valid = true;\n            ValidateInput(inputIP1, ref valid);\n            ValidateInput(inputIP2, ref valid);\n            ValidateInput(inputIP3, ref valid);\n            ValidateInput(inputIP4, ref valid);\n            ValidateInput(inputSubnet, ref valid, IsValidSubnet);\n            ValidateInput(inputGateway, ref valid, IsValidIP);\n            ValidateInput(inputDNS, ref valid, IsValidIP);\n            return valid;\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u9a8c\u8bc1\u5355\u4e2a\u8f93\u5165\u6846\n        \/\/\/ &lt;\/summary&gt;\n        private void ValidateInput(Input input, ref bool valid, Func&lt;string, bool&gt; validator = null)\n        {\n            bool isValid = validator == null ? IsValidIPSegment(input.Text) : validator(input.Text);\n            input.BorderColor = isValid ? Color.Black : Color.Red;\n            if (!isValid) valid = false;\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u9a8c\u8bc1 IP \u6bb5\u662f\u5426\u4e3a 0-255\n        \/\/\/ &lt;\/summary&gt;\n        private bool IsValidIPSegment(string segment)\n        {\n            return int.TryParse(segment, out int num) &amp;&amp; num &gt;= 0 &amp;&amp; num &lt;= 255;\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u9a8c\u8bc1\u5b8c\u6574 IP \u5730\u5740\u683c\u5f0f\n        \/\/\/ &lt;\/summary&gt;\n        private bool IsValidIP(string ip)\n        {\n            return Regex.IsMatch(ip, @\"^((25&#91;0-5]|2&#91;0-4]\\d|&#91;01]?\\d\\d?)\\.){3}(25&#91;0-5]|2&#91;0-4]\\d|&#91;01]?\\d\\d?)$\");\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u9a8c\u8bc1\u5b50\u7f51\u63a9\u7801\u662f\u5426\u5408\u6cd5\n        \/\/\/ &lt;\/summary&gt;\n        private bool IsValidSubnet(string subnet)\n        {\n            return IsValidIP(subnet) &amp;&amp; subnet.Split('.').All(s =&gt; s == \"0\" || s == \"128\" || s == \"192\" ||\n                s == \"224\" || s == \"240\" || s == \"248\" || s == \"252\" || s == \"254\" || s == \"255\");\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u6267\u884c netsh \u547d\u4ee4\n        \/\/\/ &lt;\/summary&gt;\n        private void ExecuteNetshCommand(string arguments)\n        {\n            try\n            {\n                ProcessStartInfo psi = new ProcessStartInfo(\"netsh\", arguments)\n                {\n                    Verb = \"runas\", \/\/ \u8bf7\u6c42\u7ba1\u7406\u5458\u6743\u9650\n                    UseShellExecute = true,\n                    CreateNoWindow = true,\n                    WindowStyle = ProcessWindowStyle.Hidden\n                };\n                Process.Start(psi)?.WaitForExit();\n            }\n            catch (Exception ex)\n            {\n                MessageBox.Show($\"\u6267\u884c\u547d\u4ee4\u5931\u8d25: {ex.Message}\");\n            }\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u4fdd\u5b58\u7f51\u7edc\u914d\u7f6e\n        \/\/\/ &lt;\/summary&gt;\n        private async void btnSave_Click(object sender, EventArgs e)\n        {\n            if (!ValidateInputs())\n            {\n                MessageBox.Show(\"\u8f93\u5165\u65e0\u6548\uff0c\u8bf7\u68c0\u67e5\u7ea2\u8272\u6807\u8bb0\u7684\u5b57\u6bb5\u3002\");\n                return;\n            }\n\n            string adapterName = selectAdapter.SelectedValue?.ToString();\n            if (string.IsNullOrEmpty(adapterName))\n            {\n                MessageBox.Show(\"\u8bf7\u9009\u62e9\u4e00\u4e2a\u7f51\u7edc\u9002\u914d\u5668\u3002\");\n                return;\n            }\n\n            string ip = $\"{inputIP1.Text}.{inputIP2.Text}.{inputIP3.Text}.{inputIP4.Text}\";\n            string subnet = inputSubnet.Text;\n            string gateway = inputGateway.Text;\n            string dns = inputDNS.Text;\n\n            \/\/ \u68c0\u67e5 IP \u51b2\u7a81\n            var conflictingAdapter = GetConflictingAdapter(ip, subnet, gateway);\n            if (conflictingAdapter != null)\n            {\n                await ResolveConflict(conflictingAdapter); \/\/ \u89e3\u51b3\u51b2\u7a81\n                MessageBox.Show($\"\u68c0\u6d4b\u5230 IP \u51b2\u7a81\uff0c\u5df2\u5c06\u51b2\u7a81\u7f51\u5361 {conflictingAdapter.Name} \u8bbe\u7f6e\u4e3a DHCP \u5e76\u7981\u7528\u3002\");\n            }\n\n            \/\/ \u7981\u7528\u6309\u94ae\uff0c\u9632\u6b62\u91cd\u590d\u70b9\u51fb\n            btnSave.Enabled = false;\n\n            try\n            {\n                \/\/ \u5f02\u6b65\u6267\u884c netsh \u547d\u4ee4\n                await Task.Run(() =&gt;\n                {\n                    ExecuteNetshCommand($\"interface ip set address name=\\\"{adapterName}\\\" static {ip} {subnet} {gateway} 1\");\n                    ExecuteNetshCommand($\"interface ip set dns name=\\\"{adapterName}\\\" static {dns}\");\n                });\n\n                MessageBox.Show(\"\u7f51\u7edc\u914d\u7f6e\u5df2\u66f4\u65b0\uff01\");\n                UpdateAdapterInfo(adapterName); \/\/ \u5237\u65b0\u663e\u793a\u4fe1\u606f\n            }\n            catch (Exception ex)\n            {\n                MessageBox.Show($\"\u6267\u884c\u547d\u4ee4\u5931\u8d25: {ex.Message}\");\n            }\n            finally\n            {\n                btnSave.Enabled = true; \/\/ \u91cd\u65b0\u542f\u7528\u6309\u94ae\n            }\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u83b7\u53d6\u51b2\u7a81\u7684\u7f51\u5361\n        \/\/\/ &lt;\/summary&gt;\n        private NetworkInterface GetConflictingAdapter(string ip, string subnet, string gateway)\n        {\n            foreach (var adapter in NetworkInterface.GetAllNetworkInterfaces())\n            {\n                var ipProperties = adapter.GetIPProperties();\n\n                \/\/ \u68c0\u67e5 IP \u5730\u5740\u548c\u5b50\u7f51\u63a9\u7801\n                foreach (var unicastAddress in ipProperties.UnicastAddresses)\n                {\n                    if (unicastAddress.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)\n                    {\n                        string existingIp = unicastAddress.Address.ToString();\n                        string existingSubnet = unicastAddress.IPv4Mask?.ToString();\n\n                        if (existingIp == ip &amp;&amp; existingSubnet == subnet)\n                        {\n                            return adapter; \/\/ \u8fd4\u56de\u51b2\u7a81\u7684\u7f51\u5361\n                        }\n                    }\n                }\n\n                \/\/ \u68c0\u67e5\u7f51\u5173\n                foreach (var gatewayAddress in ipProperties.GatewayAddresses)\n                {\n                    if (gatewayAddress.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)\n                    {\n                        string existingGateway = gatewayAddress.Address.ToString();\n\n                        if (existingGateway == gateway)\n                        {\n                            return adapter; \/\/ \u8fd4\u56de\u51b2\u7a81\u7684\u7f51\u5361\n                        }\n                    }\n                }\n            }\n            return null; \/\/ \u65e0\u51b2\u7a81\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u89e3\u51b3\u51b2\u7a81\uff1a\u5c06\u51b2\u7a81\u7f51\u5361\u8bbe\u7f6e\u4e3a DHCP \u5e76\u7981\u7528\n        \/\/\/ &lt;\/summary&gt;\n        private async Task ResolveConflict(NetworkInterface conflictingAdapter)\n        {\n            try\n            {\n                await Task.Run(() =&gt;\n                {\n                    ExecuteNetshCommand($\"interface ip set address name=\\\"{conflictingAdapter.Name}\\\" source=dhcp\");\n                    ExecuteNetshCommand($\"interface ip set dns name=\\\"{conflictingAdapter.Name}\\\" source=dhcp\");\n                });\n                DisableAdapter(conflictingAdapter.Id); \/\/ \u7981\u7528\u7f51\u5361\n            }\n            catch (Exception ex)\n            {\n                throw new Exception($\"\u89e3\u51b3\u51b2\u7a81\u5931\u8d25: {ex.Message}\");\n            }\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u7981\u7528\u7f51\u5361\n        \/\/\/ &lt;\/summary&gt;\n        private void DisableAdapter(string interfaceId)\n        {\n            try\n            {\n                ManagementObjectSearcher searcher = new ManagementObjectSearcher(\n                    $\"SELECT * FROM Win32_NetworkAdapter WHERE GUID = '{interfaceId}'\");\n\n                foreach (ManagementObject adapter in searcher.Get())\n                {\n                    adapter.InvokeMethod(\"Disable\", null);\n                }\n            }\n            catch (Exception ex)\n            {\n                throw new Exception($\"\u7981\u7528\u7f51\u5361\u5931\u8d25: {ex.Message}\");\n            }\n        }\n\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u8bbe\u7f6e\u4e3a\u81ea\u52a8\u83b7\u53d6 IP \u548c DNS\n        \/\/\/ &lt;\/summary&gt;\n        private async void btnSetAuto_Click(object sender, EventArgs e)\n        {\n            string adapterName = selectAdapter.SelectedValue?.ToString();\n            if (string.IsNullOrEmpty(adapterName))\n            {\n                MessageBox.Show(\"\u8bf7\u9009\u62e9\u4e00\u4e2a\u7f51\u7edc\u9002\u914d\u5668\u3002\");\n                return;\n            }\n\n            btnSetAuto.Enabled = false; \/\/ \u7981\u7528\u6309\u94ae\n\n            try\n            {\n                await Task.Run(() =&gt;\n                {\n                    ExecuteNetshCommand($\"interface ip set address name=\\\"{adapterName}\\\" source=dhcp\");\n                    ExecuteNetshCommand($\"interface ip set dns name=\\\"{adapterName}\\\" source=dhcp\");\n                });\n\n                MessageBox.Show(\"\u5df2\u8bbe\u7f6e\u4e3a\u81ea\u52a8\u83b7\u53d6 IP \u548c DNS\uff01\");\n                UpdateAdapterInfo(adapterName); \/\/ \u5237\u65b0\u663e\u793a\u4fe1\u606f\n            }\n            catch (Exception ex)\n            {\n                MessageBox.Show($\"\u6267\u884c\u547d\u4ee4\u5931\u8d25: {ex.Message}\");\n            }\n            finally\n            {\n                btnSetAuto.Enabled = true; \/\/ \u91cd\u65b0\u542f\u7528\u6309\u94ae\n            }\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u5207\u6362\u7f51\u5361\u542f\u7528\/\u7981\u7528\u72b6\u6001\n        \/\/\/ &lt;\/summary&gt;\n        private void btnToggleAdapter_Click(object sender, EventArgs e)\n        {\n            string adapterName = selectAdapter.SelectedValue?.ToString();\n            if (string.IsNullOrEmpty(adapterName))\n            {\n                MessageBox.Show(\"\u8bf7\u9009\u62e9\u4e00\u4e2a\u7f51\u7edc\u9002\u914d\u5668\u3002\");\n                return;\n            }\n\n            try\n            {\n                var adapter = GetNetworkAdapterByName(adapterName);\n                if (adapter == null)\n                {\n                    MessageBox.Show(\"\u672a\u627e\u5230\u9009\u4e2d\u7684\u7f51\u7edc\u9002\u914d\u5668\u3002\");\n                    return;\n                }\n\n                bool isEnabled = IsAdapterEnabled(adapter);\n                if (isEnabled)\n                {\n                    string interfaceId = adapter&#91;\"GUID\"].ToString();\n                    DisableAdapter(interfaceId);\n                    MessageBox.Show($\"\u5df2\u7981\u7528\u7f51\u5361: {adapterName}\");\n                }\n                else\n                {\n                    EnableAdapter(adapter);\n                    MessageBox.Show($\"\u5df2\u542f\u7528\u7f51\u5361: {adapterName}\");\n                }\n\n                UpdateAdapterInfo(adapterName); \/\/ \u5237\u65b0\u663e\u793a\u4fe1\u606f\n            }\n            catch (Exception ex)\n            {\n                MessageBox.Show($\"\u5207\u6362\u7f51\u5361\u72b6\u6001\u5931\u8d25: {ex.Message}\");\n            }\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u901a\u8fc7\u540d\u79f0\u83b7\u53d6\u7f51\u5361\n        \/\/\/ &lt;\/summary&gt;\n        private ManagementObject GetNetworkAdapterByName(string adapterName)\n        {\n            ManagementObjectSearcher searcher = new ManagementObjectSearcher(\n                $\"SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionID = '{adapterName}'\");\n            return searcher.Get().OfType&lt;ManagementObject&gt;().FirstOrDefault();\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u68c0\u67e5\u7f51\u5361\u662f\u5426\u542f\u7528\n        \/\/\/ &lt;\/summary&gt;\n        private bool IsAdapterEnabled(ManagementObject adapter)\n        {\n            return (bool)adapter&#91;\"NetEnabled\"];\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u542f\u7528\u7f51\u5361\n        \/\/\/ &lt;\/summary&gt;\n        private void EnableAdapter(ManagementObject adapter)\n        {\n            try\n            {\n                adapter.InvokeMethod(\"Enable\", null);\n            }\n            catch (Exception ex)\n            {\n                throw new Exception($\"\u542f\u7528\u7f51\u5361\u5931\u8d25: {ex.Message}\");\n            }\n        }\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u5237\u65b0\u9875\u9762\n        \/\/\/ &lt;\/summary&gt;\n        private void refreshButton_Click(object sender, EventArgs e)\n        {\n            selectAdapter.Clear();\n            inputIP1.Clear();\n            inputIP2.Clear();\n            inputIP3.Clear();\n            inputIP4.Clear();\n            inputSubnet.Clear();\n            inputGateway.Clear();\n            inputDNS.Clear();\n            labelAdapterInfo.Text = \"\";\n            LoadData(); \/\/ \u91cd\u65b0\u52a0\u8f7d\u6570\u636e\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ \u91cd\u65b0\u52a0\u8f7d\u6570\u636e\n        \/\/\/ &lt;\/summary&gt;\n        private void LoadData()\n        {\n            LoadNetworkAdapters(); \/\/ \u91cd\u65b0\u52a0\u8f7d\u9002\u914d\u5668\n            InitializeInputs();     \/\/ \u91cd\u7f6e\u8f93\u5165\u6846\u9ed8\u8ba4\u503c\n        }\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4ee3\u7801\u529f\u80fd\u6982\u8ff0 \u6839\u636e\u81ea\u8eab\u4e1a\u52a1\u9700\u8981\uff0c10\u548c34\u4e3a\u9ed8\u8ba4\u8f93\u5165\u7684\u9879\uff0c\u9ed8\u8ba4\u7f51\u5173\u5728ip\u5730\u5740\u8f93\u5165\u540e\u81ea\u52a8\u586b\u5165\u7b2c\u4e09\u6bb5\u7684x \u6210\u679c\u5c55\u793a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,25],"tags":[28,27],"class_list":["post-449","post","type-post","status-publish","format-standard","hentry","category-net","category-c","tag-net","tag-c"],"_links":{"self":[{"href":"https:\/\/yuthk.com\/index.php?rest_route=\/wp\/v2\/posts\/449","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yuthk.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yuthk.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yuthk.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yuthk.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=449"}],"version-history":[{"count":2,"href":"https:\/\/yuthk.com\/index.php?rest_route=\/wp\/v2\/posts\/449\/revisions"}],"predecessor-version":[{"id":454,"href":"https:\/\/yuthk.com\/index.php?rest_route=\/wp\/v2\/posts\/449\/revisions\/454"}],"wp:attachment":[{"href":"https:\/\/yuthk.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=449"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yuthk.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=449"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yuthk.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}