我的网络上有一个 VM,我有时会使用它作为网关,而大多数时候我只是将 PC 配置为使用 DHCP,然后让所有内容都通过路由器。我一直在手动切换连接属性表单,但我决定尝试制作 PowerShell 脚本来简化该过程。
我还在通过虚拟机路由时禁用 IPv6,但在使用 DHCP 时重新启用它。要切换到使用虚拟机作为网关,我使用以下命令:
# Get the adapter to change
$wmi = Get-WmiObject win32_networkadapterconfiguration -filter "ipenabled ='true'";
# Get current IPv4 address of host
$ip = $wmi.IpAddress[0];
# Configure adapter to use 192.168.1.135 as the default gateway
$wmi.EnableStatic($ip, "255.255.255.0");
$wmi.SetGateways("192.168.1.135", 1);
$wmi.SetDNSServerSearchOrder("192.168.1.135");
# Disable IPv6
Get-NetAdapterBinding | Where-Object {$_.ComponentID.Equals("ms_tcpip6")} | ForEach-Object {
Disable-NetAdapterBinding -InterfaceAlias $_.Name -ComponentID ms_tcpip6
}
这与我手动配置时完全一样。我的正常网络连接在网络和共享中心中更改为“NetworkName 2”。要切换回 DHCP,我运行此脚本:
# Get the adapter to change
$wmi = Get-WmiObject win32_networkadapterconfiguration -filter "ipenabled ='true'";
# Configure adapter to use DHCP and automatic DNS
$wmi.EnableDHCP();
$wmi.SetDNSServerSearchOrder();
# Enable IPv6
Get-NetAdapterBinding | Where-Object {$_.ComponentID.Equals("ms_tcpip6")} | ForEach-Object {
Enable-NetAdapterBinding -InterfaceAlias $_.Name -ComponentID ms_tcpip6
}
之后,我通过 WiFi 连接到我的网络,一个称为“网络名称”的专用网络和一个名为“网络名称 3”的公共网络。两者都启用了 IPv6 和 DHCP。
我的 DHCP 脚本有什么问题导致此问题?当我通过对话框切换回 DHCP 时,这种情况没有发生。
更新:切换回 DHCP 后运行 ipconfig 时我注意到了这一点:
Wireless LAN adapter Wi-Fi:
Connection-specific DNS Suffix . :
IPv6 Address. . . . . . . . . . . : 2001:48f8:1042:732:889c:d2c1:37c9:804e
Temporary IPv6 Address. . . . . . : 2001:48f8:1042:732:a085:fec9:46b9:3d8
Link-local IPv6 Address . . . . . : fe80::889c:d2c1:37c9:804e%4
IPv4 Address. . . . . . . . . . . : 192.168.1.141
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : fe80::4af8:b3ff:fe80:6530%4
192.168.1.135
192.168.1.1
它仍使用 192.168.1.135 作为网关,以及我的普通路由器 - 192.168.1.1。
答案1
已评论这里. 在将要更改的适配器存储在 $wmi 中后,您无法使用此命令删除网关
Remove-NetRoute -InterfaceIndex $wmi.InterfaceIndex -NextHop 192.168.1.135
或者,您可以使用 netsh,如同一篇文章所示:
Invoke-Expression ("netsh interface ipv4 set address index=""{0}"" source=dhcp" -f $wmi.InterfaceIndex)
Netsh 的行为与 GUI 相同。