Периодически на RDS серверах с Windows Server 2022/2019 встречаются жалобы пользователей на работу Start Menu. При попытке нажать на кнопку Пуск в терминальной сессии ничего не происходит (меню не открывается), либо сама RDP сессия подвисает. Более того, кроме стартового меню, на панели задач перестают работать все элементы, которые открываются левой кнопкой мыши.
За отображение и функционал кнопки Пуск отвечают два процесса
Explorer.exe
и
StartMenuExperienceHost.exe
. Для быстрого решения разовой проблемы может помочь их перезапуск из Task Manager.
Но чаще всего проблема с зависающем Start Menu на серверах в RDS ферме возникает постоянно. При этом в журнале Event Viewer -> System начинают сыпаться множество ошибок от DCOM с Event ID 10001 и указанием на приложения Microsoft Store.
Для временного исправления проблемы с неработающим меню Пуск в сеансе пользователя может помочь перерегистрация проблемного APPX приложения. Чтобы открыть PowerShell консоль без кнопки Пуск (которая не открывается), вызовите меню сочетанием Win+X. Выполните команду:
Add-AppxPackage -Register "C:\Windows\SystemApps\ShellExperienceHost_cw5n1h2txyewy\AppxManifest.xml" -DisableDevelopmentMode
Либо можно перерегистрировать все приложения Microsoft Store:
Get-AppXPackage | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"}
Если это не исправило проблему, или помогло но лишь временно, проверьте содержимое веток реестра:
HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\AppIso\FirewallRules
HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules
В моем случае здесь скопилось несколько тысяч правил Windows Defender Firewall, которые создавались для APPX/MSIX приложений MS Store при каждом входе и выходе каждого пользователя (и не очищались автоматически).
При каждом запуске APPX приложения, автоматически добавляется правила файервола, причем старые правила не удаляются. Из-за такого количество правил файервола процесс StartMenuExperienceHost , который отвечает за отображение меню Пуск в сессии пользователя, начинает зависать. Для восстановления работоспособности меню Пуск нужно очистить эти правила файервола.
Сначала создадим резервную копию ветки реестра с правилами файервола, к которой можно будет откатиться в случае проблем:
reg export "HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy" C:\Backup_FirewallPolicy.reg
Get-NetFirewallRule
их не видит). Поэтому придется удалять их напрямую из реестра.Теперь можно очистить ветки реестра с правилами файервола:
reg delete HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\Configurable\System /va /f
reg delete HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\AppIso\FirewallRules /va /f
Это очистит кастомные правила Firewall.
HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules
. Здесь также может быть значительное количество одинаковых правил файервола для APPX приложений Store. Целиком удалять содержимое этой ветки нежелательно, т.е. это полностью очистит все правила Windows Firewall, включая стандартные. В результате вы можете потерять удаленный доступ к серверу (в том числе RDP).Поэтому перед очисткой этих правил, создайте GPO с нужными правилами файервола и примените ее к этому хосту, чтобы не потерять к нему доступ.
Чтобы пересоздать дефолтные правила Windows Firewall, выполните команду:
(New-Object -ComObject HNetCfg.FwPolicy2).RestoreLocalFirewallDefaults()
Чтобы Windows автоматически очищал правила Windows Firewall, которые создаются приложениями Microsoft Store в каждой пользовательской сессии, нужно создать на RDS сервере параметр реестра DeleteUserAppContainersOnLogoff со значением 1. Чтобы создать параметр реестра с помощью PowerShell, выполните:
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy" -Type DWord -Name DeleteUserAppContainersOnLogoff -Value 1
Теперь при завершении сеанса пользователя, созданные для него правила файервола будут очищаться.
Осталось перерегистрировать APPX приложения:
Get-AppXPackage -AllUsers | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($_.InstallLocation)\AppXManifest.xml”}