如何通过WMI修改IP地址?附从数据库获取IP信息的C#代码
使用WMI修改IP地址并从数据库获取配置信息
没问题,我帮你把从数据库读取IP配置、再通过WMI修改本地IP的完整方案整理好,分步骤来看:
第一步:从数据库读取IP配置信息
这一步的核心是根据当前主机名,从指定数据库中拉取最新的IP地址、子网掩码和网关信息,然后把IP和子网掩码赋值给对应的Label控件。以下是完整的C#实现代码,包含了异常处理和DataReader的读取逻辑:
string connection = "Server=192.168.1.10;Database=xxxxx;User Id=xxxxx;Password=xxxxxx;"; try { SqlConnection conn = new SqlConnection(connection); conn.Open(); var query = "SELECT TOP 1 ip_address,subnet,gateway FROM computer_info WHERE pc_name = HOST_NAME() ORDER BY id DESC"; SqlCommand cmd = new SqlCommand(query, conn); SqlDataReader dr = cmd.ExecuteReader(); if (dr.Read()) { // 将数据库查询结果赋值给Label控件 label1.Text = dr["ip_address"].ToString(); label2.Text = dr["subnet"].ToString(); // 顺便把网关值存下来,后面WMI修改IP会用到 string gateway = dr["gateway"].ToString(); } dr.Close(); conn.Close(); } catch (SqlException ex) { // 处理数据库连接或查询异常 MessageBox.Show($"数据库读取失败:{ex.Message}"); } catch (Exception ex) { MessageBox.Show($"操作出错:{ex.Message}"); }
第二步:通过WMI修改本地IP地址
拿到数据库里的配置后,就可以用WMI来修改本地网卡的IP设置了。注意这一步需要程序以管理员权限运行,还要确保项目引用了System.Management程序集。代码如下:
using System.Management; // 从前面的数据库读取步骤中获取配置值 string targetIp = label1.Text; string targetSubnet = label2.Text; // 这里用前面读取到的gateway变量,或者直接从DataReader里拿 string targetGateway = "从数据库读取的网关值"; try { // 获取本地所有网络适配器的WMI实例 ManagementClass networkAdapterClass = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection adapterCollection = networkAdapterClass.GetInstances(); foreach (ManagementObject adapter in adapterCollection) { // 只处理启用了IP协议的适配器 if ((bool)adapter["IPEnabled"]) { // 设置静态IP和子网掩码 ManagementBaseObject ipParams = adapter.GetMethodParameters("EnableStatic"); ipParams["IPAddress"] = new string[] { targetIp }; ipParams["SubnetMask"] = new string[] { targetSubnet }; adapter.InvokeMethod("EnableStatic", ipParams, null); // 设置默认网关(如果网关不为空) if (!string.IsNullOrEmpty(targetGateway)) { ManagementBaseObject gatewayParams = adapter.GetMethodParameters("SetGateways"); gatewayParams["DefaultIPGateway"] = new string[] { targetGateway }; gatewayParams["GatewayCostMetric"] = new int[] { 1 }; adapter.InvokeMethod("SetGateways", gatewayParams, null); } MessageBox.Show("IP地址修改成功!"); break; // 修改第一个符合条件的适配器后退出,可根据需求调整 } } } catch (ManagementException ex) { MessageBox.Show($"WMI操作失败:{ex.Message}"); } catch (Exception ex) { MessageBox.Show($"修改IP时出错:{ex.Message}"); }
关键注意事项
- 必须以管理员权限运行程序,否则WMI操作会因权限不足失败
- 数据库连接字符串里的服务器地址、数据库名、账号密码要替换成你的实际环境信息
- 如果有多张网卡,建议通过适配器的名称(比如
adapter["Description"]返回的描述)来精准筛选,避免修改错误的网卡 - 异常处理可以根据实际需求优化,比如写入日志文件,而不是仅弹出提示框
内容的提问来源于stack exchange,提问作者Dev George
相关产品推荐
相关产品推荐

