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

23

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

<code>stop-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)
</code>

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

Ваш Ответ

8   ответов
34

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

(get-service -ComputerName remotePC -Name Spooler).Stop()
В более новых версиях (3+?) Powershell вы можете получить услугу, а затем использовать ее.WaitForStatus метод Baodad
Примечание: протестировал этот метод, и он делает вызов удаленному хосту, но не ждет остановки службы перед продолжением сценария. Если вы выполните Stop () и Start (), Start (), скорее всего, завершится сбоем, потому что служба еще не остановлена. Просто FYI, если вы хотите сделать больше, чем Stop в вашем сценарии (что выходит за рамки этого вопроса) Jason Coon
@ Hace, если ты делаешь это из партии ... почему бы просто не использовать 'sc <computername> stop <servicename>'? Luigi Mackenzie C. Brito
Просто вопрос PowerShell Я думаю: возможно ли это сделать из командного файла, например, поставить несколько строк для нескольких машин друг за другом (например, .bat) Hace
4

что предлагает Microsoft. Проверено и проверено:

Прекратить

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

Начать

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

но я использовал это как начало. выходы powershell, ожидающие завершения работы службы несколько раз, затем завершающиеся, а затем get-service на удаленном сервере показывает, что служба запущена.

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

(Get-Service -Name "what ever" - ComputerName RemoteHost).Status = "Stopped"

@ StéphaneLacasse, я также назначил его переменной$s = (Get-Service -Computername RemoteHost -Name MyService) а потом просто казнил$s.Stop(). Тогда я сделалWrite-host $($s.Status) и служба все еще работала, но если я подождал 10 секунд, пока служба остановилась, а затем сделал$s=(Get-Service ... а такжеWrite-host $($s.Status) снова вернулся со статусом «Остановлен» Baodad
Это свойство только для чтения: Msdn.microsoft.com / EN-US / библиотека / .... dartonw
хм, забудь об этом. Если сделать get-service снова, он все еще в том же состоянии. Я назначил это переменной и, таким образом, присвоение атрибута статуса работает, но на самом деле он не останавливает службу на удаленном хосте. Сожале Stéphane Lacasse
3

я разработал следующий сценарий. Измените значения на$SvcName а также$SvrName чтобы удовлетворить ваши потребности. Этот скрипт запускает удаленную службу, если она остановлена, или останавливает ее, если она запущена. И он использует крутой.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 на более старый компьютер.

0

Другой вариант; использовать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 на целевом компьютере. Вы можете настроить брандмауэр, запустив следующий скрипт непосредственно на целевом компьютере (один из заданий):Enable-PSRemoting -force.

-2

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

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

-5

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

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

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

Я убедился, что он работает и не останавливает службу на локальном компьютере. Я удивлен, что это не более широко известно / используется. fenster
Я забираю это обратно. оно работает! Я не знал, что ты можешь сделать это Shay Levy

Похожие вопросы