1

Local System ユーザーとして実行するサービスを作成しました。このサービスは、ネイティブ相互運用機能と CreateProcessAsUser() メソッド (ローカル システムではなく、現在ログインしているユーザーとしてアプリケーションを実行するため) を使用して、Silverlight Out-of-browser アプリケーションを起動および監視します。生成されたプロセスのハンドルを取得し、それを Kill() することはできますが、サービスが子アプリケーションのメイン ウィンドウへのハンドルを取得できないことに気付きました。別のユーザーとして実行しています。私はWindows 7で実行しています。

私の最終的な目標は、プロセスが応答を停止したとき (つまり、Process.Responding == false) に適切に応答して、アプリケーションを強制終了して再起動できるようにすることです。ただし、Process.Responding にはプロセスのメイン ウィンドウへのハンドル (正確には Process.MainWindowHandle) が必要ですが、このシナリオでは、Process.MainWindowHandle は常に 0 を返します。

私はここで困惑しています。Win 7 で、あるユーザーが別のユーザーとして実行されているプロセスへのウィンドウ ハンドルを取得する方法はありますか?

あらゆる助けを前もって感謝します。

4

1 に答える 1

2

いいえ、それは不可能です。Windows サービスは、セキュリティ上の理由から、ユーザー モード アプリケーションから完全に分離されています。ウィンドウのハンドルを取得できた場合、そのウィンドウを操作したり操作したりできるため、セキュリティ上の大きな脆弱性が残ることになります。

詳細については、次を参照してください。

厳密に言えば、そもそも Windows サービスを使用しているの設計が悪いからです。ユーザーモードのプロセスを作成または起動したりユーザーと対話したりしないでください。ユーザーがログインしていなくても、サービスは実行されることに注意してください。したがって、アプリケーションを起動するべきではありません。

より良い解決策は、ユーザーがログインしたときに自動的に起動するように設定された単純なバックグラウンド アプリケーションです。このバックグラウンド アプリケーションは、Silverlight アプリケーションを起動し、その状態を監視し、必要に応じて対話することができます。同じローカル ユーザー アカウント。効果はサービスに似ていますが、分離の欠点はありません。Visual Studio でこれを行う最も簡単な方法は、単にフォーム/ウィンドウを表示しない WinForms アプリケーション (または、おそらく WPF アプリケーション、その分野での経験が少ない) を作成することです。

于 2011-04-18T04:50:13.600 に答える