2

ローカル システム アカウントで実行される .NET Windows サービスがあります。次に、このサービスは、COM 相互運用機能を使用して、Visual Studio 6 上の ATL で記述された COM コンポーネントを実行します。この COM コンポーネントは、SYSTEM アカウントで実行されます。別のアカウントになりすますことができることはわかっていますが、今のところはそのままにしておきたいと思います。

問題は、Windows サービスが停止した後も COM コンポーネントが実行されたままになることです。プロセスを強制終了することもできません。タスク マネージャーはそれを強制終了しないので、コマンド ラインから TaskKill を試しました。これは、プロセスが正常に終了したとさえ言っていますが、タスクマネージャーを確認すると、まだ実行中です。PSKill を試しましたが、アクセスが拒否されたと表示されます。

これに対する解決策を探してGoogleを使い果たしました。誰でも助けることができますか?

また、とにかく実行し続けるのはなぜですか?

4

1 に答える 1

3

プロセスの強制終了は、パーミッションの問題です。UAC がオンになっている Vista/7 を想定すると、管理者として実行していない場合、システム プロセスを強制終了することはできません。注 - ローカル管理者グループのメンバーになるだけでは十分ではありません。管理者権限で実際に実行するには、「管理者として実行」を使用してタスクマネージャー/プロセスエクスプローラー/ pskillなどを起動する必要があります。それ以外の場合は、通常のユーザーであり、拒否されます。

COMサーバーが固執する場合:COMサーバーには参照カウントがあり、カウントが0に下がった後にのみシャットダウンします。あなたの場合、サーバーはいくつかの理由でシャットダウンしない可能性があります:

  1. クライアントは、COM サーバーによって作成されたすべてのインスタンスを適切に解放していません。私は .NET プログラマーではないので、これが自分で処理する必要があるのか​​、それともガベージ コレクションによって処理されるのかはわかりません。クラッシュまたは外部終了の結果として、適切にクリーンアップせずにサービスが終了した場合、確実にその問題が発生します。
  2. サーバーは、作成者が念頭に置いていた理由が何であれ、内部で参照カウントを増やす可能性があります。これは、サーバーのバグである可能性さえあります。
  3. IIRC、COM は、アクティブなクライアントがなくても、サーバーをしばらく実行したままにすることがあります。その場合、サーバーは数分後にシャットダウンします。
于 2011-09-06T13:07:52.523 に答える