利用PowerShell修改网络配置(IP、网关、子网掩码、DNS)
扑克子
编辑于 2023年03月27日 18:12

修改IP、网关、子网掩码、DNS等配置时需要打开网络配置器配置,有些麻烦。尤其是经常需要重复性操作时(例如去学校图书馆蹭网)。用PowerShell脚本自动修改,方便简单而且十分轻量,程序只需占用1KB空间。

新的修改方法(CIM)

Common Information Model (CIM)

Windows Management Instrumentation (WMI)

Get-CimInstance[1]

代码块
C#
自动换行
复制代码
param([int] $inputNum)
 
$cim = Get-CimInstance Win32_NetworkAdapterConfiguration -Filter "IPEnabled = True"

function CheckReturn {
    param ($obj)
    if ($obj.ReturnValue -eq 0) {
        "Successed"
    }
    else {
        "Failed"
    }
}

if ($inputNum -eq 0) {
    CheckReturn(Invoke-CimMethod $cim -MethodName EnableDHCP)
    CheckReturn(Invoke-CimMethod $cim -MethodName SetDNSServerSearchOrder)
}
elseif (($inputNum -gt 0) -and ($inputNum -lt 254)) {
    CheckReturn(Invoke-CimMethod $cim -MethodName EnableStatic -Arguments @{
            IPAddress  = @("10.200.200." + $inputNum.ToString());
            SubnetMask = @("255.255.255.0")
        })
    CheckReturn(Invoke-CimMethod $cim -MethodName SetGateways -Arguments @{
            DefaultIPGateway = @("10.200.200.254")
        })
    CheckReturn(Invoke-CimMethod $cim -MethodName SetDNSServerSearchOrder -Arguments @{
            DNSServerSearchOrder = @("114.114.114.114")
        })
}
else {
    "Input number between 1 to 253 to set network adapter, or 0 to disable network adapter"
}
复制成功

旧的修改方法(WMI)

Get-WmiObject[2]

代码块
C#
自动换行
复制代码
param([int] $inputNum)

$wmi = Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "IPEnabled = True"

function CheckReturn {
    param ($obj)
    if ($obj.ReturnValue -eq 0) {
        "Successed"
    }
    else {
        "Failed"
    }
}

if ($inputNum -eq 0)
{
    CheckReturn($wmi.EnableDHCP())
    CheckReturn($wmi.SetDNSServerSearchOrder())
}
elseif (($inputNum -gt 0) -and ($inputNum -lt 254))
{
    CheckReturn($wmi.EnableStatic("10.200.200." + $inputNum.ToString(), "255.255.255.0"))
    CheckReturn($wmi.SetGateways("10.200.200.254"))
    CheckReturn($wmi.SetDNSServerSearchOrder("114.114.114.114"))
}
else 
{
    "Input number between 1 to 253 to set network adapter, or 0 to disable network adapter"
}
复制成功

附:C#代码

代码块
C#
自动换行
复制代码
#nullable enable
using System.Management;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;

namespace NetworkAdapter;

[SupportedOSPlatform(nameof(OSPlatform.Windows))]
public static class NetworkAdapter
{
    public static void Main()
    {
        while (true)
        {
            if (!int.TryParse(Console.ReadLine(), out var temp))
                continue;
            switch (temp)
            {
                case 0:
                    DisableNetworkAdapter();
                    return;
                case > 0 and < 254:
                    SetNetworkAdapter("10.200.200." + temp, "255.255.255.0", "10.200.200.254", "114.114.114.114");
                    return;
                default:
                    Console.WriteLine("输入错误:请输入机房电脑序号(1-253),输入0恢复默认网络设置");
                    break;
            }
        }
    }
    private static void SetNetworkAdapter(string ipAddress, string subnetMask, string gateway, string dns)
    {
        if (GetManagementObject() is { } mo)
        {
            var inPar = mo.GetMethodParameters("EnableStatic");
            //设置ip地址和子网掩码
            inPar["IPAddress"] = new[] { ipAddress };
            inPar["SubnetMask"] = new[] { subnetMask };
            _ = mo.InvokeMethod("EnableStatic", inPar, null!);

            //设置网关地址
            inPar = mo.GetMethodParameters("SetGateways");
            inPar["DefaultIPGateway"] = new[] { gateway };
            _ = mo.InvokeMethod("SetGateways", inPar, null!);

            //设置DNS
            inPar = mo.GetMethodParameters("SetDNSServerSearchOrder");
            inPar["DNSServerSearchOrder"] = new[] { dns };
            _ = mo.InvokeMethod("SetDNSServerSearchOrder", inPar, null!);
        }
    }

    private static void DisableNetworkAdapter()
    {
        if (GetManagementObject() is { } mo)
        {
            _ = mo.InvokeMethod("SetDNSServerSearchOrder", Array.Empty<object>());
            _ = mo.InvokeMethod("EnableDHCP", Array.Empty<object>());
        }
    }

    private static ManagementObject? GetManagementObject()
    {
        var mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
        var moc = mc.GetInstances();
        foreach (var o in moc)
            if ((bool)o["IPEnabled"])
                return (ManagementObject)o;

        return null;
    }
}
复制成功

代码仓库

Github: https://github.com/Poker-sang/NetworkAdapter


引用图片

https://twitter.com/Rinka_private/status/1464072551525609480

[みえはる] ID = 31214116

参考资料

[1] Get-CimInstance(https://learn.microsoft.com/powershell/scripting/samples/getting-wmi-objects--get-ciminstance-)

[2] Get-WmiObject(https://learn.microsoft.com/powershell/module/microsoft.powershell.management/get-wmiobject)