2019.06.14何度も書いているが、先日自宅PCのHDDが壊れてSSDに換装したついでにWindows10をクリーンインストールしたのだが、PC環境を刷新したいくつか問題が起きている。起きた問題とその応急処置的対処法について書く。現象は次のようなモノだ。仮想環境のOS(Linux)が固定IPを使えるようにする対処法タスクスケジューラーでps1を実行する問題の現象Windows10を新規インストール後、Hyper-Vを有効にして仮想環境にUbuntuとCentOSをインストールした。デフォルト設定のインストールではネットワーク設定はDHCPになっている。DHCP設定のままならLinux(Ubuntu,CentOS)はインターネットに繋がる。各Linuxのネットワーク設定を固定IPにしたところインターネットに繋がらなくなった。当初はLinux側の設定が悪いのだろうと思い色々調べたが間違いが見当たらない。Switch)のIPアドレスが起動する度変わってしまう。Linuxから固定IPを設定するにはゲートウェイのIPを指定する必要があり、まずゲートウェイのIPを固定する必要がある。以前HDDで使用していたWindows10ではゲートウェイのIPを固定IPにすることができていたはずだが、SSDに再インストールした最新Windows10はできなくなっている。誤解の無いように言っておくが、ここで言うゲートウェイのIPアドレスというのは、物理ネットワークのゲートウェイではなく、Hyper-Vの中に形成される仮想ネットワークのゲートウェイである。Hyper-V上で稼働する全てのOSはそれぞれが独自の仮想NICを持つ。Switch)が繋がれている。Switch)に繋がることで、間接的に物理NICに接続し、インターネット(物理ネットワーク)に接続することができる。不自然だが、既定仮想スイッチにはイーサーネットアダプターとしてIPアドレスが付けられており、仮想OSはこの既定仮想スイッチのIPアドレスをゲートウェイとして指定することにより、外部の物理ネットワークに接続出来た。以前は、既定仮想スイッチまわりの仕様が、現在と違っており、仮想環境のOSはゲートウェイに物理ネットワークのゲートウェイのIPアドレスを指定することができていた。最新のWindows10では、物理ゲートウェイを参照することができず、仮想ゲートウェイである既定仮想スイッチを指定しなければならない。一つの違いが、以前は既定仮想スイッチのIPアドレスは固定IPにすることができたが、最新ではできなくなっている点である。仮想ゲートウェイである既定仮想スイッチのIPアドレスが再起動ごとに変わる可変IPになってしまったため、仮想OS側のIPを固定IPにできなくなってしまったのだ。(DHCPにすると繋がる)ネットの情報ネットの情報を調べてみると、同じ問題に遭遇している人が居る。Build1809のHyper-Vで、規定のスイッチのネットワークアドレスが変わってしまう【Ver1809】https://answers.microsoft.com/ja-jp/windows/forum/all/windows10-build1809%E3%81%AEhyper/03e2b34c-b2df-4cf6-81a6-51ff6ebbce3e質問のようだが、返事は返ってきていないようだ。サブネットが起動ごとに変わる件https://yamanxworld.blogspot.com/2018/12/windows-10-ver-1809-default-switch-nat.htmlこの人は、非常に詳しく調べている。Switch).というイベントが発生している。Switch)を削除して再作成しているのだ。Switch)に固定IPなど付番できるわけけがない。先のブログ記事を読む限り、どうも1809アップデートから既定仮想スイッチの仕様が変わったらしい。仕様が変わったと言うよりも、構造が変わったようだ。?最新版をアップデートしていたつもりだが。先のブログ記事に「新仕様なのかバグなのかは不明。」とあるが、これは「仕様」だろう。明らかに「構造的問題」だ。Switch)を起動する度、削除して再作成しているので、固定IPアドレスを付番するのは構造的に無理だと思う。Switch)に同じIPアドレスを付番してやることは可能なようだ。そもそも既定仮想スイッチはその名の通り「スイッチ」であり「ルーター」ではない。※(ハブとスイッチの機能の違いhttps://www.itbook.info/study/p50.html)既定仮想スイッチにIPアドレスが付番できることが既に不自然な現象だ。目の前で「既定仮想スイッチにIPアドレスが付番され、それをゲートウェイにしてDHCP設定でインターネットにアクセスできる」という非日常な現象が起こっている。この仮想世界ではきっと魔法が使えるのだろう。!と考え、調べてみた。参考にしたのは以下の記事だ。IPの固定化ADなど一部のサービスではDHCPではなくIPを固定化して利用することが推奨されています。なくてもサーバとして運用する場合はIPを固定化して運用するのが普通です。この章ではそのためのコマンドレットを記載します。【自分用メモ】PowerShellによるIPアドレスの設定及び変更https://qiita.com/hanakara_milk/items/1197ac9b91fa1fa3abab「PowerShellでIPアドレスを設定する場合は、まず、Remove-NetIPAddressしてからNew-NetIPAddressするという手順を踏む。........」New-NetIPAddresshttps://docs.microsoft.com/en-us/powershell/module/nettcpip/new-netipaddress?view=win10-ps「新NetIPAddressのコマンドレットは作成してIPアドレスを設定します。特定のIPアドレスオブジェクトを作成するには、IPv4アドレスまたはIPv6アドレスのいずれかと、インターフェイスインデックスまたはインターフェイスエイリアスを指定します。サブネットマスクとも呼ばれるプレフィックス長とデフォルトゲートウェイを定義することをお勧めします。このコマンドレットを実行して、DHCPが既に有効になっているインターフェイスにIPアドレスを追加すると、DHCPは自動的に無効になります。インターフェイスで重複アドレス検出(DAD)が有効になっている場合、新しいIPアドレスはDADが正常に終了するまで使用できず、リンク上のIPアドレスの一意性が確認されます。コマンドでIPアドレスを指定すると、DHCPは自動的に無効になるらしい。コマンドでネットワークアダプタの情報が得られる。コマンドでIPアドレスを作成するには「特定のIPアドレスオブジェクトを作成するには、IPv4アドレスまたはIPv6アドレスのいずれかと、インターフェイスインデックスまたはインターフェイスエイリアスを指定します。結果に表示されているので、これを使用してみる。私のネットワーク環境は物理ゲートウェイが「192.168.0.1」なので、「192.168.0.2」を仮想ゲートウェイに割り当てる。サブネットマスクは「255.255.255.0/24」なので、「24」を指定する。Switch)のインターフェイスインデックスが「30」と表示されている。.:仮想スイッチにIPアドレスが、「172.17.XXX.XXX」と「192.168.0.2」の2つ付いている。!(サブネットマスクが物理側と仮想側で異なるので、2つのIPアドレスが付くらしい。起動して固定IP設定でゲートウェイに「192.168.0.2」を指定してインターネットに接続してみたところ、見事に繋がった。Windows10を再起動すると、IPアドレス「192.168.0.2」は消滅していた。仮想スイッチ自体を起動する度に削除して再作成しているのだから、当然だ。インターフェイスインデックスを確認すると以前と違う値が割り当てられていた。Switch)にIPアドレス「192.168.0.2」を割り当てなければならないことになる。デスクトップにコマンドラインのメモを配置し、起動する度に管理者権限でPowerShellから実行するだけだから、大した手間ではないが、なんとか自動化したい。??これを一々実行するのはプログラマーとしてはかっこ悪い。とり会えず、自動化の方法を調べたところ以下のようなスクリプトを組めば良いと分かった。“$ifi”後は、起動する度にスタートアップでこの「InitIPDefaultSwitch.ps1」を実行すれば良いはずだ。デフォルトでは、デジタル署名のないps1スクリプトの実行を禁じているので、以下のコマンドでPC内部で作成されたps1ファイルの実行だけ許可する設定に変更する。現在のセキュリティを確認するGet-ExecutionPolicy「AllSigned」なら署名のないスクリプトは実行できない。管理者権限のPowerShellコマンドプロンプトで以下のコマンドを実行する。RemoteSigned再び現在のセキュリティを確認するGet-ExecutionPolicy「RemoteSigned」が表示されれば成功。この辺の解説はこちらを見てください。Switch)のIPアドレスを毎回固定IPに自動で変更できるようになる。タスクスケジューラーという標準ツールがある。このツールは好きなプログラムを好きなタイミングで自動起動・終了させることができる。バッチ処理の起動に使用される。このタスクスケジューラで、先ほどの「InitIPDefaultSwitch.ps1」をOS起動時に呼び出してやる。タスクスケジューラの使い方は色々コツが必要で、一筋縄では行かない。それをここで懇切丁寧に書くことはできない。記事が長くなりすぎる。タスクスケジューラの使い方については、別の解説サイトがあるのでそちらを見て欲しい。ここでは簡単に設定方法だけ、記述する。スクリプトファイルの配置(1)「C:MySetting」というフォルダーを作る。(2)そこに「InitIPDefaultSwitch.ps1」ファイルを置く。配下に「InitIPDefaultSwitch.ps1」ファイルを置いても動きません。ユーザープロファイルの外にps1ファイルを置いてください。S」を押して、タスクスケジューラーと入力して起動する。(2)タスクスケジューラーの画面右側の「基本タスクの作成」を押し「基本タスクの作成」画面を開く。(3)基本タスクの「名前」には「既定仮想スイッチの固定IP設定」と書く「説明」は好きにして。(4)トリガーは「コンピュータの起動時」を選ぶ。(5)操作は「プログラムの開始」を選ぶ。