c# – Windows服务启动和Exe

我目前正在开发一个包含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应用程序在当前用户的会话或“活动”会话中启动?

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

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

In most cases, it is recommended that you not change the Allow service to interact with desktop setting. If you allow the service to interact with the desktop, any information that the service displays on the desktop will also be displayed on an interactive user’s desktop. A malicious user could then take control of the service or attack it from the interactive desktop.

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

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

转载注明原文:c# – Windows服务启动和Exe - 代码日志