Установить параметры восстановления удаленной службы с помощью Powershell?
Мне очень трудно заставить это работать. Надеюсь, кто-нибудь сможет мне помочь!
В настоящее время я работаю над сценарием развертывания Powershell для службы. После установки службы, я хотел бы установить параметры восстановления службы, чтобы "перезапустить службу" каждый раз, когда служба выходит из строя через 0 минут.
Кто-нибудь знает, как это сделать с помощью Powershell, чтобы установить эти параметры для удаленной машины?
5 ответов:
Если бы это была локальная служба, вы могли бы использовать
sc.exe
, однако вы хотите изменить настройки для удаленной службы. Один из способов сделать это-установить ключи реестра непосредственно с помощью удаленного реестра:Вот настройки, которые вам понадобятся:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<ServiceShortName> Value Name Data Type Description FailureActions REG_BINARY Configuration information for 1st, 2nd, and subsequent failures.
Что бы я сделал, так это настроил Параметры восстановления службы так, как вы хотите, а затем прочитал значение реестра
FailureActions
$actions = get-itemproperty hklm:\system\currentcontrolset\services\<ServiceShortName> | select -Expand FailureActions
Затем сериализуйте это на диск для последующего использования:
$actions | Export-Clixml C:\actions.xml
Когда вы будете готовы к удаленной настройке сервиса, перечитайте данные FailureActions, подключитесь к удаленному реестру и установите ключ реестра:
$actions2 | Import-Clixml C:\actions.xml $key = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, "<RemoteComputerName>") $key2 = $key.OpenSubKey('SYSTEM\CurrentControlSet\Services\<ServiceShortName>', $true) $key2.SetValue('FailureActions', ([byte[]] $actions))
Вы можете написать функцию powershell с помощью sc.exe, как описано здесь. Функция будет выглядеть примерно так:
function Set-Recovery{ param ( [string] [Parameter(Mandatory=$true)] $ServiceName, [string] [Parameter(Mandatory=$true)] $Server ) sc.exe "\\$Server" failure $ServiceName reset= 0 actions= restart/0 #Restart after 0 ms }
И вы можете вызвать функцию следующим образом:
Set-Recovery -ServiceName "ServiceName" -Server "ServerName"
Примечание: учетная запись, с которой вы запускаете скрипт, должна иметь права администратора на удаленном сервере.
БиблиотекаCarbon имеет довольно полный командлет
Install-Service
, который позволяет указать действия восстановления, например (адаптированный со страницы Install-Service doc):Install-Service -Name DeathStar -Path C:\ALongTimeAgo\InAGalaxyFarFarAway\DeathStar.exe -OnFirstFailure Restart -RestartDelay 10000
Это приведет к установке службы
DeathStar
и перезапуску с 10-секундной задержкой после первого сбоя.
Я взял идею @Mohammad Nadeem и расширил ее с полной поддержкой всех действий, а не только основного. Я также использовал отображаемое имя для службы, а не имя службы, поэтому немного проще указать параметр.
function Set-Recovery{ param ( [string] [Parameter(Mandatory=$true)] $ServiceDisplayName, [string] [Parameter(Mandatory=$true)] $Server, [string] $action1 = "restart", [int] $time1 = 30000, # in miliseconds [string] $action2 = "restart", [int] $time2 = 30000, # in miliseconds [string] $actionLast = "restart", [int] $timeLast = 30000, # in miliseconds [int] $resetCounter = 4000 # in seconds ) $serverPath = "\\" + $server $services = Get-CimInstance -ClassName 'Win32_Service' | Where-Object {$_.DisplayName -imatch $ServiceDisplayName} $action = $action1+"/"+$time1+"/"+$action2+"/"+$time2+"/"+$actionLast+"/"+$timeLast foreach ($service in $services){ # https://technet.microsoft.com/en-us/library/cc742019.aspx $output = sc.exe $serverPath failure $($service.Name) actions= $action reset= $resetCounter } } Set-Recovery -ServiceDisplayName "Pulseway" -Server "MAIL1"
Я написал об этом в блоге: https://evotec.xyz / set-service-recovery-options-powershell / . Я не проверял это в других сценариях, кроме перезапуска службы. Вероятно, потребуется некоторая работа для поддержки всех сценариев.
Пожалуйста, упростите..
Используйте самый старый sc.exe в коде powershell. Является более легким и полностью функциональным.
sc.exe failure "ServiceName" actions= restart/180000/restart/180000/reboot/180000 reset= 86400;
Перезапуск, в миллисекундах. И последний сброс, через несколько секунд.
(каждый перезапуск через 3 мин, а сброс через 1 день)
Пока!