2015-07-02 6 views
1

Я пытаюсь автоматизировать через PowerShell ряд трудоемких задач, которые я должен выполнить, чтобы создать новый шаблон виртуальной машины, один из которых удаляет все сетевые карты из виртуальной машины и очистка диспетчера устройств от других устройств.

После удаления сетевых адаптеров из виртуальной машины я попытался использовать следующие фрагменты кода, которые делают то же самое, для очистки Диспетчера устройств.Использование Powershell для удаления сетевых сетевых адаптеров

wmic nic where "(servicename is null)" delete 

 

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

В обеих случаях я получаю сообщение об ошибке "Провайдер не способна предпринятых операций". Просмотр журналов событий для WMI-Activity не помог: ResultCode = 0x80041024; Возможная причина = Неизвестно.

Может ли кто-нибудь сделать что-то подобное, что удаляет неподдерживаемые устройства или может найти проблему с указанными выше командами?

EDIT: Я попытался использовать DevCon для удаления устройства, но, похоже, он работает только с настоящими устройствами. Теперь я расчесываю реестр, чтобы узнать, есть ли какой-то конкретный ключ или набор ключей, которые удаляются, удаляя NIC из диспетчера устройств.

+1

Я не верю, что поддерживает эту PowerShell функциональность, то вы можете отключить только устройства, а не установить/выгрузки драйверов устройств. Всегда есть хорошие старые инструменты командной строки, которые вы можете вызывать из powershell: https://support.microsoft.com/en-us/kb/311272 – Cole9350

+0

Спасибо за КБ. Я надеялся, что смогу использовать встроенную командную строку, а не другой инструмент, но я думаю, мне придется попробовать DevCon. – Hive

+0

Пробовал использовать DevCon и получал ошибки (удалил сбой), прочитал на некоторых форумах и увидел, что DevCon работает только на настоящих устройствах. – Hive

ответ

0

ключ Этот реестр содержит все аппаратные настройки машины в реестре:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ перечисление

Первый запрос настоящего и включен сетевые адаптеры с помощью WMI и получить их PNPDeviceId. Это значение сообщит вам, в каком подразделении находятся сетевые адаптеры.

Затем выполните запрос реестра для каждого подраздела и найдите все адаптеры. Разберите полный раздел реестра, чтобы сократить до такой же длины, как значения PNPDeviceId; примерно PCI \ VEN_80AD & DEV_15A2 & SUBSYS_062D1028 & REV_02 \ 2 C9.

Сравните эти два списка и найдите любые потерянные ключи реестра. После обнаружения удаления ключей реестра путем перечисления системной учетной записи удаляется сетевой адаптер из диспетчера устройств. Я использовал PSExec.exe для запуска команды reg delete в качестве системной учетной записи.

Вот какой код для выполнения того, что я только что объяснил.

# 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'" 
} 
+0

Я получаю сообщение об ошибке: psexec.exe: Термин «psexec.exe» не распознается как имя командлета, функции, файла сценария или исполняемой программы. Проверьте правильность написания имени или если путь был включен, проверьте правильность пути и повторите попытку. –

+0

Вам нужно иметь psexec.exe из [PSTools download] (https://download.sysinternals.com/files/PSTools.zip) в той же папке, где вы выполняете сценарий. Или просто поместите его в папку C: \ Windows \ System32. – Hive

 Смежные вопросы

  • Нет связанных вопросов^_^