Большая загрузка CPU процессом MSIExec на терминальном сервере из-за поиска GUID принтеров

High CPU usage in MSIExec on Terminal serversПри установке программы на терминальном сервере под управлением Windows Server 2003, обратил внимание, что установка идет чрезвычайно долго. Вооружившись инструментами  Process Explorer и Process Monitor от Sysinternals определил источник проблем.

Как оказалось, висит процесс MSIExec (Windows Installer) при этом потребляя много процессорного времени — полностью было загружено одно ядро на 100%.

Запустив Process Monitor и настроив его только для фильтрации событий от службы msiexec, увидел в логе событий много операций чтения из реестра:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\TerminalServer\Install\RefHive\Hewlett-Packard\10004344-b104-4f54-269d-16f98f840ede

В примере приведен лишь один GUID из великого множества.

Запустив редактор реестра, обнаружил по пути (HKEY_USERS\.DEFAULT\Software\Hewlett-Packard) огромное количество записей подобных этим:

[HKEY_USERS\.DEFAULT\Software\Hewlett-Packard\10004344-b104-4f54-269d-16f98f840ede]
"iJobCount"="1"
"ShowJobStorageDlg"=hex:01
"PredefinedQuicksetCount"=dword:00000003
[HKEY_USERS\.DEFAULT\Software\Hewlett-Packard\10004344-b104-4f54-269d-16f98f840ede\HPBIDIInfo]
"EACStatus"=dword:00000000
[HKEY_USERS\.DEFAULT\Software\Hewlett-Packard\10004344-b104-4f54-269d-16f98f840ede\HPCUSTOMForms]

Сделав бэкап ветки реестра, который оказался весом в 50 Мб, я удалил полностью ветку HKEY_USERS\.DEFAULT\Software\Hewlett-Packard.

После этого программа установилась в течении минуты.

Затем я из бекапа ветки рестра взял несколько строчек, которые были не связаны с GUID принтеров и импортировал их обратно.

[HKEY_USERS\.DEFAULT\Software\Hewlett-Packard\HP Print Settings]
"CurrentProfile"="Default Location"
"ReadInOldProfiles"=dword:00000001
"ReadInM1Profiles"=dword:00000001
"MystDeviceVerify"=dword:00000200
"ChangedPorts"=dword:00000003
[HKEY_USERS\.DEFAULT\Software\Hewlett-Packard\HP Print Settings\Default Location]
@="Default Location"

Опытным путём выяснилось, что запись в реестре создается каждый раз, когда пользователь входит на терминальный сервер и подключается сетевой принтер. При повторном входе пользователя и подключении этого принтера создается еще одна запись в ветке HKEY_USERS\.DEFAULT\Software\Hewlett-Packard.