4

現在、WCF サービス、Windows サービス、および WPF アプリケーションを含むプロジェクトに取り組んでいます。Windows サービスは WCF と通信し、特定の状況下では、ユーザーがメッセージを受信できるように WPF アプリケーションを起動する必要があります。(WCF はリモート サーバー上にあり、残りはクライアント上にあります)。私は打ち上げでちょっとした障害にぶつかりました。途中で多少「デバッグ」できるように、サービスがアプリケーションログにメッセージを書き込んでいます。Windows サービスは、次のコードを問題なく実行します。

C# コード、Windows サービス:

WriteLog.WriteString("PostOffice.MessagesWaiting: Inside, starting up.", EventLogEntryType.Warning);
// Call the WPF Application
var messagingProcess = new Process();
var messageProcessStartInfo = new ProcessStartInfo(@"""C:\GoldenEyeMessages.exe""");
messageProcessStartInfo.CreateNoWindow = false;
messageProcessStartInfo.UseShellExecute = false;
messageProcessStartInfo.FileName = @"""C:\GoldenEyeMessages.exe""";
messageProcessStartInfo.WindowStyle = ProcessWindowStyle.Normal;
messageProcessStartInfo.Verb = "runas";

messageProcessStartInfo.RedirectStandardOutput = true;
messagingProcess.StartInfo = messageProcessStartInfo;
messagingProcess.Start();
StreamReader daStreamReaderMan = messagingProcess.StandardOutput;
string newString = daStreamReaderMan.ReadLine();

WriteLog.WriteString("PostOffice.MessagesWaiting: The Eagle has landed.", EventLogEntryType.Warning);

WPF アプリケーションは、現在のユーザーのセッションでは実行されません。代わりに、メッセージを表示するポップアップが表示されます。これがその写真です:

ここに画像の説明を入力

「メッセージを表示する」オプションを選択すると、もちろん別のセッションに切り替わり、WPF アプリケーションが実行されます。

私の質問は、現在のユーザーのセッションまたは「アクティブな」セッション内で WPF アプリケーションを起動するにはどうすればよいですか?

4

1 に答える 1

7

これは、WPF 実行可能ファイルを起動しようとしているユーザーがデスクトップと対話する権限を持っていないためです。

通常、Windows サービスは、そのアクセス許可を持つアカウントでは実行されず、これを行うことはセキュリティ上の脆弱性と見なされます。

ほとんどの場合、[デスクトップとの対話をサービスに許可する] 設定を変更しないことをお勧めします。サービスがデスクトップと対話できるようにすると、サービスがデスクトップに表示する情報は、対話ユーザーのデスクトップにも表示されます。その後、悪意のあるユーザーがサービスを制御したり、対話型デスクトップから攻撃したりする可能性があります。

http://technet.microsoft.com/en-us/library/cc782435(v=ws.10).aspx

より安全な代替手段は、WPF アプリケーションを常にシステム トレイで実行し、メッセージを表示する必要があることを Windows サービスが WPF アプリケーションに通知するメカニズムを配置することです。簡単なメカニズムの 1 つは、合意された場所にファイルを書き込み、WPF アプリでファイル ウォッチャーを使用してそのファイルを検索する (表示後に削除する) ことです。Windows サービスは、ユーザーがログインするずっと前 (WPF アプリが実行されるずっと前) に実行されている可能性があることに注意してください。そのため、どのような通知メカニズムを使用する場合でも、メッセージが蓄積され、ログイン後にすぐに表示されるようにする必要があります。

于 2012-07-18T19:22:49.197 に答える