0

これは、オンとオフの数日間私を悩ませてきました。私は、Windows 2008R2 IIS サーバー上で実行されている、社内で作成された特注のサービスを多数持っているクライアント サイトにいます。問題は、これらのサービスのいくつかがハングアップし続け、「停止中」状態でスタックしていることです。これらのサービスを停止するには、プロセス エクスプローラーを開いてスレッドを強制終了するしかありません。「runas」の使用、ローカル管理者、またはサービス所有者としてのログオンなどについて誰かが何かを言う前に、私たちはそのすべてを経験してきました。

問題は実行可能ファイル自体にあります。別の国の開発チームがこれを検討する予定ですが、最低でも 4 ~ 5 か月かかります。

サービスが実行されていることを確認する機能を備えた定期的にサービスをチェックする Powershell スクリプトがあります。実行されていない場合は、サービスの停止と再起動を強制し、アクションを確認するために電子メールを送信します。ただし、言及されているこれらの特定のサービスでは、何もできません。タスクマネージャー、タスクキル、またはプロセスエクスプローラーでそれらを強制終了することはできません(スレッドを強制終了しない限り)、アクセスが拒否されたと表示されるだけです。プロセス エクスプローラーでアクセス許可を変更して強制終了することは可能ですが、スレッドを強制終了するよりも時間がかかります。

このサーバーには、別のフォルダーに同じ名前のexeを使用する2つのWebサイトがあるため、プロセス名を使用することはできません。私が求めているのは、私が持っているスクリプトを介して既に取得したプロセス ID のスレッドを見つけて強制終了する方法です。そのため、スクリプトの残りの部分は、上記のサービスを再起動するタスクを完了できます。現時点では、このサービスは昼夜を問わず一貫性のない状態で停止しており、サポート担当者はサーバーに RDP で接続し、プロセス エクスプローラーを開き、問題のあるプロセスを見つけてスレッドを強制終了し、サービスを再起動する必要があります。特に、powershell に自動的に実行させることができる場合、これらのすでに働きすぎている人にとっては、少し面倒です。

誰かがこれについて助けてくれることを願っています。前もって感謝します。

4

1 に答える 1

1

低レベルのスレッド処理には、ネイティブの Win32 API の使用が必要になる可能性があります。Powershell は P/Invoke に役立つかもしれませんが、プロセスは複雑になります。手始めに、次のツールを使用してスタック スレッドを特定できるかどうかを確認してください。おそらく、この情報を handle.exe などの Sysinternals ツールと組み合わせて、スレッドを実際にブロックしているものを見つけることができます。

System.Diagnostics.Process.Net フレームワークには、名前空間を介して使用できるツールがいくつかあります。名前付きプロセスのスレッドのリストは、次のように利用できます。

$ps = [diagnostics.process]::getProcessesByName("iexplore")
$p = $ps[0]
$p.Threads[0]

完全なドキュメントは MSDN にあります。スレッドを強制終了する方法はありませんが、スタックしているスレッドを特定するための出発点となるはずです。

もう 1 つの方法は、WMI を使用してwin32_threadデータを次のように取得することです。

$threads = gwmi win32_thread

出力はかなり異なり、いくつかのフィルタリングが必要です。いくつかの例が利用可能です。もう 1 つの WMI ソリューションの試みは、メソッドを持つWin32_processに基づいている可能性がありますTerminate

于 2014-01-22T10:33:49.637 に答える