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 应用程序发出需要显示消息的信号。一种简单的机制是将文件写入约定的位置并使用 WPF 应用程序中的文件观察程序来查找该文件(并在显示后将其删除)。请注意,Windows 服务可能在用户登录之前很久(在 WPF 应用程序运行之前很久)就已经运行了,因此无论您使用什么通知机制,都需要允许消息在登录后累积并立即显示。

于 2012-07-18T19:22:49.197 回答