Подтвердить что ты не робот

Использование Powershell для остановки службы удаленно без WMI или удаленного доступа

Я столкнулся с этим одним лайнером, который работает:

stop-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)

Может кто-нибудь объяснить, почему, потому что я думал, что стоп-сервис не работает, если вы не использовали удаленный доступ или не произошли на локальном хосте.

4b9b3361

Ответ 1

Вывод Get-Service - это класс System.ServiceProcess.ServiceController.NET, который может работать на удаленных компьютерах. Как это достигается, я не знаю - возможно, DCOM или WMI. После того как вы получили один из них из Get-Service, его можно передать в Stop-Service, который, скорее всего, просто вызывает метод Stop() для этого объекта. Это останавливает службу на удаленной машине. На самом деле вы, вероятно, тоже могли бы это сделать:

(get-service -ComputerName remotePC -Name Spooler).Stop()

Ответ 2

Основываясь на встроенных примерах Powershell, это то, что предлагает Microsoft. Протестировано и проверено:

Чтобы остановить:

(Get-WmiObject Win32_Service -filter "name='IPEventWatcher'" -ComputerName Server01).StopService()

Чтобы начать:

(Get-WmiObject Win32_Service -filter "name='IPEventWatcher'" -ComputerName Server01).StartService()

Ответ 3

Благодаря всем вкладам в этот вопрос, я придумал следующий script. Измените значения для $SvcName и $SvrName в соответствии с вашими потребностями. Этот script запустит удаленный сервис, если он остановлен, или остановите его, если он запущен. И он использует классный .WaitForStatus метод ожидания, пока служба отвечает.

#Change this values to suit your needs:
$SvcName = 'Spooler'
$SvrName = 'remotePC'

#Initialize variables:
[string]$WaitForIt = ""
[string]$Verb = ""
[string]$Result = "FAILED"
$svc = (get-service -computername $SvrName -name $SvcName)
Write-host "$SvcName on $SvrName is $($svc.status)"
Switch ($svc.status) {
    'Stopped' {
        Write-host "Starting $SvcName..."
        $Verb = "start"
        $WaitForIt = 'Running'
        $svc.Start()}
    'Running' {
        Write-host "Stopping $SvcName..."
        $Verb = "stop"
        $WaitForIt = 'Stopped'
        $svc.Stop()}
    Default {
        Write-host "$SvcName is $($svc.status).  Taking no action."}
}
if ($WaitForIt -ne "") {
    Try {  # For some reason, we cannot use -ErrorAction after the next statement:
        $svc.WaitForStatus($WaitForIt,'00:02:00')
    } Catch {
        Write-host "After waiting for 2 minutes, $SvcName failed to $Verb."
    }
    $svc = (get-service -computername $SvrName -name $SvcName)
    if ($svc.status -eq $WaitForIt) {$Result = 'SUCCESS'}
    Write-host "$Result`: $SvcName on $SvrName is $($svc.status)"
}

Конечно, для учетной записи, которой вы ее запускаете, понадобятся правильные привилегии для доступа к удаленному компьютеру и запуска и остановки служб. И, выполняя это на старых удаленных компьютерах, вы, возможно, сначала должны установить WinRM 3.0 на более старую машину.

Ответ 4

Это сработало для меня, но я использовал его как начало. выходы PowerShell, ожидая, что услуга начнется несколько раз, а затем завершается, а затем служба-получатель на удаленном сервере показывает, что служба запущена.

**start**-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)

Ответ 5

Вы также можете сделать (Get-Service -Name "what ever" - ComputerName RemoteHost).Status = "Stopped"

Ответ 6

Другой вариант; используйте invoke-command:

cls
$cred = Get-Credential
$server = 'MyRemoteComputer'
$service = 'My Service Name' 

invoke-command -Credential $cred -ComputerName $server -ScriptBlock {
    param(
       [Parameter(Mandatory=$True,Position=0)]
       [string]$service
    )
    stop-service $service 
} -ArgumentList $service

NB: для использования этой опции вам понадобится PowerShell для установки на удаленном компьютере и для брандмауэра разрешить запросы через и для службы удаленного управления Windows на рабочем компьютере. Вы можете настроить брандмауэр, запустив следующий script непосредственно на целевой машине (одна задача): Enable-PSRemoting -force.

Ответ 7

stop-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)

Это не удается из-за ваших переменных -ComputerName remotePC должна быть переменная $remotePC или строка "remotePC" -Name Spooler (то же самое для буферизации)

Ответ 8

Насколько я знаю, и я не могу проверить его сейчас, вы не можете остановить удаленные службы с помощью командлета Stop-Service или с .Net, он не поддерживается.

Да, он работает, но он останавливает службу на вашем локальном компьютере, а не на удаленном компьютере.

Теперь, если приведенное выше верно, без возможности удаленного доступа или wmi, вы можете установить запланированное задание в удаленной системе, используя AT, который запускает Stop-Service локально.