IPアドレスを変更するスクリプト(追記あり)
こんにちは、50ジジィ―です。
先日顧客より「出張先でノートPCを使用するときに社内用固定IPからDHCPに変更するのがいちいちめんどい...なんとかならないか」と言われ「なんとかします」と答えてしまったので、調査「ググる」を始めました。
ググると結構似たような状況に追い込まれた人はいるものでwいろいろなサイトを参考にさせていただきました。
VBスクリプトでやるのが一番いいと解決したのですが、VBスクリプトで作成する上での問題が下記になります。
・「管理者権限」がないとIPアドレスってものは変更できない。
・パソコンによって「ネットワークインターフェイス名」が違う。
いろいろサイトを巡っていい所取りしたのが下記の記述になりました。
xxx.vbsという拡張子にしてデスクトップなどに保存してダブクリするだけです。右クリ
してIP設定(IP,Subnet,GW,DNS1,DNS2)を編集しないといけませんが...
'IPアドレスをDHCPにするスクリプト
Option Explicit
Dim WMI, OS, Value, Shell
do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7
'##### WScript5.7 または Vista 以上かをチェック
Set WMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set OS = WMI.ExecQuery("SELECT *FROM Win32_OperatingSystem")
For Each Value in OS
if left(Value.Version, 3) < 6.0 then exit do
Next
'##### 管理者権限で実行
Set Shell = CreateObject("Shell.Application")
Shell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ uac", "", "runas"
WScript.Quit
loop
Dim objShell,iName,i,WSHShell,networks,Item
Set objShell = CreateObject("Shell.Application")
'ネットワークカード情報取得
Set networks = objShell.Namespace(&H31&)'NETWORK_CONNECTIONS
'NIC選択ダイアログに表示する As String
iName = ""
'ネットワークカード名の配列
Dim iNameAry()
ReDim iNameAry(networks.Items.Count)
i=0
For Each Item in networks.Items
'ネットワークアダプタ名を取得
iName = iName & vbCrLf & i & ": """ & Item.Name & """"
iNameAry(i) = """" & Item.Name & """"
i=i+1
Next
'NICが複数あれば選択させる
If networks.Items.Count > 1 Then
Dim nicSelect
nicSelect = InputBox("設定するネットワークカードの数字を入力してOK押下選んでください。(0~" & networks.Items.Count-1 & "の値)" & vbCrLf & iName,"入力ダイアログ","0")
If IsEmpty(nicSelect ) Then
MsgBox "キャンセルしました。"
WScript.Quit
End If
If Not IsNumeric(nicSelect) Then
MsgBox "設定した値に誤りがあります。もう一度実行し直してください。"
WScript.Quit
ElseIf CDbl(nicSelect) > (networks.Items.Count-1) Or nicSelect*1000 Mod 1000 <> 0 Or CDbl(nicSelect) < 0 Then
MsgBox "設定した値に誤りがあります。もう一度実行し直してください。"
WScript.Quit
Else
End If
End If
Set WSHShell = WScript.CreateObject("WScript.Shell")
'netshコマンドを使ってDHCPに設定
WSHShell.Run "cmd.exe /c netsh interface ip set address """ & iNameAry(nicSelect) &""" dhcp"
WSHShell.Run "cmd.exe /c netsh interface ip set dns """ & iNameAry(nicSelect) &""" dhcp"
MsgBox "IPアドレスの設定が終了しました。"
これで社外でネットが使用できるようになりますが、会社に戻ったとき、IPアドレスをまた固定に戻さなくちゃならなくなります。
→IP,Subnet,GW,DNS1,DNS2すべてを固定に変更
'IPアドレスを固定にするスクリプト
Option Explicit
Dim WMI, OS, Value, Shell
do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7
'##### WScript5.7 または Vista 以上かをチェック
Set WMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set OS = WMI.ExecQuery("SELECT *FROM Win32_OperatingSystem")
For Each Value in OS
if left(Value.Version, 3) < 6.0 then exit do
Next
'##### 管理者権限で実行
Set Shell = CreateObject("Shell.Application")
Shell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ uac", "", "runas"
WScript.Quit
loop
Dim New_IP, SubNet_Mask , D_Gateway ,DnsSv1 , DnsSv2
Dim objShell,iName,i,WSHShell,networks,Item
'IPアドレス(編集してください)
New_IP = "192.168.1.100"
'サブネットマスク(編集してください)
SubNet_Mask = " 255.255.255.0"
'デフォルトゲートウェイ(編集してください)
D_Gateway = "192.168.1.1"
'プライマリDNSサーバ(編集してください)
DnsSv1 = "192.168.1.1"
'セカンダリDNSサーバ(編集してください)
DnsSv2 = "192.168.1.2"
Set objShell = CreateObject("Shell.Application")
'ネットワークカード情報取得
Set networks = objShell.Namespace(&H31&)'NETWORK_CONNECTIONS
'NIC選択ダイアログに表示する As String
iName = ""
'ネットワークカード名の配列
Dim iNameAry()
ReDim iNameAry(networks.Items.Count)
i=0
For Each Item in networks.Items
'ネットワークアダプタ名を取得
iName = iName & vbCrLf & i & ": """ & Item.Name & """"
iNameAry(i) = """" & Item.Name & """"
i=i+1
Next
'NICが複数あれば選択させる
If networks.Items.Count > 1 Then
Dim nicSelect
nicSelect = InputBox("設定するネットワークカードの数字を入力してOK押下選んでください。(0~" & networks.Items.Count-1 & "の値)" & vbCrLf & iName,"入力ダイアログ","0")
If IsEmpty(nicSelect ) Then
MsgBox "キャンセルしました。"
WScript.Quit
End If
If Not IsNumeric(nicSelect) Then
MsgBox "設定した値に誤りがあります。もう一度実行し直してください。"
WScript.Quit
ElseIf CDbl(nicSelect) > (networks.Items.Count-1) Or nicSelect*1000 Mod 1000 <> 0 Or CDbl(nicSelect) < 0 Then
MsgBox "設定した値に誤りがあります。もう一度実行し直してください。"
WScript.Quit
Else
End If
End If
Set WSHShell = WScript.CreateObject("WScript.Shell")
'netshコマンドを使って設定
'WSHShell.Run "cmd.exe /c netsh interface ip set address " & iNameAry(nicSelect) & " static " & New_IP & " " & SubNet_Mask & " " & D_Gateway & " none", 0, True
WSHShell.Run "cmd.exe /c netsh interface ip set address """ & iNameAry(nicSelect) & """ static " & New_IP & " " & SubNet_Mask & " " & D_Gateway, 0, True
WSHShell.Run "cmd.exe /c netsh interface ip set dns " & iNameAry(nicSelect) & " static " & DnsSv1 , 0, True
WSHShell.Run "cmd.exe /c netsh interface ip add dns " & iNameAry(nicSelect) & " addr=" & DnsSv2 ,0, True
MsgBox "IPアドレスの設定が終了しました。"
上記2つのスクリプトをデスクトップに置いておけば容易にIP設定を変更できるはずです。ダブクリ→管理者権限確認→ネットワーク名を選択(数字)→IP設定変更のような流れになります。有線か無線かなどいま使用しているネットワークの種類などは覚えておのが前提ですが。
特殊なネットワークの場合
会社によってはDNSだけ固定になっているという場合もあると思います。固定のまま出張先で使用して「あれ?ネット見れんぞ...」ってなるケースもあります。
'DNSアドレスを社外用自動取得に戻すスクリプト
Option Explicit
Dim WMI, OS, Value, Shell
do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7
'##### WScript5.7 または Vista 以上かをチェック
Set WMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set OS = WMI.ExecQuery("SELECT *FROM Win32_OperatingSystem")
For Each Value in OS
if left(Value.Version, 3) < 6.0 then exit do
Next
'##### 管理者権限で実行
Set Shell = CreateObject("Shell.Application")
Shell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ uac", "", "runas"
WScript.Quit
loop
Dim objShell,iName,i,WSHShell,networks,Item
Set objShell = CreateObject("Shell.Application")
'ネットワークカード情報取得
Set networks = objShell.Namespace(&H31&)'NETWORK_CONNECTIONS
'NIC選択ダイアログに表示する As String
iName = ""
'ネットワークカード名の配列
Dim iNameAry()
ReDim iNameAry(networks.Items.Count)
i=0
For Each Item in networks.Items
'ネットワークアダプタ名を取得
iName = iName & vbCrLf & i & ": """ & Item.Name & """"
iNameAry(i) = """" & Item.Name & """"
i=i+1
Next
'NICが複数あれば選択させる
If networks.Items.Count > 1 Then
Dim nicSelect
nicSelect = InputBox("設定するネットワークカードの数字を入力してOK押下選んでください。(0~" & networks.Items.Count-1 & "の値)" & vbCrLf & iName,"入力ダイアログ","0")
If IsEmpty(nicSelect ) Then
MsgBox "キャンセルしました。"
WScript.Quit
End If
If Not IsNumeric(nicSelect) Then
MsgBox "設定した値に誤りがあります。もう一度実行し直してください。"
WScript.Quit
ElseIf CDbl(nicSelect) > (networks.Items.Count-1) Or nicSelect*1000 Mod 1000 <> 0 Or CDbl(nicSelect) < 0 Then
MsgBox "設定した値に誤りがあります。もう一度実行し直してください。"
WScript.Quit
Else
End If
End If
Set WSHShell = WScript.CreateObject("WScript.Shell")
'netshコマンドを使ってDNSを自動取得に設定
WSHShell.Run "cmd.exe /c netsh interface ip set dns " & iNameAry(nicSelect) & " dhcp "
MsgBox "IPアドレスの設定が終了しました。"
→右クリで編集を選択して、DNSの固定値を編集してください。上書き保存でOK
'DNSアドレスを社内用固定にするスクリプト
Option Explicit
Dim WMI, OS, Value, Shell
do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7
'##### WScript5.7 または Vista 以上かをチェック
Set WMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set OS = WMI.ExecQuery("SELECT *FROM Win32_OperatingSystem")
For Each Value in OS
if left(Value.Version, 3) < 6.0 then exit do
Next
'##### 管理者権限で実行
Set Shell = CreateObject("Shell.Application")
Shell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ uac", "", "runas"
WScript.Quit
loop
Dim DnsSv1 , DnsSv2
Dim objShell,iName,i,WSHShell,networks,Item
'プライマリDNSサーバ(ここを編集してください)
DnsSv1 = "192.168.1.254"
'セカンダリDNSサーバ(ここを編集してください)
DnsSv2 = "192.168.0.150"
Set objShell = CreateObject("Shell.Application")
'ネットワークカード情報取得
Set networks = objShell.Namespace(&H31&)'NETWORK_CONNECTIONS
'NIC選択ダイアログに表示する As String
iName = ""
'ネットワークカード名の配列
Dim iNameAry()
ReDim iNameAry(networks.Items.Count)
i=0
For Each Item in networks.Items
'ネットワークアダプタ名を取得
iName = iName & vbCrLf & i & ": """ & Item.Name & """"
iNameAry(i) = """" & Item.Name & """"
i=i+1
Next
'NICが複数あれば選択させる
If networks.Items.Count > 1 Then
Dim nicSelect
nicSelect = InputBox("設定するネットワークカードの数字を入力してOK押下選んでください。(0~" & networks.Items.Count-1 & "の値)" & vbCrLf & iName,"入力ダイアログ","0")
If IsEmpty(nicSelect ) Then
MsgBox "キャンセルしました。"
WScript.Quit
End If
If Not IsNumeric(nicSelect) Then
MsgBox "設定した値に誤りがあります。もう一度実行し直してください。"
WScript.Quit
ElseIf CDbl(nicSelect) > (networks.Items.Count-1) Or nicSelect*1000 Mod 1000 <> 0 Or CDbl(nicSelect) < 0 Then
MsgBox "設定した値に誤りがあります。もう一度実行し直してください。"
WScript.Quit
Else
End If
End If
Set WSHShell = WScript.CreateObject("WScript.Shell")
'netshコマンドを使って設定
WSHShell.Run "cmd.exe /c netsh interface ip set dns " & iNameAry(nicSelect) & " static " & DnsSv1 , 0, True
WSHShell.Run "cmd.exe /c netsh interface ip add dns " & iNameAry(nicSelect) & " addr=" & DnsSv2 ,0, True
MsgBox "IPアドレスの設定が終了しました。"
ちなみにVBスクリプトを編集するときは改行の「_」マークは使用できませんので、1行を長くてもそのまま1行で書かなければなりません。ご注意を( ´∀` )
<参考にさせていただいたサイト>
Server World (VBスクリプトのユーザアカウント制御UAC)
編集内容を間違えてもスクリプトエラーだと実行できないし、IP設定を間違えても「ネットワークと共有センタ―」→「インターフェイス名」→「プロパティ」から手動で変更できますのでシステムがおかしくなるってことはないと思います。
おしまい
<追記>
この間久々に触ってみたらWindows10では動いたのですが、Windows7ではエラーはでないんですが、正常に動きませんでした。WindowsUpdateとかで仕様が変わったんですかね、、、、前はWindows7でも動いていたんですが。なんか変数に"_"を使用してたのが原因だったのか変数宣言で仕様が変わったのか、とりあえず動くようになりました。
'IPアドレスを固定にするスクリプト 2017.06.19 高橋
Option ExplicitDim WMI, OS, Value, Shell
do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7
'##### WScript5.7 または Vista 以上かをチェック
Set WMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set OS = WMI.ExecQuery("SELECT *FROM Win32_OperatingSystem")
For Each Value in OS
if left(Value.Version, 3) < 6.0 then exit do
Next'##### 管理者権限で実行
Set Shell = CreateObject("Shell.Application")
Shell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ uac", "", "runas"WScript.Quit
loopDim NewIP, NewMsk, NewGWY, DnsSv1, DnsSv2
Dim objShell, iName, i, WSHShell, networks, Item
NewIP = "192.168.100.62"
NewMsk = "255.255.255.0"
NewGWY = "192.168.100.1"
'プライマリDNSサーバ
DnsSv1 = "192.168.100.1"
'セカンダリDNSサーバ
DnsSv2 = "192.168.100.2"
Set objShell = CreateObject("Shell.Application")
'ネットワークカード情報取得
Set networks = objShell.Namespace(&H31&)'NETWORK_CONNECTIONS
'NIC選択ダイアログに表示する As String
iName = ""
'ネットワークカード名の配列
Dim iNameAry()
ReDim iNameAry(networks.Items.Count)
i=0
For Each Item in networks.Items
'ネットワークアダプタ名を取得
iName = iName & vbCrLf & i & ": """ & Item.Name & """"
iNameAry(i) = """" & Item.Name & """"
i=i+1
Next
'NICが複数あれば選択させる
If networks.Items.Count > 1 Then
Dim nicSelect
nicSelect = InputBox("設定するネットワークカードの数字を入力してOK押下選んでください。(0~" & networks.Items.Count-1 & "の値)" & vbCrLf & iName,"入力ダイアログ","0")
If IsEmpty(nicSelect ) Then
MsgBox "キャンセルしました。"
WScript.Quit
End If
If Not IsNumeric(nicSelect) Then
MsgBox "設定した値に誤りがあります。もう一度実行し直してください。"
WScript.Quit
ElseIf CDbl(nicSelect) > (networks.Items.Count-1) Or nicSelect*1000 Mod 1000 <> 0 Or CDbl(nicSelect) < 0 Then
MsgBox "設定した値に誤りがあります。もう一度実行し直してください。"
WScript.Quit
Else
End If
End If
Set WSHShell = WScript.CreateObject("WScript.Shell")
'netshコマンドを使って設定
WSHShell.Run "cmd.exe /c netsh interface ip set address " & iNameAry(nicSelect) & " static " & NewIP & " " & NewMsk & " " & NewGWY
' & " none", 0, True'WSHShell.Run "cmd.exe /c netsh interface ip set address """ & iNameAry(nicSelect) & """ static " & NewIP & " " & SubNet_Mask & " " & D_Gateway
WSHShell.Run "cmd.exe /c netsh interface ip set dns " & iNameAry(nicSelect) & " static " & DnsSv1 , 0, True
WSHShell.Run "cmd.exe /c netsh interface ip add dns " & iNameAry(nicSelect) & " addr=" & DnsSv2 ,0, True
MsgBox "IPアドレスの設定が終了しました。"
<IPアドレスをDHCP(自動取得)に戻すスクリプト>・・・修正完了
'IPアドレスを固定にするスクリプト 2017.06.19スズキ通商 高橋
Option ExplicitDim WMI, OS, Value, Shell
do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7
'##### WScript5.7 または Vista 以上かをチェック
Set WMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set OS = WMI.ExecQuery("SELECT *FROM Win32_OperatingSystem")
For Each Value in OS
if left(Value.Version, 3) < 6.0 then exit do
Next'##### 管理者権限で実行
Set Shell = CreateObject("Shell.Application")
Shell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ uac", "", "runas"WScript.Quit
loopDim objShell, iName, i, WSHShell, networks, Item
Set objShell = CreateObject("Shell.Application")
'ネットワークカード情報取得
Set networks = objShell.Namespace(&H31&)'NETWORK_CONNECTIONS
'NIC選択ダイアログに表示する As String
iName = ""
'ネットワークカード名の配列
Dim iNameAry()
ReDim iNameAry(networks.Items.Count)
i=0
For Each Item in networks.Items
'ネットワークアダプタ名を取得
iName = iName & vbCrLf & i & ": """ & Item.Name & """"
iNameAry(i) = """" & Item.Name & """"
i=i+1
Next
'NICが複数あれば選択させる
If networks.Items.Count > 1 Then
Dim nicSelect
nicSelect = InputBox("設定するネットワークカードの数字を入力してOK押下選んでください。(0~" & networks.Items.Count-1 & "の値)" & vbCrLf & iName,"入力ダイアログ","0")
If IsEmpty(nicSelect ) Then
MsgBox "キャンセルしました。"
WScript.Quit
End If
If Not IsNumeric(nicSelect) Then
MsgBox "設定した値に誤りがあります。もう一度実行し直してください。"
WScript.Quit
ElseIf CDbl(nicSelect) > (networks.Items.Count-1) Or nicSelect*1000 Mod 1000 <> 0 Or CDbl(nicSelect) < 0 Then
MsgBox "設定した値に誤りがあります。もう一度実行し直してください。"
WScript.Quit
Else
End If
End If
Set WSHShell = WScript.CreateObject("WScript.Shell")
'netshコマンドを使ってDHCPに設定
'WSHShell.Run "cmd.exe /c netsh interface ip set address """ & iNameAry(nicSelect) &""" dhcp"
'WSHShell.Run "cmd.exe /c netsh interface ip set dns """ & iNameAry(nicSelect) &""" dhcp"
WSHShell.Run "cmd.exe /c netsh interface ip set address " & iNameAry(nicSelect) & " dhcp"
WSHShell.Run "cmd.exe /c netsh interface ip set dns " & iNameAry(nicSelect) & " dhcp"
MsgBox "IPアドレスの設定が終了しました。"
ちなみにVBスクリプトは改行がないので全部1行ごとに書いてください。この修正したやつはWindows10でも動きました。.vbsにしてダブクリすれば動きます。
今度こそおしまい