3

У меня есть собственный сценарий развертывания, написанный на Powershell. Этот сценарий должен обновлять службу на удаленном компьютере, и поэтому он должен сначала остановить его, чтобы иметь возможность изменять исполняемые файлы.

Это кажется проблемой.

Чтобы синхронно остановить службу, я могу использовать имя net stop servicename или имя stop-service servicename . Проблема в том, что эти две команды ограничены локальной машиной.

Я знаю, что для остановки службы на удаленной машине я могу использовать программу sc.exe :

sc.exe \\computername stop servicename

Но это асинхронно, так что я не могу по-настоящему использовать его (ну, похоже, sleep 5 делает это, но это довольно грязно).

Как я могу синхронно остановить удаленный сервис с помощью Powershell?

3 ответа3

4

Get-Service возвращает объект ServiceController , который затем можно использовать для управления сервисом. Неважно, локально это или удаленно. У меня есть сценарий ниже, чтобы остановить службу диспетчера очереди печати (Print Spooler) и ждать, пока он остановится, до 5 секунд. Я просто добавил параметр -Name в Get-Service и смог остановить спулер на удаленном сервере.

Примечание: оба сервера в моем случае были Server 2008 R2. Ваш пробег может отличаться.

Set-StrictMode -Version "2.0"

[System.ServiceProcess.ServiceController]$service = Get-Service -Name "Spooler" -ComputerName "remote_server.domain.com"

[int]$waitCount = 5
do
{
    $waitCount--

    switch($service.Status)
    {
        { @(
        [System.ServiceProcess.ServiceControllerStatus]::ContinuePending,
        [System.ServiceProcess.ServiceControllerStatus]::PausePending,
        [System.ServiceProcess.ServiceControllerStatus]::StartPending,
        [System.ServiceProcess.ServiceControllerStatus]::StopPending) -contains $_ }
        {
            # A status change is pending. Do nothing.
            break;
        }

        { @(
        [System.ServiceProcess.ServiceControllerStatus]::Paused,
        [System.ServiceProcess.ServiceControllerStatus]::Running) -contains $_ }
        {
            # The service is paused or running. We need to stop it.
            $service.Stop()
            break;
        }

        [System.ServiceProcess.ServiceControllerStatus]::Stopped
        {
            # This is the service state that we want, so do nothing.
            break;
        }
    }

    # Sleep, then refresh the service object.
    Sleep -Seconds 1
    $service.Refresh()

} while (($service.Status -ne [System.ServiceProcess.ServiceControllerStatus]::Stopped) -and ($waitCount -gt 0))

Существует также Set-Service, которая будет принимать параметр имени компьютера, но, похоже, не сможет остановить службу, если эта служба имеет зависимые службы.

2

PowerShell 2 добавил много вещей для доступа к удаленным компьютерам с его помощью.

Вот несколько полезных командлетов (информация из get-help PowerShell):

Enter-PSSession:

СИНТАКСИС
Запускает интерактивный сеанс с удаленным компьютером.

ОПИСАНИЕ
Командлет Enter-PSSession запускает интерактивный сеанс с одним удаленным компьютером. Во время сеанса вводимые команды выполняются на удаленном компьютере, как если бы вы печатали непосредственно на удаленном компьютере. У вас может быть только один интерактивный сеанс за раз.

Как правило, вы используете параметр ComputerName, чтобы указать имя удаленного компьютера. Однако вы также можете использовать сеанс, который вы создаете, используя New-PSSession для интерактивного сеанса.

Чтобы завершить интерактивный сеанс и отключиться от удаленного компьютера, используйте командлет Exit-PSSession или введите "выход".

New-PSSession:

СИНТАКСИС
Создает постоянное соединение с локальным или удаленным компьютером.

ОПИСАНИЕ
Командлет New-PSSession создает сеанс Windows PowerShell (PSSession) на локальном или удаленном компьютере. Когда вы создаете сеанс PSSession, Windows PowerShell устанавливает постоянное соединение с удаленным компьютером.

Используйте сеанс PSSession для запуска нескольких команд, которые совместно используют данные, например функцию или значение переменной. Для запуска команд в сеансе PSSession используйте командлет Invoke-Command. Чтобы использовать PSSession для непосредственного взаимодействия с удаленным компьютером, используйте командлет Enter-PSSession. Для получения дополнительной информации см. About_PSSessions.

Invoke-Command:

СИНТАКСИС
Запускает команды на локальных и удаленных компьютерах.

ОПИСАНИЕ
Командлет Invoke-Command выполняет команды на локальном или удаленном компьютере и возвращает все выходные данные команд, включая ошибки. С помощью одной команды Invoke-Command вы можете запускать команды на нескольких компьютерах.

Чтобы запустить одну команду на удаленном компьютере, используйте параметр ComputerName. Чтобы запустить ряд связанных команд, которые совместно используют данные, создайте PSSession (постоянное соединение) на удаленном компьютере, а затем используйте параметр Session в Invoke-Command для запуска команды в PSSession.

Больше информации: Эй, сценарист!Расскажите об удаленном взаимодействии в Windows PowerShell 2.0

1

Я хотел бы посмотреть на что-то вроде PsExec. Он выполнит net stop на удаленной машине и, таким образом, получит синхронную часть, но это можно сделать удаленно (в этом и заключается точка PsExec).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .