1

Windows サービスとして (localsystem として) 実行されているアプリケーションが、シャットダウン画面や UAC 警告画面に似たモーダル警告を表示する機能を実装しようとしています。基本的に、気づかずに却下できないもの

実装方法がわからないことが2つあります。

  1. Windows Vista 以降では、アプリケーションがシステム モーダル ウィンドウを生成できなくなっていることを理解しています。それをバイパスすることは可能ですか?それを行う簡単な方法はありますか? 私が考えることができる唯一の代替手段は、全画面ウィンドウを開き、alt + tab、ctrl + alt + delなどをインターセプトすることです

  2. また、別のセッションで実行されるため、サービスからユーザー セッションで UI を表示することはできないと思います。それをバイパスできるハックはありますか?考えられることの 1 つは、特定のセッションで実行されている csrss.exe または winlogon.exe にコードを見つけて挿入し、リモート スレッドを呼び出すことです。もう 1 つの方法は、winlogon および CreateProcessAsUser() へのハンドルを取得することです。別の簡単な方法はありますか?

4

2 に答える 2

1
  1. 「システムモーダルウィンドウ」の意味がわかりません。ログイン画面でもユーザーに表示されるメッセージですか?

  2. レジストリで UserInteractive が true に設定されていても、Vista 以降ではサービスから Windows GUI へのアクセスが許可されません。これにはいくつかの方法があります。私が行う方法は、バックグラウンドで (サービスとしてではなく、継続的なプロセスとして) 実行される単純なヘルパー アプリケーションを使用することです。簡単に接続して送信できます。必要に応じて、より具体的な例を投稿できますが、ここでは、これを実装する方法を段階的に説明します (この例では .NET Remoting を使用しますが、どの IPC ソリューションにも同じ基本原則が適用されるはずです)。あなたが使う):

    1. IPC プロトコルを使用して、(サービスとしてではなく、継続的なプロセスとして) .NET リモート サーバーとして機能するプログラムを作成します。リモート可能なインターフェイスには、新しいデータを受け入れるためのメンバーが少なくとも 1 つ含まれている必要があります。ほとんどの場合、文字列は問題なく機能します。実装されたクラスは、新しいメッセージを継続的に処理できる必要もあります。
    2. 手順 1 で実装したリモート インターフェイスを使用してサービスに接続し、表示するメッセージを IPC サーバーに送信します。
    3. IPC サービスは、このメッセージを処理し、好みの手段を使用してユーザーに表示するか、ユーザーにメッセージを表示する必要があります。個人的には、別のスレッドでモーダル フォームを使用して、エンド ユーザーが必要に応じてメッセージをコピーできるようにしています。
于 2013-05-21T15:33:16.733 に答える