26

機能しているように見えるこの1つのライナーに出くわしました:

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

リモート処理を使用するか、ローカルホストで発生しない限り、停止サービスは機能しないと思ったので、誰でも理由を説明できますか。

4

9 に答える 9

43

の出力Get-Serviceは、System.ServiceProcess.ServiceControllerリモート コンピューターで操作できる .NET クラスです。それがどのように達成されるのか、私にはわかりません - おそらく DCOM か WMI でしょう。からこれらのいずれかを取得すると、このオブジェクトのメソッドを呼び出す可能性が最も高いGet-Serviceに渡すことができます。これにより、リモート マシンのサービスが停止します。実際、おそらくこれも同様に実行できます。Stop-ServiceStop()

(get-service -ComputerName remotePC -Name Spooler).Stop()
于 2012-04-26T23:56:20.343 に答える
5

この質問に対する皆さんの貢献のおかげで、次のスクリプトを思いつきました。$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 をインストールする必要がある場合があります。

于 2014-07-09T05:42:07.380 に答える
4

組み込みの Powershell の例に基づいて、これが Microsoft の提案です。テストおよび検証済み:

止まる:

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

始めること:

(Get-WmiObject Win32_Service -filter "name='IPEventWatcher'" -ComputerName Server01).StartService()
于 2014-06-04T15:34:13.523 に答える
2

別のオプション; 使用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

注: このオプションを使用するには、リモート マシンに PowerShell をインストールし、ファイアウォールで要求を通過させ、ターゲット マシンで Windows リモート管理サービスを実行する必要があります。次のスクリプトをターゲット マシンで直接実行することにより、ファイアウォールを構成できます (1 回限りのタスク) Enable-PSRemoting -force

于 2015-03-06T13:52:40.230 に答える
0

あなたもできる(Get-Service -Name "what ever" - ComputerName RemoteHost).Status = "Stopped"

于 2012-11-13T01:38:09.673 に答える
-2

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

変数は変数または文字列-ComputerName remotePCである必要があるため、これは失敗し ます(スプーラーでも同じです)$remotePC"remotePC" -Name Spooler

于 2013-05-23T16:34:49.423 に答える
-6

私の知る限り、今は確認できませんが、Stop-Service コマンドレットまたは .Net を使用してリモート サービスを停止することはできません。サポートされていません。

はい、動作しますが、リモート コンピューターではなく、ローカル コンピューターでサービスが停止します。

上記が正しければ、リモート処理または wmi を有効にせずに、AT を使用してリモート システムでスケジュールされたジョブを設定し、Stop-Service をローカルで実行することができます。

于 2012-04-27T11:22:16.113 に答える