Перезапуск службы удаленной системы - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь написать сценарий PowerShell для перезапуска службы в удаленной системе? Можно ли запустить сервис на основе вывода скрипта? Например, если статус службы возвращает статус «Остановлен», выполнить что-то вроде приведенного ниже псевдокода ...

if {service-status = Stopped | Get-Service -Name ServiceName | Start-Service}

Вот пример моего текущего кода, если что-то из этого имеет смысл:

# Display status of Sophos Services
$Computer1 = Read-Host -Prompt 'Enter the computer name to check Sophos Services'
Get-Service -DisplayName sop* -ComputerName $Computer1

 # Service Stop
 $Service1 = Read-Host -Prompt 'Enter the service needed to be restarted'
 Echo "Stopping service"
 Read-Host -Prompt "Press Enter to continue"
 Get-Service -Name $Service1 -ComputerName $Computer1 | Stop-Service

 # Service Stop   
 Echo "Starting service"
 Read-Host -Prompt "Press Enter to continue"
 Get-Service -Name $Service1 -ComputerName $Computer1 | Start-Service

Было бы неплохо сделать этот процесс немного более автоматизированным. Надеюсь, что это имеет смысл.

Thanx ...

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Более «способ PowerShell» для достижения того, что вы просили:

    function Restart-RemoteService {
    [CMDLETBINDING()]
    param (
        [Parameter(Mandatory)]
        [String] $ServiceName,

        [String] $ComputerName = 'localhost'
    )

    BEGIN {} #BEGIN

    PROCESS {

        $params = @{
            'Name'         = $ServiceName
            'ComputerName' = $ComputerName
        }

        Write-Verbose "Testing status of service"
        $Status = Get-Service @params

        if ($status.Status -eq 'Running') {
            Write-Host "Service $ServiceName has already been running"
        }
        ELSE {
            Write-Host "Starting Service $SeviceName"
            Get-Service @params | Start-Service
        }


    } #PROCESS

    END {} #END

} #function

Функция будет:

Ожидаются два параметра:

ServiceName, который является обязательным, поэтому он предложит вам его, если не указан

ComputerName, компьютер, на котором вы хотите запустить службу. По умолчанию используется localhost, если значение не указано.

Затем мы анализируем эти параметры, чтобы проверить состояние службы - если она работает, то ничего не делается, если что-то еще, то служба будет запущена.

Вы хотели бы вставить этот код в окно Powershell и запустить его или какой-нибудь редактор кода, такой как VS Code, - чтобы функция загружалась в память.

Вы запускаете его, называя его именем:

Restart-RemoteService

Или вы можете передать некоторые параметры, такие как:

Restart-RemoteService -ServiceName bits -ComputerName den-dc1.company.pri -Verbose
0 голосов
/ 03 июля 2018

Это можно сделать с помощью командлета Restart-Service с Powershell Remoting (через WinRM) с помощью Invoke-Command. Обратите внимание, что хотя вы можете использовать конвейер, чтобы получить сервис с Get-Service и направить его на Stop-Service, Start-Service или Restart-Service, в этом нет особой необходимости, и вы можете не вызывайте их напрямую на удаленных серверах:

$Computer1 = Read-Host -Prompt 'Enter the computer name to check Sophos Services'

$Service1 = Read-Host -Prompt 'Enter the service needed to be restarted'
Write-Output "Restarting service ${Service1} on ${Computer1}"
Read-Host -Prompt "Press Enter to continue"

# Restart the service on the remote computer
Invoke-Command -ComputerName $Computer1 -ArgumentList @{ Service1 = $Service1 } -ScriptBlock {
    Restart-Service -Name $args.Service1 -Force
}

Давайте сломаться Invoke-Command

-ComputerName - Имя компьютера / сервера, на котором будет выполняться команда. По умолчанию ваша учетная запись должна быть в группе Administrators или Remote Management Users на сервере, к которому вы хотите подключиться. При необходимости вы можете указать альтернативные учетные данные с аргументом -Credential. В качестве дополнительного бонуса вы можете передать массив компьютеров для запуска одного и того же ScriptBlock за один раз.

-ArgumentList - Массив аргументов для передачи в скрипт. ScriptBlock не сможет разрешить ваши локальные переменные, когда он работает на удаленном компьютере. Обычно вы получаете доступ к каждой переменной как $args[0], $args[1] и т. Д. В порядке, в котором передаются переменные. Мне нравится использовать трюк, который заключается в передаче хэш-карты именованных аргументов, чтобы вы могли получить к ним доступ в более удобочитаемое увлечение, например, как я использую $args.Service1 в ScriptBlock ниже.

-ScriptBlock - Это удаленный код, который вы собираетесь выполнить, лучше всего помещать в объект ScriptBlock, который представлен кодом между двумя фигурными скобками {}. В этом случае мы вызываем Restart-Service на удаленном компьютере.

О Restart-Service Командлет

Я упоминал ранее, что ваш пользователь должен быть хотя бы в группе Remote Management Users на удаленном сервере, чтобы подключиться с помощью Powershell Remoting. Хотя это действительно так, в большинстве сред вам необходимо быть членом группы Administrators на том же удаленном сервере, чтобы также управлять службами, включая запуск и остановку их. Таким образом, для того, чтобы это работало непрерывно, вам нужно быть администратором удаленного блока, на котором вы хотите перезапустить службу.

...