機能しているように見えるこの1つのライナーに出くわしました:
stop-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)
リモート処理を使用するか、ローカルホストで発生しない限り、停止サービスは機能しないと思ったので、誰でも理由を説明できますか。
機能しているように見えるこの1つのライナーに出くわしました:
stop-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)
リモート処理を使用するか、ローカルホストで発生しない限り、停止サービスは機能しないと思ったので、誰でも理由を説明できますか。
の出力Get-Service
は、System.ServiceProcess.ServiceController
リモート コンピューターで操作できる .NET クラスです。それがどのように達成されるのか、私にはわかりません - おそらく DCOM か WMI でしょう。からこれらのいずれかを取得すると、このオブジェクトのメソッドを呼び出す可能性が最も高いGet-Service
に渡すことができます。これにより、リモート マシンのサービスが停止します。実際、おそらくこれも同様に実行できます。Stop-Service
Stop()
(get-service -ComputerName remotePC -Name Spooler).Stop()
この質問に対する皆さんの貢献のおかげで、次のスクリプトを思いつきました。$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 をインストールする必要がある場合があります。
組み込みの Powershell の例に基づいて、これが Microsoft の提案です。テストおよび検証済み:
止まる:
(Get-WmiObject Win32_Service -filter "name='IPEventWatcher'" -ComputerName Server01).StopService()
始めること:
(Get-WmiObject Win32_Service -filter "name='IPEventWatcher'" -ComputerName Server01).StartService()
別のオプション; 使用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
。
あなたもできる(Get-Service -Name "what ever" - ComputerName RemoteHost).Status = "Stopped"
stop-service -inputobject $(get-service -ComputerName remotePC -Name Spooler)
変数は変数または文字列-ComputerName remotePC
である必要があるため、これは失敗し
ます(スプーラーでも同じです)$remotePC
"remotePC"
-Name Spooler
私の知る限り、今は確認できませんが、Stop-Service コマンドレットまたは .Net を使用してリモート サービスを停止することはできません。サポートされていません。
はい、動作しますが、リモート コンピューターではなく、ローカル コンピューターでサービスが停止します。
上記が正しければ、リモート処理または wmi を有効にせずに、AT を使用してリモート システムでスケジュールされたジョブを設定し、Stop-Service をローカルで実行することができます。