2

新しい VM テンプレートを作成するために実行しなければならない多くの時間のかかるタスクを PowerShell を介して自動化しようとしています。そのうちの 1 つは、VM からすべての NIC を削除し、存在しないデバイスのデバイス マネージャーをクリーンアップすることです。

VM から NIC を削除した後、同じことを行う次のコード スニペットを使用して、デバイス マネージャーをクリーンアップしようとしました。

wmic nic where "(servicename is null)" delete

 

gwmi win32_networkadapter | ?{$_.ServiceName -eq $null} | rwmi

どちらの場合も、「試行された操作をプロバイダーが実行できません」というエラーが表示されます。WMI-Activity のイベント ログを確認しても解決しないようでした: ResultCode = 0x80041024; 考えられる原因 = 不明。

存在しないデバイスを削除する、または上記のコマンドで問題を見つけることができる同様のことを誰かが行うことができますか?

編集: DevCon を使用してデバイスを削除しようとしましたが、現在のデバイスでのみ機能するようです。現在、レジストリをくまなく調べて、削除するとデバイス マネージャーから NIC が削除される特定のキーまたはキーのセットがあるかどうかを確認しています。

4

4 に答える 4

-1

このレジストリ キーには、レジストリ内のマシンのすべてのハードウェア設定が含まれてい
ます

。この値は、ネットワーク アダプターが配置されているサブキーを示します。

次に、各サブキーのレジストリを照会し、すべてのアダプターを見つけます。完全なレジストリ キーを解析して、PNPDeviceId 値と同じ長さに切り詰めます。おおよそ PCI\VEN_80AD&DEV_15A2&SUBSYS_062D1028&REV_02\2&11483669&0&C9.

2 つのリストを比較して、孤立したレジストリ キーを見つけます。見つかったら、システム アカウントを列挙してレジストリ キーを削除すると、ネットワーク アダプタがデバイス マネージャから削除されます。PSExecを使用しました。

これは、今説明したことを実行するためのコードです。

# Declare variables
[string]$regIds = "";
[string]$Orphans = "";
[array]$SubKeys = @();
[array]$RegKeys = @();

# Query the present and enabled Network Adapters for the PNPDeviceId value
[array]$PNPDeviceIds = (gwmi Win32_NetworkAdapter -Filter "NetEnabled = true").PNPDeviceId;
for ($i = 0; $i -lt $PNPDeviceIds.Count; $i++){
    if ($SubKeys -NotContains $($PNPDeviceIds[$i].Split('\')[0] + "\" + $PNPDeviceIds[$i].Split('\')[1])){
        $SubKeys += $($PNPDeviceIds[$i].Split('\')[0] + "\" + $PNPDeviceIds[$i].Split('\')[1]);
}}

# Query the registry for all of the adapters
foreach ($SubKey in $SubKeys){
    [array]$Keys = reg query "hklm\system\currentcontrolset\enum\$SubKey"
    $Keys = $Keys[1..$($Keys.Count -1)];
    $RegKeys += $Keys;
}
# Parse the Keys
for ($i = 0; $i -lt $RegKeys.Count; $i++){ $regIds += "," + $($RegKeys[$i].Split('\')[4..6] -join '\'); }
$regIds = $regIds.TrimStart(",");

# Compare the registry to the present devices
for ($i = 0; $i -lt $regIds.Split(',').Count; $i++){
    if ($PNPDeviceIds -NotContains $regIds.Split(',')[$i]){
        $Orphans += "," + $regIds.Split(',')[$i];
}}
if ($Orphans.Length -gt 0){ $Orphans = $Orphans.TrimStart(","); }

# Delete the non-present devices
foreach ($Orphan in $Orphans)
{
    psexec.exe -s powershell.exe "reg delete 'hklm\system\currentcontrolset\enum\$Orphan'"
}
于 2015-07-09T15:40:52.270 に答える