2

私はマイクロソフトの世界に少し慣れていません。この回答と他の多くのリンクを読みましたが、Vista以降は、Windowsサービスがデスクトップと対話できないことを認識しています。

ただし、緊急事態が発生したため、回避策をすばやく見つける必要があります。どういうわけかURLでブラウザを開くには、Windowsサービスが必要です(今のところ、どんな種類の醜いハックでもかまいません)。答えは次のように述べています。

別のエージェントアプリケーションを作成する必要があります。このアプリケーションは、ユーザーのログイン時に自動的に開始され、サービスが通信します。その後、エージェントはブラウザを起動するか、必要なことを何でも行うことができます。

誰かが私にこれを簡単な方法で行う方法を説明してもらえますか?そのサービスはこの「エージェント」とどのように通信しますか?この「エージェント」とは正確には何ですか?

リンクや提案をいただければ幸いです。

編集:現在。私のサービスは次のコードを実行しようとします:System.Diagnostics.Process.Start("www.google.com");

後でわかりましたが、機能しません

4

4 に答える 4

5

はい、サービスからデスクトップでコードを実行できます...問題はどのデスクトップにありますか?さまざまなユーザーが同時にログに記録される可能性があるためです(たとえば、Windows Serverでは、さまざまなユーザーがリモートでログに記録される可能性があります)。

例のようにサービスから使用するProcess.Start場合:

System.Diagnostics.Process.Start("www.google.com");

サービスはユーザーのどのデスクトップにも関連付けられていないため、プログラムはどのユーザーのデスクトップにも表示されません。


解決策は、ローカルでログに記録されているユーザーを検出し、そのユーザーとして(およびそのユーザーの権限で)プログラムを実行することです。そのために、サービスからプログラムを呼び出す方法を示す別の回答にリンクしたいと思います。その回答では、この手法に必要なコードを示しています。

:その答えはスクリーンキャプチャに関するものでしたが、それでも私が説明する手法は、ユーザーのセッションでプログラムを呼び出すことであり、そのメソッドはサービスから機能します。だからそれはあなたの問題に当てはまります。

このメソッドを使用して、目的のブラウザーを直接実行できます。別の方法として、これを使用してサービス実行可能ファイルを呼び出すことができます。このSystem.Environment.UserInteractive場合、実行可能ファイルがサービスとして実行されていないかどうかを検出するために使用できます。実行可能ファイルに実行引数としてURLを渡すと、Process.Start上記の例と同じように、デフォルトのブラウザーでURLを開くことができます。

:コードはWindows7でテストされています。

于 2013-03-24T06:41:40.887 に答える
4

これを行うための「迅速な方法」はありません、私は恐れています。(また、サービスはユーザーのデスクトップと対話できないため、ブラウザーを起動できたとしても、ユーザーはそれを見ることができませんでした。)

あなたが言及した「エージェントアプリケーション」は、ログイン時にユーザーのデスクトップの下で実行される完全に別個のアプリケーションです。サービスと通信するには、プロセス間通信の何らかの方法(名前付きパイプ、TCP / IPなど)を使用する必要があります。

サービスがデスクトップと相互作用しない理由は、セキュリティ上の理由によるものです。利用可能な「迅速な回避策」はなく、あるべきではありません。また、その変更を回避するための「簡単な方法」はありません(また、そうすべきではありません。簡単な方法でセキュリティを回避できれば、セキュリティはそれほど高くありません)。

于 2013-03-24T06:36:21.023 に答える
2

http://www.pinvoke.net/default.aspx/shell32.shellexecuteを使用して使用shellexecuteしますpinvoke

C# Signature:
public enum ShowCommands : int
{
    SW_HIDE         = 0,
    SW_SHOWNORMAL       = 1,
    SW_NORMAL       = 1,
    SW_SHOWMINIMIZED    = 2,
    SW_SHOWMAXIMIZED    = 3,
    SW_MAXIMIZE     = 3,
    SW_SHOWNOACTIVATE   = 4,
    SW_SHOW         = 5,
    SW_MINIMIZE     = 6,
    SW_SHOWMINNOACTIVE  = 7,
    SW_SHOWNA       = 8,
    SW_RESTORE      = 9,
    SW_SHOWDEFAULT      = 10,
    SW_FORCEMINIMIZE    = 11,
    SW_MAX          = 11
}

[DllImport("shell32.dll")]
static extern IntPtr ShellExecute(
IntPtr hwnd,
string lpOperation,
string lpFile,
string lpParameters,
string lpDirectory,
ShowCommands nShowCmd);





 // Asks default mail client to send an email to the specified address.
    ShellExecute( IntPtr.Zero, "open", "mailto:support@microsoft.com", "", "", ShowCommands.SW_SHOWNOACTIVATE    );

    // Asks default browser to visit the specified site.
    ShellExecute( IntPtr.Zero, "open", "http://channel9.msdn.com", "", "", ShowCommands.SW_SHOWNOACTIVATE );

    // Opens default HTML editing app to allow for edit of specified file
    ShellExecute( IntPtr.Zero, "edit", @"c:\file.html", "", "", ShowCommands.SW_SHOWNOACTIVATE );
   //Modified by Aljaz: Replaced the last zero in these calls with 4  otherwise it wouldn't show anything
   // 0 stands for SW_HIDE contant, which means execute but don't show the window which is probably not 
   // what we want.
于 2013-03-24T06:50:08.873 に答える
1

緊急が必要な場合は、サービスからMSMQにメッセージを入れて、キューメッセージを待機している単純なクライアントを作成して続行します。
更新:
実際、非常に高速なものが必要な場合は、ファイルに書き込んだり、単純なデスクトップ(winforms?)アプリケーションを作成してプール内のこのファイルを読み取ったり(5秒ごと?)、必要に応じてブラウザーを開いたりすることもできます。

于 2013-03-24T06:39:28.177 に答える