Home > Windows にまつわる e.t.c.

取り外した NIC をデバイスリストからコマンドラインで削除する


取り外してデバイマネージャーで非表示になっているデバイスは、通常放置で構わないのですが、NIC に名前を付けている場合は同じ名前が付けられないのでなかなか厄介です。

こんな時は、取り外したデバイスを表示して削除します。

取り外したデバイスを削除する
http://www.vwnet.jp/windows/WS08R2/Device/Deleted.htm

 

GUI でポチポチするのであればこれで十分なのですが、対象が複数台ある場合は GUI ポチポチはやってられないので、バッチで何とかしたいですね。

こんな時は WDK に含まれている devcon.exe を使ってコマンドラインで削除することができます。

 

WDK のインストール

WDK は以下からダウンロードしてインストールします。

Download the Windows Driver Kit (WDK) | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/download-the-wdk

 

これを書いている時点のダウンロード リンク(w7/WS08R2 でも問題なく動きました)

 

インストールが完了すると、以下に devcon.exe がセットされるので Path を通すか、フルパスを指定して devcon.exe を使います。

C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe

(x86環境要で操作する場合は x86 フォルダの方を使います)

 

NIC のリストアップ

現在の NIC をリスティングする場合は、「listclass net」オプションを使います。

devcon.exe listclass net

 

取り外された NIC を含め、すべての NIC をリスティングする場合は、「findall =net」オプションを使います。

devcon.exe findall =net

 

取り外された NIC の削除

これらでリスティングされた NIC を ID で突き合わせ、取り外された NIC を特定します。

取り外された NIC は「-r remove "@ID"」オプションで削除します。

devcon.exe -r remove "@ID"

 

PowerShell で自動化する

コマンドラインが分かったので、PowerShell で自動化するとこんな感じになります。

[ RemoveDeletedNIC.ps1 ]

##################################################################
# 取り外した NIC をデバイスリストから削除する
##################################################################
# devcon.exe のプルパス
$DevCon = "C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe"

##################################################################
# 現在の NIC 取得
##################################################################
function GetNowNICs(){
    # 現在の NIC リスト
    [array]$NowNICs = . "$DevCon" listclass net

    # 現在の NIC リストを格納するオブジェクト
    $NowNICObjects = @()

    # オブジェクトにする
    $Max = $NowNICs.Count
    for( $Index = 0;$Index -lt $Max; $Index++){
        $NowNICObject = New-Object PSObject | Select-Object DeviceID, DeviceName

        # 先頭行にある余分な文字列を削除
        if( $Index -eq 0 ){
            $NowNICs[$Index] = $NowNICs[$Index] -replace "^Listing [0-9]+ .+\("
        }

        [array]$Buffer = $NowNICs[$Index] -Split ":"
        if($Buffer.Count -eq 2){
            $NowNICObject.DeviceID = $Buffer[0].Trim()
            $NowNICObject.DeviceName = $Buffer[1].Trim()
        }
        $NowNICObjects += $NowNICObject
    }

    return $NowNICObjects
}

##################################################################
# 未接続も含めた全 NIC 取得
##################################################################
function GetAllNICs(){
    # 未接続も含めた全 NIC リスト
    [array]$AllNICs = . "$DevCon" findall =net

    # 未接続も含めた全 NIC リストを格納するオブジェクト
    $AllNICObjects = @()

    # オブジェクトにする
    $Max = $AllNICs.Count -1
    for( $Index = 0;$Index -lt $Max; $Index++){
        $AllNICObject = New-Object PSObject | Select-Object DeviceID, DeviceName

        [array]$Buffer = $AllNICs[$Index] -Split ":"
        if($Buffer.Count -eq 2){
            $AllNICObject.DeviceID = $Buffer[0].Trim()
            $AllNICObject.DeviceName = $Buffer[1].Trim()
        }
        $AllNICObjects += $AllNICObject
    }

    return $AllNICObjects
}

##################################################################
# 未接続 NIC をデバイスから削除する
##################################################################
function RemoveNotConnectNIC( $NowNICObjects, $AllNICObjects){
    # 未接続 NIC をデバイスから削除する
    $Max = $AllNICObjects.Count
    for( $Index = 0;$Index -lt $Max; $Index++){
        # 未接続になっている NIC
        if(-not $NowNICObjects.DeviceID.Contains($AllNICObjects[$Index].DeviceID)){
            # RAS 以外の未接続 NIC を消す
            if( $AllNICObjects[$Index].DeviceName -ne "RAS"){
                $RemoveNICID = $AllNICObjects[$Index].DeviceID
                $RemoveNICName = $AllNICObjects[$Index].DeviceName
                echo "Removed NIC / $RemoveNICID : $RemoveNICName"

                # devcon.exe で削除
                $RemoveTerget = "`"@" + $RemoveNICID + "`""
                . $DevCon -r remove $RemoveTerget
            }
        }
    }
}

##################################################################
# main
##################################################################

# 現在有効な NIC 取得
[array]$NowNICs = GetNowNICs

# 取り外した分も含めたすべての NIC
[array]$AllNICs = GetAllNICs

# 取り外された NIC 削除
RemoveNotConnectNIC $NowNICs $AllNICs

 

公開リポジトリ

最新版は以下リポジトリに公開しているので、Sourcetree 等の Git Clientで Clone して使ってください。

git@github.com:MuraAtVwnet/DeleteRemovedNIC.git
https://github.com/MuraAtVwnet/DeleteRemovedNIC

 

参考情報

取り外したデバイスを削除する
http://www.vwnet.jp/windows/WS08R2/Device/Deleted.htm

Windows Device Console (Devcon.exe) | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/devtest/devcon

デバイスの有効・無効をプログラムから切り替える方法
https://blogs.msdn.microsoft.com/jpwdkblog/2009/09/28/663/

DevCon と SetupDi API ~ DevCon の使い方編 ~
https://blogs.msdn.microsoft.com/jpwdkblog/2009/06/16/devcon-setupdi-api-devcon/

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.