Не запускается Server Manager


Уже втрой раз за несколько месяцев после установки ежемесячных обновлений Service Manager не может запуститься и подает в дамп.

Ситуация описана в https://social.technet.microsoft.com/Forums/en-US/d7e48460-bc23-4288-b976-98e7952d1517/server-manager-crashes-on-opening-on-windows-server-2016?forum=winservermanager

Код ошибки 1026. Смое важное в сообщении об ошибке:

Microsoft.Windows.ServerManager.Common.Data.RoleFeatureRoot..ctor(System.Collections.Generic.ICollection`1<Microsoft.Windows.ServerManager.Common.Data.IFeature>)
   at Microsoft.Windows.ServerManager.Common.Data.Server.UpdateFeatures(System.Collections.Generic.ICollection`1<Microsoft.Windows.ServerManager.Common.Data.IFeature>,

Статья на форуме Technet полезная, но не раскрывает всех секретов.

«UpdateFeatures» в сообщении об ошибке навивает на мысли. Фактически Server Manager не может получить список установленных компонентов.

Основная хитрость в том, что Server Manager использует PowerShell Remoting для подключения к серверам. Иначе говоря, если вы будете делать проверки локально, то не увидите проблему. Нужно проверять именно удаленное подключение.

Service Manager фактически использует для получения списка установленных компонент командлет Get-WindowsFeatures. Чтобы выполнить проверку правильно даже на локальном сервере, необходимо использовать параметер ComputerName:

Get-WindowsFeatures -ComputerName "server"

Если этот командлет вернет ошибку «Данный ключ отсутствует в словаре.» / «The given key was not present in the dictionary.», значит вы нашли поврежденный сервер.

Для лечения выполняем на нём команду:

dism /online /enable-feature /featurename:IIS-ASPNET45 /all

Остаётся только один вопрос: что если в Service Manager добавлено много серверов? Перебирать их вручную не очень интересное занятие. К тому же поврежденными могут оказаться серверы не подключенные в данный момент к Service Manager, но проблема может всплыть позднее в самое неподходящее время. Следовательно надо проверить все серверы и вылечить их.

# Получить список имен серверов, которые пингуются.
# Это значительно ускоряет процесс.
$servers = Get-ADComputer -SearchBase "OU=Servers,DC=firm,DC=ru" -Filter * | Select-Object -ExpandProperty Name | Where-Object { Test-Connection -ComputerName $_ -Count 1 -ErrorAction SilentlyContinue }

# Проверяем каждый сервер на конкретную этой ситуации ошибку.
$brokenServers = $servers | Where-Object { (Get-WindowsFeature -ComputerName $_ -ErrorVariable err -ErrorAction SilentlyContinue) -and ($err.Exception -is "System.Collections.Generic.KeyNotFoundException") }

$brokenServers

# Если найден поврежденный сервер, то выполняем на нем команду:
dism /online /enable-feature /featurename:IIS-ASPNET45 /all

Реклама