[WMI-NetAPI] Win32_NetworkAdapterConfigration の結果が重複する 1/(2)

みなさんごきげんよう。ういこです。

最近というか、ずっと心身ともに調子悪くて困っています。目の前のことを一個一個片付けていったらいずれは終わるのでしょうか。いつ終わるのかわからない螺旋の中をぐるぐる回ってる気分です。
そういえば某恋愛ゲームの女の子も、告白直前の夢で螺旋がどうこうって言ってましたね。螺旋といえば、"覚悟のススメ" くらいしか思いつかなかったんですが。 …わたしはまだ、覚悟完了の境地までは至っておりません。

さて、今日はそんな終わることのない螺旋を思わせる for 文ばっかり想起させる WMI ねたをひとつ。

【今回の問題】
環境上にあるネットワーク アダプタがある条件下ではレジストリにゴミ情報が残り、その結果 WMI の Win32_NetworkAdapterConfigration クラスの取得結果が重複してしまうことがある。
以前問い合わせをした際、その動作自体は OS の規定の動作ということで GetAdaptersInfo()、GetAdaptersAddresses() などを使ってアクティブなデバイスを取得し、そのデバイスから Win32_NetworkAdapterConfigration の情報をフィルタしたいと思っているが、フラグに使おうと思う変数が思うような値を返さず、フィルタ条件として有効にならない状況である。
Win32_NetworkAdapterConfigration のうち、適切なアクティブな状態のアダプタの情報だけフィルタして取得する方法とは何か!
うなる鉄拳!
異音を立てるデバイス!
ただで機械の体をくれるといううまい話に明日はあるか。

*****************

…すみません後半はかなり電波でした…。
まず、どういう現象なのかを順に追ってみてみることにします。
今回は、同じデバイスなのになぜか違うデバイスとしておなじデバイスの情報が複数作られてしまう状況についてお話します。

1) 同じネットワーク アダプタなのに複数接続状態に見えることがある

取り外しできるようなネットワーク アダプタを挿して、そのあと抜いて、また挿すということはよくある操作です。
また、複数ネットワーク アダプタが挿してあるというのも、無線 Lan / 有線 Lan と使い分けることも多いこのご時勢、よくあることでございます。
通常こうした動作で何か超常現象が発生するようなことはありませんが、以下の条件などの場合に、同じデバイスの情報が重複してしまうことがあります。

1. ネットワーク アダプタを挿して、デバイス ドライバをインストール
2. PC の電源をシャットダウン
3. 電源の入ってない PC からアダプタを抜く
4. PC の電源をオン
5. また同じネットワーク アダプタを挿す

こうすると、同一のアダプタが複数接続状態となっている様に見える場合がありました。
これは、電源が落とされた状態でデバイスが抜かれ、無効となる事で OS がデバイスを取り外す際に行うべき処理をおこなう事ができず情報が残った結果となります。
また、確認されているほかの条件としては、複数存在するネットワーク アダプタのうち、インストール時に OS が先に認識したネットワーク アダプタを取り外す、などもあります。
あとから認識されたネットワーク アダプタを取り外してもこの現象は発生いたしません。 ちなみに、デバイス マネージャ上は重複している「はず」のデバイスは 1 個分しか表示されません

2) 何で複数接続状態に見えちゃうの?同じアダプタなのに!

レジストリには、ネットワーク アダプタを識別するために NTEContextList という値が保存されています。
この値は、ネットワーク アダプタが認識された順を示すのですが、OS にてネットワーク アダプタのアンインストール処理が行われないうちにネットワーク アダプタが取り外されてしまうと、次回アダプタを認識時に欠番が生じたことを判断できず、NTEContextList の値が重複してしまいます。
このため、ネットワーク アダプタ情報を重複して取得する結果が生じます。

NTEContextList は、レジストリ上のネットワークアダプタ情報が格納されている領域にて割り振られます。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

上記レジストリ以下にネットワーク アダプタを示すユニークな文字によってレジストリキーが作成されているのです。
このキー配下に NTEContextList エントリがあります。
重複現象が発生した場合、複数のネットワーク アダプタ配下の NTEContextList 値に対して同一の値が格納されているネットワーク アダプタが存在することになります。
もし、これっぽいなと思ったらレジストリの上記エントリを見てみましょう。どこかに重複しているやつがいるはずです。
ちなみに、これら複数に見えるネットワーク アダプタの情報は、実際には取り外しが認識できずに旧情報が含まれた意味のない情報です。

次回は、これをどうやってお料理するかを見ていきましょう。

つづき ⇒ [WMI-NetAPI] Win32_NetworkAdapterConfigration の結果が重複する 2/(2) https://blogs.technet.com/jpilmblg/archive/2009/11/21/wmi-netapi-win32-networkadapterconfigration-2-2.aspx

ういこう@「流行りの服は嫌いかね?」…ムスカ様のお洋服の趣味ってどうかと思う。