2

ここには、自家製のWindowsサービスがいくつかあります。そのうちの1つは、要求されたときに常に停止するとは限らないという点で問題があります。時々「停止」状態でスタックします。

PowerShellを使用して、そのPIDを取得し、Stop-Processコマンドレットを使用して関連するプロセスを強制終了していますが、それも機能していません。

代わりに、System.ServiceProcess.ServiceController.Name明らかに私たちのサービスではないという名前のサービスについてのメッセージを受け取りますが、それが参照するPIDはそうです。

これが私たちのサービスを停止させるために私たちがしていることです。まず、Get-Serviceコマンドレットを使用します。

$ServiceNamePID = Get-Service -ComputerName $Computer | where { ($_.Status -eq 'StopPending' -or $_.Status -eq 'Stopping') -and $_.Name -eq $ServiceName}

次に、そのServiceNamePIDを使用して、PIDを取得し、それをStop-Processコマンドレットで使用します。

$ServicePID = (get-wmiobject win32_Service -ComputerName $Computer | Where { $_.Name -eq $ServiceNamePID.Name }).ProcessID
Stop-Process $ServicePID -force

Cannot find a process with the process identifier XYZこれは、タスクマネージャーによると、実際にはPID XYZサービスの正しいプロセスIDである場合に、Stop-Processコマンドレットがしゃがむときです。誰かが以前にこのような問題を見たことがありますか?

4

1 に答える 1

5

リモートマシンでプロセスを停止するには、リモート処理を使用します。

 Invoke-Command -cn $compName {param($pid) Stop-Process -Id $pid -force } -Arg $ServicePID

これには、リモートPCでリモート処理を有効にする必要があり、ローカルアカウントにはリモートPCの管理者価格があります。

もちろん、リモーティングを使用したら、リモーティングを使用してスクリプトを実行できます。例:

Invoke-Command -cn $compName {
    $ServiceName = '...'
    $ServiceNamePID = Get-Service | Where {($_.Status -eq 'StopPending' -or $_.Status -eq 'Stopping') -and $_.Name -eq $ServiceName}
    $ServicePID = (Get-WmiObject Win32_Service | Where {$_.Name -eq $ServiceNamePID.Name}).ProcessID
    Stop-Process $ServicePID -Force
}
于 2012-10-03T01:09:34.660 に答える