どうもミツシマです。

今回はPowershellコマンドを使用してIPアドレスを設定する方法を検証してみました。
これまでコマンドでIPアドレスを設定する際には「netsh」コマンドで設定しておりましたが、
せっかくPowershellにも設定出来るコマンドがありそうなので試してみた!!

検証環境は以下の通り
PC:Windows10 1809 


早速、Powershellコマンドを調べていると「Set-NetIPAddress」・「New-NetIPAddress」・「Remove-NetIPAddress」辺りを使えばいけそうかなと試してみた。
が、ここで問題が。
Set-NetIPAddress」で行けるかな〜と思ったら、このコマンドだとDNSが設定出来なさそう。。。
ならば「New-NetIPAddress」と「Remove-NetIPAddress」を併用することを考えるが、これも上手くいかない。。。。
まず「New-NetIPAddress」で設定するためには、既存のIPアドレスを消去(Remove-NetIPAddress)しないといけないのだが、これが上手くいかない。。。
タイムアウトとかを間に入れるもほとんど消去出来ず。。。
その為か「New-NetIPAddress」や「Set-NetIPAddress」を使用しても意図した結果にならない。
GUIで確認すると値が入っていないのに、「ipconfig /all」だと2つIPアドレスが設定されていたりと意味分からん!!!
だが、今回は何とか「netsh」コマンドは使用したくないのでWMIからやってみることに!


WMIだと上手くいったので早速スクリプトを↓
#スクリプトのパス取得
$ScriptFullPath = $MyInvocation.MyCommand.Path
#CSVファイルのパス取得
$CSVPath = $PSScriptRoot + "¥IPAddressList.csv"

#「IPAddressList.csv」ファイルがあるかどうかをチェックし、なければエラー表示で終了
If(-Not(Test-Path $CSVPath)){
    Write-Host "「IPAddressList.csv」が同じフォルダにありません。処理を中断します。" -ForegroundColor Red
    Pause
    Exit
}


#管理者として実行しているかを確認し、管理者で実行されていなければ、管理者として再実行する
$WindowsPrincipal = [Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()
if (-Not($WindowsPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))){
    Write-Output "管理者として実行されていません。再度管理者で実行します。"
    Start-Process powershell.exe -ArgumentList "-ExecutionPolicy RemoteSigned -command $ScriptFullPath" -Verb runas
    Exit
}

$IPList = Import-Csv -Path $CSVPath -Encoding Default | Where-Object {$_.COMPUTERNAME -eq $Env:COMPUTERNAME}

#全ネットワークアダプタの情報取得
$WmiObj = Get-WmiObject Win32_NetworkAdapterConfiguration

$Subnet = "255.255.255.0" 
$i = 0
foreach($Wmi in $WmiObj){
    
    If($IPList.BeforeIPAddress -eq $Wmi.IPAddress){

        Write-Host ('[IP:' + $IPList.AfterIPAddress + ' DGW:' + $IPList.DefaultGateway + ' DNS:' + $List.DNSServer1 + '/' + $List.DNSServer2 + ']に設定変更します')
        #固定IPアドレス変更
        $Result1 = $Wmi.EnableStatic($IPList.AfterIPAddress,$Subnet)
        $Result2 = $Wmi.SetGateways($IPList.DefaultGateway)

        #DNS設定
        $DNSAdd = @($List.DNSServer1,$List.DNSServer2)
        $Result3 = $Wmi.SetDNSServerSearchOrder($DNSAdd)

        
        If(-Not($Result1.ReturnValue -eq 0)){
            Write-Host ('固定IPアドレス変更時にエラー発生・エラーコード:' + $Result1.ReturnValue)
        }

        If(-Not($Result2.ReturnValue -eq 0)){
            Write-Host ('デフォルトゲートウェイアドレス変更時にエラー発生・エラーコード:' + $Result2.ReturnValue)
        }

        If(-Not($Result3.ReturnValue -eq 0)){
            Write-Host ('DNSアドレス変更時にエラー発生・エラーコード:' + $Result3.ReturnValue)
        }

        $i++
    }

}

If($i -eq 0){
    Write-Host '[IPAddressList.csv]のリストにヒットしません。中身を確認下さい。'
}


スクリプト中で使用しているCSVファイル↓
COMPUTERNAME,BeforeIPAddress,AfterIPAddress,DefaultGateway,DNSServer1,DNSServer2
test,192.168.32.101,192.168.32.201,192.168.32.1,192.168.32.254,8.8.8.8


〜解説〜
今回は既に固定IPアドレスが設定されていて、それを変更することを想定してます。(DNSも含む)
なのでCSVファイルの中身は上記の様な感じ!
「COMPUTERNAME」と「BeforeIPAddress」の2つを使用し自分の端末であるかを確認。
その後、「AfterIPAddress」等の値をセットしていく感じ。

WMIのクラスは「Win32_NetworkAdapterConfiguration」を使用し、その中のメソッド?である
EnableStatic」・「SetGateways」・「SetDNSServerSearchOrder」を使用している。
唯一心残りなのが、デフォルトゲートウェイのメトリック値。
GUIで設定するとメトリック値が「自動」になるのだが、WMIだと必ず値を入れないといけないようなので今回はデフォルト値の「1」で妥協。
※でもクライアントであれば複雑なルーティングがないケースがほとんどなので、あまり気にしなくてもいいかなと個人的には考える次第です!!



それにしても純粋なPowershellコマンドが中途半端すぎるんだよな〜〜〜(´;ω;`)


スポンサードリンク