Проблеми з мережевими адаптерами vmxnet3 в Windows (2008 R2 і 7) після установки оновлень KB4088875 і KB4088878

Нові кумулятивні оновлення безпеки Microsoft - KB4088875 (Monthly Quality Rollup) і KB4088878 (Security Only Update) для Windows 7 SP1 і Windows Server 2008 R2, випущені 13 березня 2018, викликають серйозні проблеми з мережевими адаптерами віртуальних машин VMware. Дані поновлення призводять до пересозданию мережевих інтерфейсів vNIC і скидання мережевих налаштувань гостьових ОС, як наслідок, після установки оновлень віртуальна машина втрачає заданий статичний IP адреса і стає доступною по мережі.

Відбувається це через те, що в системі додається нова мережева карта активний, а старий мережевий адаптер стає прихованим і неактивним. Нова мережева карта налаштована на динамічний отримання IP адреси від DHCP сервера. У тому випадку, якщо спробувати вручну виставити старий IP адреса для нової мережевої карти, з'являється помилка:

The IP address X.X.X.X you have entered for this network adapter is already assigned to another adapter (vmxnet3 Ethernet adapter) which is no longer present in the computer. If the same address is assigned to both adapters and they become active, only one of them will use this address. This may result in incorrect system configuration. Do you want to enter a different IP address for this adapter in the list of IP addresses in the advanced dialog box?

IP-адреса X.X.X.X, вказаний для цього мережевого адаптера, вже призначений іншому адаптера vmxnet3 Ethernet. Якщо обом адаптерів призначений один і той же адресу, і обидва адаптера стають активними, то тільки одне з них зможе його використовувати. Це може привести до неполадок в роботі системи. Ввести інший IP-адреса для цього адаптера в список IP-адрес у вікні додаткових параметрів?

Після установки даних оновлень віртуальний сервер втрачає призначений йому IP адреса, намагаючись отримати нову адресу від DHCP сервера. При цьому створюється новий мережевий інтерфейс в гілці HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Interfaces. Стара мережева карта при цьому ховається.

Проблема виявляється тільки на віртуальних машинах з Windows 7 / 2008R2 з віртуальним мережевим адаптером типу vmxnet3.

Таким чином старий IP адреса все ще вважається використовуваним і його потрібно звільнити.

Щоб вручну виправити помилку потрібно видалити прихований мережевий адаптер в списку обладнання. Для того, щоб відобразити приховану мережеву карту в диспетчері пристроїв, потрібно виконати команди

set devmgr_show_nonpresent_devices = 1
start devmgmt.msc

Виберіть пункт меню View -> Show Hidden Devices. І розгорніть секцію Network Adaters.

Після цього в диспетчері пристроїв потрібно видалити приховані мережеві карти vmxnet3 Ethernet Adapter #x. Після цього старий IP адреса можна буде призначити нового мережевої карти.

Тепер відкрийте панель управління мережевими підключеннями і відредагуйте IP налаштування нового адаптера. Збережіть зміни (перезавантаження не буде потрібно).

Для автоматичного виправлення даної проблеми Microsoft пропонує скористатися наступними VBS скриптом (https://support.microsoft.com/en-us/help/3125574/convenience-rollup-update-for-windows-7-sp1-and-windows-server- 2008 r2), який потрібно запустити до або після установки оновлень.

Перед виконанням скрипта рекомендується створити резервну копію наступної гілки реєстру: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Enum \ PCI .

код скрипта fixPCI.vbs

Option Explicit
Const HKEY_LOCAL_MACHINE = & H80000002
Dim oReg: Set oReg = GetObject ( "winmgmts: impersonationLevel = impersonate! \\. \ Root \ default: StdRegProv")
Dim oShell: Set oShell = CreateObject ( "WScript.Shell")
Dim sPath, aSub, sKey, aSubToo, sKeyToo, dwValue, Result, SaveResult
Dim NotDeleted
NotDeleted = 0
'Get all keys within sPath
sPath = "SYSTEM \ CurrentControlSet \ Enum \ PCI"
oReg.EnumKey HKEY_LOCAL_MACHINE, sPath, aSub


'Loop through each key
For Each sKey In aSub
'Get all subkeys within the key' sKey '
oReg.EnumKey HKEY_LOCAL_MACHINE, sPath & "\" & sKey, aSubToo
For Each sKeyToo In aSubToo
Result = oReg.DeleteKey (HKEY_LOCAL_MACHINE, sPath & "\" & sKey & "\" & sKeyToo & "\" & "\ Device Parameters" & "\ SlotPersistentInfo")
'Allow failure only if key never existed
If (Result = 1) Or (Result> 2) Then
NotDeleted = 1
SaveResult = Result
End If
Next
Next

If (NotDeleted> 0) Then
Wscript.Echo "One or more SlotPersistentInfo keys still exist under HKLM \ System \ CurrentControlSet \ Enum \ PCI \\\ Device Parameters. Please delete manually. Result =" & Result
End If

В общем-то аналогічні дії можна виконати за допомогою однієї команди PowerShell:
Get-ChildItem "HKLM: // System / CurrentControlSet / Enum / PCI / * / * / DeviceParameters / SlotPersistentInfo" | Remove-Item

Щоб знайти всі віртуальні машини з адаптером Vmxnet3, можна скористатися PowerCLI.
Для цього, підключиться до сервера vSphere.
Connect-VIServer -Server vsphere65 -User corp \ username

Тепер виведемо список всіх віртуальних машин з ОС і використовуваними версіями віртуальних мережевих карт.

PowerCLI C: \> Get-VM | Select Name, PowerState, Guest, @ N = 'NetworkAdapter'; E = [string] :: Join ( ',', (Get-NetworkAdapter -Vm $ _ | Select-Object -ExpandProperty Type))

Для зручності аналізу дану таблицю можна експортувати в Excel, додавши | Export-Csv C: \ PS \ vNICrep.csv -NoTypeInformation