Windows服务启动和Exe

时间:2012-07-18 19:19:34

标签: c# wpf windows-services

我目前正在开发一个包含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应用程序不在当前用户的会话中执行。相反,我得到一个弹出窗口来查看该消息。这是它的图片:

enter image description here

选择“查看邮件”选项后,它当然会将我切换到另一个会话,然后运行WPF应用程序。

我的问题是,如何让WPF应用程序在当前用户的会话或“活动”会话中启动?

1 个答案:

答案 0 :(得分:7)

您之所以这样,是因为尝试启动WPF可执行文件的用户没有与桌面交互的权限。

Windows服务通常不会在具有该权限的帐户下运行,并且会被视为安全漏洞。

  

在大多数情况下,建议您不要更改允许服务与桌面交互设置。如果您允许服务与桌面交互,则服务在桌面上显示的任何信息也将显示在交互式用户的桌面上。然后恶意用户可以控制服务或从交互式桌面攻击它。

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

更安全的替代方法是让WPF应用程序始终在系统托盘中运行,并为Windows服务安排一种机制,以向WPF应用程序发出需要显示消息的信号。一个简单的机制是将文件写入约定的位置,并使用WPF应用程序中的文件观察器来查找该文件(并在显示后将其删除)。请注意,Windows服务可能在用户登录之前很久就会运行(早在WPF应用程序运行之前),因此您使用的任何通知机制都需要允许消息累积并在登录后立即显示。