5

Windows サービスからプロセスを実行し、スクリーンショットを取得する必要があります。

BitBlt と PrintWindow の Win32 呼び出しを試しましたが、どちらも空白 (黒) のビットマップを返します。

通常のユーザー プロセスからコードを実行すると、問題なく動作します。

これは可能なことですか?または、別の方法を試すことができますか?

私たちが試したこと:

  1. ローカル システムとして実行されている Windows サービス、ローカル システムとしてプロセスを実行 -> スクリーンショットが失敗する
  2. 管理者として実行されている Windows サービスは、管理者としてプロセスを実行します -> スクリーンショットが失敗します。
  3. ユーザー XYZ として実行されている Windows アプリケーションは、XYZ としてプロセスを実行します -> スクリーンショットは BitBlt または PrintWindow の両方で動作します。
  4. ローカルシステムから「サービスがデスクトップと対話することを許可する」にチェックを入れてみました

ウィンドウが別のウィンドウの背後にある場合に、PrintWindow がうまく機能することにも気付きました。

その他の要件については、親プロセスと子プロセスの両方が同じユーザーの下にある必要があります。あるプロセスから別のプロセスへの偽装を実際に使用することはできません。

4

4 に答える 4

6

現在、対応するリンクが見つかりませんが、問題は、Windows サービスが通常のユーザー アプリケーションとは別のセッションで実行されることです。

XP では、これは完全には当てはまりませんでした。ここでは、すべてのサービスがセッション 0 で開始され、システムにログインした最初のユーザーもセッション 0 で実行されます。その場合、デスクトップとの対話をサービスに許可するなどのトリックが機能します。しかし、別のユーザーにすばやく切り替えた場合、彼はセッション 1 を取得し、サービスと直接やり取りする機会がありません。これは、RDP を介してサーバー バージョン (2003 または 2008 など) に接続する場合にも当てはまります。これらのログインは、0 より大きいセッションでも開始されます。

最後になりましたが、デスクトップとの対話を使用することには別の欠点があります。
このオプションを有効にし、サービスが (デフォルトの) SYSTEM アカウントで実行されている場合、ネットワーク接続を作成できなくなります。

サービスで動作するカスタム GUI を取得する正しい方法は、それらを 2 つのプロセスに分割し、ある種の IPC (プロセス間通信) を行うことです。そのため、マシンが起動するとサービスが開始され、ユーザー セッションで GUI アプリケーションが開始されます。その場合、GUI はスクリーンショットを作成し、それをサービスに送信することができ、サービスはそれを好きなように処理できます。

于 2010-05-19T09:02:25.630 に答える
4

「デスクトップとの対話をサービスに許可する」にチェックを入れて、ローカル システムとして実行しようとしましたか?

于 2009-09-18T17:15:18.653 に答える
3

これは不可能だと思います。

アプリケーションがサービスから開始されたのではなく、隅にNotifyIconがある標準のWindowsプログラムであるというシナリオを変更する必要がありました。

それでも誰かが本当の答えを見つけたら、私に知らせてください。

于 2009-09-23T16:16:37.260 に答える
-1

「デスクトップとの対話をサービスに許可する」でローカルシステムを使用して動作します

次のサンプル コードを使用して、プログラムで設定できます。

http://www.vbforums.com/showthread.php?t=367177 (vb.net ですが、とてもシンプルです)

于 2010-05-19T08:04:04.663 に答える