Синхронная остановка удаленной службы с помощью Powershell

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

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

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

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

sc.exe computername stop servicename

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

как синхронно остановить удаленную службу с помощью Powershell?

6
задан zneak
21.11.2022 8:15 Количество просмотров материала 3012
Распечатать страницу

3 ответа

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, который принимает параметр имени компьютера, но не может остановить службу, если эта служба имеет зависимые службы.

4
отвечен Patrick Seymour 2022-11-22 16:03

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

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

Enter-PSSession:

справка

Запускает интерактивный сеанс с удаленным компьютером.

описание

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

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

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

New-PSSession:

справка

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

описание

Командлет New-PSSession создает сеанс Windows PowerShell (PSSession) на локальном или удаленном компьютере. При создании сеанса PSSession Windows PowerShell устанавливает постоянное подключение к удаленному компьютеру.

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

Invoke-Command:

справка

Запускает команды на локальных и удаленных компьютерах.

описание

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

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

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

2
отвечен Ƭᴇcʜιᴇ007 2022-11-22 18:20

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

1
отвечен soandos 2022-11-22 20:37

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх