コマンド ( netsh ) か PowerShell で IPアドレス や DNSサーバーの設定を変更したり、 固定IPとDHCPを切り替えたい

投稿者: | 2020年4月26日

結論だけ読ませろという人のため

はい、どうぞ。と思ったけど、結局、普通に書きました。まったくコメントつけないとトラブルになりそうですし…。自分向け備忘録も兼ねて。詳細を最後まで読むのが面倒くさい、ヘルプ引くからいいよという人向け。

IPアドレスを設定する ( netsh コマンド または PowerShell の New-NetIPAddress )


(DOS コマンド 例)
netsh interface ipv4 set address name=”イーサネット” static 172.16.2.3 255.255.255.0 172.16.2.254
 または
netsh interface ipv4 set address name=4 static 172.16.2.3 255.255.255.0 172.16.2.254

最近、メモ帳のデフォがUTF-8になりました。おかげで、そのまま書き込みするとバッチファイルの2バイト文字がトラブルになります。SHIFT-JISで保存するか、2バイト文字を使わない方法(上記2番め)を推奨します。ついでにいうと、「イーサネット 2」などスペースが入るケースにも注意して下さい。
なお、name=4 は idx=4 とか Index=4 とかがあるべき姿ではないかと思いますが、name=4 (のようなname=の書き方)でないと通りません。


(Powershell 例)
New-NetIPAddress -InterfaceIndex 4 -AddressFamily ipv4 -IPAddress 172.16.2.3 -PrefixLength 24 -DefaultGateway 172.16.2.254

そのまえに name= とか -InterfaceIndex を調べる

これはPowershellが簡単です。パイプで渡すとか、powershellを連結する方法を見つけることができると思いますが、「イーサネット」のあとの 2 や 3 がどんどん大きくなったり、index の数値が変わることがあるので基本的にはちゃんと調べて下さい。
自分が以前やったときには IP アドレスを出して、find と IF の比較を組み合わせて、該当するほうにだけ設定をするようなバッチを組んだことはあります。


(Powershell)
powershell Get-NetAdapter

DHCP でIPを取る設定に変える


(DOS コマンド 例)
netsh interface ipv4 set address name=4 dhcp


(Powershell 例)
Set-NetIPInterface -AddressFamily IPv4 -InterfaceIndex 4 -Dhcp Enabled

デフォルトゲートウェイをクリアする


(DOS コマンド 例)
netsh interface ipv4 set address name=4 static 172.16.2.3 255.255.255.0 172.16.2.254

デフォルトゲートウェイを書かないだけ。書けば入る、書かなければ入りません。


(Powershell 例)
Remove-NetRoute -InterfaceIndex 4 -DestinationPrefix 0.0.0.0/0 -Confirm:$false

DNSサーバーの設定をする


(DOS コマンド 例)
netsh interface ipv4 set dns name=4 static addr=172.16.1.1 validate=no
netsh interface ipv4 add dns name=4 addr=172.16.1.2 validate=no

netsh は複数同時設定ができません。必要に応じて、set のあと、 add してください。
(set と add の違いにも注意) validate=no をつけておくと確認が省かれて速いです。


(Powershell 例)
Set-DnsClientServerAddress -InterfaceIndex 4 -ServerAddresses 172.16.1.1,172.16.1.2

カンマで区切れば複数を一発でいけます。

DNSサーバーの設定をクリアする

Windowsの優先DNS側を削除すると代替DNSに入っていた値が優先DNSに移動します。


(DOS コマンド 例)
netsh interface ipv4 delete dnsservers name=4 addr=172.16.1.2
 全部、一発で消したい場合
netsh interface ipv4 delete dnsservers name=4 all


(Powershell 例)
Set-DnsClientServerAddress -InterfaceIndex 4 -ResetServerAddresses -confirm:$false

少し細かい解説

特にNICが複数ある場合は指定が必要です。パイプを使う等できますが、やはり「どれ」というのがわかっていないとやりづらいです。

Get-NetAdapter の場合は、 ifIndex の値を見ます。


PS D:\Get-NetAdapter

Name InterfaceDescription ifIndex Status MacAddress LinkSpeed
—- ——————– ——- —— ———- ———
イーサネット Intel(R) I211 Gigabit Network Connec… 4 Up 80-EE-73-E3-5B-47 100 Mbps
イーサネット 2 Intel(R) I211 Gigabit Network Conn…#2 3 Up 80-EE-73-E3-5B-48 1 Gbps

または、Get-NetConnectionProfile ( このコマンドは、NetworkCategory を Private にしたい時に使うことが多いです ) でも表示できます。


PS D:\> Get-NetConnectionProfile

Name : 識別されていないネットワーク
InterfaceAlias : イーサネット
InterfaceIndex : 4
NetworkCategory : Public
IPv4Connectivity : NoTraffic
IPv6Connectivity : NoTraffic

Name : 識別されていないネットワーク
InterfaceAlias : イーサネット 2
InterfaceIndex : 3
NetworkCategory : Public
IPv4Connectivity : NoTraffic
IPv6Connectivity : NoTraffic

こちらでは InterfaceIndex で見ます。

なお、このPublicをPrivateに変えたいなら、

Set-NetConnectionProfile -InterfaceIndex 3 -NetworkCategory Private と打てば、「イーサネット 2」のほう(InterfaceIndex 3 のほうがプライベートになります。

Get-NetConnectionProfile | Set-NetConnectionProfile -NetworkCategory Private なら、両方一変に Private にできます。

あちこちで「イーサネット」との指定をするような書き方をしていますが、 netsh は「そろそろなくなるよ詐欺」で残っているだけですし、メモ帳のデフォルトが変わったことでSHIFT-JISを意識しないとDOSバッチ作成にメモ帳を使えなくなっていることなど、色々注意が必要です。

その他

これ以上、特に解説することもないのですが、リモートで作業をしている場合、二度と繋げなくなってしまうリスクは考えて作業をして下さい。

当然ですが、上記はサンプルとして、172.16.2.3 のIPを2つ目のインタフェイスに振りたい、DHCPに変えたい、これのDNSとして 172.16.1.1 と 172.16.1.2 があることを仮定した設定になっています。
やりたいことに合わせてこれらのIPアドレスは変更してください。言われなくてもわかるでしょうし、わからなかったらここ見てもわからないですね。

要注意個所は、name= と InterfaceIndex の値です。これが 3とか4とは限りません。