Windowsの不要なネットワークアダプタを削除するバッチ処理

投稿者: | 2021年1月28日

エンドポイントセキュリティ製品がインストール時に追加した仮想ネットワークアダプタが、時にルーティング障害を引き起こすことから、インストール後にワンクリックでそんな仮想ネットワークアダプタをまとめて削除するバッチ処理を考察してみました。

Prologue

ことの発端は、Fortinet社のエンドポイントセキュリティ製品、FortiClientをインストールする時にセットアップされる仮想ネットワークアダプタ、基本的に切断状態なので使われることはありませんが、Windows起動時に有線なり無線のメインのネットワークアダプタでIPアドレスの取得に手間取ると、この仮想インターフェイスがリンクローカルアドレスのまま、デフォルトルートになってしまうことがよくあります。そうなると当然ネットには繋がらず、そのまま待っていても切り替わることはまず有りません。

図1.Fortinet Virtual Adapters (Network Connection)

図1.Fortinet Virtual Adapters (Network Connection)

図2.Fortinet Virtual Adapters (Device Manager)

図2.Fortinet Virtual Adapters (Device Manager)

現在社内では、FortiClientをインストール後、こうした仮想ネットワークアダプタを手作業で全て無効にしているのですが、このネットワークアダプタのウィンドウに辿り着くまでのUI遷移は地味に面倒で、バッチ処理が望まれていました。

図3.Disable Fortinet Virtual Ethernet Adapters

図3.Disable Fortinet Virtual Ethernet Adapters

これらの仮想ネットワークアダプタは削除してしまっても、FortiClientの機能には影響は無いようなので、無効化に留めずに削除してしまうバッチ処理を考えます(WFHで利用するSSL-VPNリモートアクセスにも使用されません)。

 

netshは限定的

この手のバッチ操作でまず思いつくnetshは、インターフェイスの有効・無効までしか操作出来ず、インターフェイス名の指定方法も曖昧な汎用名のみなので、バッチ操作には不向きです。

 

DevCon.exeなら簡単も

ネットワークアダプタを無効化・有効化する程度であればnetshで容易に可能ですが、削除となると面倒です。Windows Driver Kitなどの開発ツールに含まれる、DevCon.exeを使う方法がDOSレベルで単純なのですが、WDKもしくはDevCon.exe単体をインストールする必要が生じるので、任意のPCに施工するには不向きです。

とは言え、DevCon.exeとはどのようなツールなのか、試してみたいので入手してみます。現行ではまずVisual Studio 2019を導入してから云々、と果てしない道のり。

単体のCABアーカイブを直リンからダウンロードする方法を解説しているサイトもありますが、更新が止まっています。そんな中、プレビュー版WDKをダウンロード出来るページを見つけました。幸い、Windows Insider Programに加入しているので、ログインの後、プレビュー版WDKをダウンロードします(執筆時点でビルド20279)。

図4.Get WDK Insider Preview

図4.Get WDK Insider Preview



このISOファイル内の「Installer」フォルダにある大量のCABアーカイブの中からDevCon.exeを見つけます。その要領についてはこちらのフォーラムに解説があり、それは以下の通りです。

32bit

  • アーカイブ名 82c1721cd310c73968861674ffc209c9.cab の中にある、
  • ファイル名 fil5a9177f816435063f779ebbbd2c1a1d2 を取り出して「DevCon.exe」にリネーム。

64bit

  • アーカイブ名 787bee96dbd26371076b37b13c405890.cab の中にある、
  • ファイル名 filbad6e2cce5ebc45a401e19c613d0a28f を取り出して「DevCon.exe」にリネーム。

 

早速DevCon.exeを使って、FortiClientが生成した仮想インターフェイスに関する情報を取得してみましょう。

デバイスインスタンスパス(ROOT\NET\0000など)はデバイスの構成によって連番が変わってしまうので、特定には使えません。ハードウェアID(root\ftvnic_aなど)を使って操作するのがより安全と言えます(どちらを使っても操作は可能)。

以上のことから、DevCon.exeを使ったバッチは次のようになるでしょう。

最後にfortisslと言うダイアルアップコネクションを消しているのは、古くからDOSにあるrasphoneコマンドです。

 

 

PnPUtil.exeを勧められるも

DevCon.exeの頁を開いた時に目についた「DevConの代わりに PnPUtilツールを使用してください」と言う文言。

これは主にドライバのインストール・アンインストールに使うようなツールに見え、デバイスの削除も可能とありますが、動作環境がWindows 10の中でもかなり最近のバージョンの必要があるようです。その代わりWindows標準で入っているので、新たなインストール作業は不要。今回使っているPCのバージョンは次の通りです。

それではPnPUtilを使って同様の情報を取得してみましょう。

構成に依らず一意なハードウェアIDは閲覧出来るものの、デバイスの操作にはインスタンスIDを使うしかなく、その末尾の連番はPCの構成によって異なることから、汎用的にバッチ操作させるにはハードウェアIDからインスタンスIDを得る仕組みが別途必要になります。ちなみにデバイスは次のようにあっさり削除できます。

 

wmicはどうか

WMIのコマンドラインツールwmicを使ってもネットワークアダプタを操作することは可能です。NIC関連の情報全フィールドは以下の通り膨大です。

その中からデバイス特定に使えそうなフィールドを選んでみました。

ServiceNameがハードウェアIDにほぼ則しているようです。デバイス操作は次の通りで実現出来るのは無効・有効化までで、削除する方法は見当たりませんでした(ドライバ削除までは「wmic sysdriver」で可能)。

その他全体的に枯れたテクノロジーなので、公式ですらリファレンス類は冷たい印象で、そんな中以下の記事がとても参考になりました(Great Tnx!!)。

 

Powershellによるアプローチ

Powershellの豊富な機能であればネットワークアダプタの操作も可能でしょう。但し実行の際、セキュリティ設定の面倒なおまじない(Set-ExecutionPolicy RemoteSigned)が憑いてまわるので、任意のPCでps1スクリプトファイルをダブルクリックすればそれだけで完結するものではありません。今回この問題はPowershellのps1ファイルをexe形式のバイナリ実行ファイルに変換するツール、PS2EXEを使い、ポリシー問題を回避しようと目論んでいます(GUI版も存在します)。

まずはPowershellにおける、ComponentIDで指定した特定のNICの無効・有効化は次のように行えます。

しかしながらNetAdapterで操作できるのもやはりここまで。更に調べを進めると、インスタンスIDを使ってレジストリキーを削除する方法があるようです。簡単なテストバッチを組んでみました。

実行させてみます。

アダプタ一覧からもFortiClient仮想アダプタが消えたので、一見成功に見えたのですがレジストリエディタで覗いてみると消せない残骸が。手動で消そうとしても権限の関係で消せません。DOSのregコマンドでも同様にエラーで残骸は消せず。この方法は使えません。

図5.消せないレジストリキー

図5.消せないレジストリキー

その辺りをおそらくうまく回避し、FortiClientに限らず様々な仮想アダプタへ汎用化させたお掃除スクリプトがこちらです。もはや芸術的(Fabulous Works!!)。

 

Epilogue

以上、様々な手法を試してみましたが、最も安全確実に仮想アダプタを削除出来るのはDevCon.exeと感じました。実際に運用してもらうバッチを次のように仕上げてみました。

実行結果はこのように。ネットワーク接続ウィンドウを最後に呼び出して、GUIベースの視認も付けています。

図6.完成したバッチの実行結果

図6.完成したバッチの実行結果

これをDevCon.exeと共にFortiClientのインストーラのある場所に配置し、インストール担当者には「インストール後にこのバッチを管理者として実行してね」と申し送りしてもらいます。

 

参考)

 

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA