2012-07-18 145 views
4

我目前正在研究一个包含WCF服务,Windows服务和WPF应用程序的项目。 Windows服务与WCF通信,并且在某些情况下,必须启动WPF应用程序以供用户接收消息。 (WCF在远程服务器上,其余的在客户端上)。发射时我遇到了一些障碍。我有服务将消息写入应用程序日志,以便我可以在某种程度上“调试”。 Windows服务运行下面的代码没有问题。Windows服务启动和Exe

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应用程序在当前用户会话或“活动”会话内启动?

+0

嗨 - “WCF服务”,“Windows服务”和“WPF应用程序”都是完全不同的东西。更重要的是,它们都是完全不同的*种类*的东西。是的,他们都可以互相沟通:有很多方法可以做到这一点。是的,你可以进行设置,以便“事件”(例如,来自Windows服务的消息)可以触发“操作”(甚至可能在用户的桌面上启动.exe)。但是否:Windows服务和WPF服务都存在于与用户桌面完全不同的环境中。我不认为你可以做你想做的事。 – paulsm4 2012-07-18 19:26:34

+0

@ paulsm4:*默认情况下*它们存在于不同的上下文中。人们确实可以授予Windows服务权限与桌面进行交互。这样做并不明智。 – 2012-07-18 19:29:58

+0

@AngieLeigh:现在你有10个重点:-) – 2012-07-18 19:33:10

回答

7

因为试图启动WPF可执行文件的用户没有与桌面进行交互的权限,所以您正在获取该文件。

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

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

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

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

+0

谢谢!我可能无法使用这种确切的方式,但肯定会沿着这些方向。再次感谢:-) – AngieLeigh 2012-07-20 16:54:29

+0

很高兴帮助... – 2012-07-20 17:04:53