50ジジィーのパソコン・スマホ備忘録

パソコン・スマホ関連の備忘録

IPアドレスを変更するスクリプト(追記あり)

 

f:id:STL6812:20170704143123j:plain

こんにちは、50ジジィ―です。

先日顧客より「出張先でノートPCを使用するときに社内用固定IPからDHCPに変更するのがいちいちめんどい...なんとかならないか」と言われ「なんとかします」と答えてしまったので、調査「ググる」を始めました。

ググると結構似たような状況に追い込まれた人はいるものでwいろいろなサイトを参考にさせていただきました。

VBスクリプトでやるのが一番いいと解決したのですが、VBスクリプトで作成する上での問題が下記になります。

 

・「管理者権限」がないとIPアドレスってものは変更できない。

・パソコンによって「ネットワークインターフェイス名」が違う。

 

いろいろサイトを巡っていい所取りしたのが下記の記述になりました。

xxx.vbsという拡張子にしてデスクトップなどに保存してダブクリするだけです。右クリ

してIP設定(IP,Subnet,GW,DNS1,DNS2)を編集しないといけませんが...

 

 

IPアドレスDHCP取得に変更するスクリプト

→IPとDNS両方をDHCPに変更します

'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アドレスを固定にするスクリプト

→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だけDHCPに変更するスクリプト

'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のみ固定にするスクリプト

→右クリで編集を選択して、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アドレスを固定にするスクリプト>・・・修正完了

'IPアドレスを固定にするスクリプト 2017.06.19 高橋
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 NewIP, NewMsk, NewGWY, DnsSv1, DnsSv2

Dim objShell, iName, i, WSHShell, networks, Item

'IPアドレス

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 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"

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にしてダブクリすれば動きます。

今度こそおしまい