通过Powershell脚本更改默认网关和首选DNS

通过Powershell脚本更改默认网关和首选DNS,powershell,Powershell,我想使用Powershell创建一个脚本,以自动更改默认网关的第4个字节,并将与默认网关相同的ip集放入首选DNS 我找到了更改默认网关和DNS的命令,但是我希望一切都是自动的 例如: IPv4配置: IP地址:192.168.45.3 子网掩码:255.255.255.0 默认网关:192.168.45.250 DNS:192.168.60.0 我希望我的程序更改默认网关:192.168.45.249,并将相同的ip放入DNS 对于默认网关的更改,这意味着我们可以在最后一个字节将旧网关IP设置

我想使用Powershell创建一个脚本,以自动更改默认网关的第4个字节,并将与默认网关相同的ip集放入首选DNS

我找到了更改默认网关和DNS的命令,但是我希望一切都是自动的

例如:

IPv4配置: IP地址:192.168.45.3 子网掩码:255.255.255.0 默认网关:192.168.45.250 DNS:192.168.60.0

我希望我的程序更改默认网关:192.168.45.249,并将相同的ip放入DNS

对于默认网关的更改,这意味着我们可以在最后一个字节将旧网关IP设置为do-1(我已经找到了如何设置-1,但不恢复旧地址)

$OldGateway=(获取CimInstance Win32_NetworkAdapterConfiguration | Where Object-FilterScript{$\.IPEnabled})。DefaultIPGateway

$OldGateway.GetType()

$OldGateway[0]

$a、$b、$c、$d=$ip.Split(“.”)
[int]$d=$d
$d=$d-1
[string]$d=$d
$newIP=$a++$b++$c++$d

$newIP

你有什么想法吗?我说得够清楚了吗


谢谢

如果我理解正确,您主要关心的是以一种允许您操作和设置旧网关的方式检索旧网关,您说您已经知道如何操作。 在这种情况下,您可以执行以下操作:

$OldGateway = (Get-CimInstance Win32_NetworkAdapterConfiguration | Where-Object -FilterScript {$_.IPEnabled}).DefaultIPGateway
它将抓取任何iEnabled NIC的网关,并将其放入
$OldGateway
变量中。 请注意,$OldVariable是一个数组,因此,如果您的计算机中有多个活动NIC,它可以包含多个值

$OldGateway.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
这还意味着您需要通过索引访问要操作的值。
$OldGateway[0]
用于列表中的第一个值


这会帮助您开始吗?

我看到您将Laage的答案合并到脚本中。这是检索网络接口网关的好方法,但不幸的是,CIM旨在显示信息,因此它是只读的,我们无法使用它来更改配置

相反,您可以使用Get-WMIOObject来检索和更改配置。然后,我们可以筛选出您想要使用的特定接口(如果您有多个接口,这是常见的,尤其是如果您的计算机是笔记本电脑)

获取WmiObject Win32\u NetworkAdapterConfiguration
为我提供了一个接口列表,我可以使用这些接口进行筛选。在我的情况下,我的适配器名为rt640x64,因此我可以运行
$interface=Get WmiObject Win32_networkadapter配置|其中{$\u.servicename-eq“rt640x64”}

然后,我可以使用
$interface.DefaultIPGateway
.DefaultIPGateway获取网关ip。如果您有多个网关,DefaultIPGateway将返回一个数组,但这并不常见,因此我不必担心

然后可以拆分八位字节并增加最后一个。Powershell可以确定您何时尝试减少字符串,因此我们可以跳过类型转换,但如果需要增加字符串,请小心

$a,$b,$c,$d = $interface.DefaultIPGateway.Split(".")
$d = $d-1 
$newIP = $a+"."+$b+"."+$c+"."+$d
我们可以用两种方式重写它,使其更加简洁: 字符串插值是一个很好的特性,它使处理字符串更容易,所以

$newIP=$a++$b++$c++$

可以写成

$newIP=“$a.$b.$c.$d”

$d=$d-1
可以直接在字符串内部完成:

$newIP=“$a.$b.$c.$($d-1)”

现在,我们可以使用
$interface.SetGateways($newIP)
将接口的网关设置为新IP,DNS服务器可以使用
$interface.SetDNSServerSearchOrder($newIP)

因此,脚本变成:

$interface = Get-WmiObject Win32_NetworkAdapterConfiguration | where{ $_.servicename -eq "name of your interface"}
$a,$b,$c,$d = $interface.DefaultIPGateway.Split(".")
$newIP = "$a.$b.$c.$($d-1)"
$interface.SetGateways($newIP)
$interface.SetDNSServerSearchOrder($newIP)

更改网关需要管理权限,因此您需要从提升的PowerShell提示符运行脚本。您还需要在新的ip上实际存在网关和DNS,否则您的internet连接将停止工作。

能否提供您迄今为止尝试的示例代码?您的意思是要更改网络接口上的配置?如果是,请查看是的,我明天将向您发送我的一段代码,感谢您的网站我认为它将非常有用编辑您的帖子并在那里添加您的代码。这样更易于阅读。我将我的代码放在我的主程序中。是的,非常感谢您提供的信息,我将在今天之后进行测试RNOON在管理员模式下运行时,程序向我报告的错误是:
不能对空值表达式调用方法。
位于C:\info\Script\change\u Gateway\u DNS.ps1:2:1
+$a、$b、$C、$d=$interface.DefaultIPGateway.Split(“.”)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+类别信息:无效操作:(:)[],RuntimeException``+FullyQualifiedErrorId:InvokeMethodUnull`但是,我正确输入了以太网卡的名称'Realtek Gaming GbE Family Controller',我也使用了'Ethernet'进行了测试,但两者都给出了相同的错误。感谢您已经给我的帮助。您需要确保在$\uu0.servicename-eq“您的界面名称”很完美它工作正常:)要使脚本工作,我必须在管理员模式下通过命令提示符并调用脚本?有没有办法只需双击脚本,它就会运行?如果您对答案感到满意,如果您将其标记为已接受,我将不胜感激。关于运行脚本,googeling“以管理员身份运行ps1脚本”返回了很多这样做的方法。您选择哪一个取决于您的需求。如果在此之后您仍然需要帮助,您应该在StackOverflow上为其创建一个新问题。