【问题标题】:Windows Service launching and ExeWindows 服务启动和 Exe
【发布时间】:2012-07-18 19:19:34
【问题描述】:

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

【问题讨论】:

  • 嗨 - “WCF 服务”、“Windows 服务”和“WPF 应用程序”都是完全不同的东西。更重要的是,它们都是完全不同的种类。是的,他们都可以相互交流:有很多方法可以做到这一点。是的,您可以进行设置,以便“事件”(例如,来自 Windows 服务的消息)可以触发“操作”(甚至可能在用户桌面上启动 .exe)。但不是:Windows 服务和 WPF 服务都存在于与用户桌面完全不同的上下文中。我不认为你能做你想做的事。
  • @paulsm4:默认情况下它们存在于不同的上下文中。确实可以授予 Windows 服务与桌面交互的权限。这样做是不明智的。
  • @AngieLeigh:现在你有 10 个代表点 :-)

标签: c# wpf windows-services


【解决方案1】:

您收到此信息是因为尝试启动 WPF 可执行文件的用户没有与桌面交互的权限。

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

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

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

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

【讨论】:

  • 谢谢!我可能无法使用那种确切的方式,但肯定会遵循这些方式。再次感谢:-)
猜你喜欢
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
相关资源
最近更新 更多