Установить параметры восстановления удаленной службы с помощью Powershell? - PullRequest
5 голосов
/ 14 февраля 2012

Мне очень трудно заставить это работать. Надеюсь, кто-нибудь может мне помочь!

В настоящее время я работаю над сценарием развертывания Powershell для службы. После установки службы я хотел бы установить для параметров восстановления службы значение «Перезапуск службы» каждый раз, когда происходит сбой службы через 0 минут.

Кто-нибудь знает, как сделать это с помощью Powershell, чтобы установить эти параметры для удаленного компьютера?

Ответы [ 5 ]

7 голосов
/ 12 мая 2014

Вы можете написать функцию 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"

Примечание. У учетной записи, с которой вы запускаете скрипт, должны быть права администратора на удаленном сервере.

2 голосов
/ 14 февраля 2012

Если бы это была локальная служба, вы могли бы использовать 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))
1 голос
/ 16 мая 2018

Пожалуйста, упростите ..

Используйте самый старый sc.exe в коде powershell. Является более простым и полностью функциональным.

sc.exe failure "ServiceName" actions= restart/180000/restart/180000/reboot/180000 reset= 86400;

Перезапуски в миллисекундах. И последний сброс в секундах.

(каждый перезапуск через 3 минуты и сброс через 1 день)

Bye!

1 голос
/ 22 октября 2017

Я взял идею @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/. Я не проверял это в других сценариях, кроме перезапуска службы.Вероятно, потребуется некоторая работа для поддержки всех сценариев.

1 голос
/ 17 февраля 2014

Библиотека Carbon имеет довольно обширный командлет Install-Service, который позволяет указывать действия по восстановлению, например, (адаптировано со страницы документации Install-Service ):

Install-Service -Name DeathStar -Path C:\ALongTimeAgo\InAGalaxyFarFarAway\DeathStar.exe -OnFirstFailure Restart -RestartDelay 10000

Это установит службу DeathStar и перезапустится с 10-секундной задержкой после первого сбоя.

...