从Windows服务

时间:2017-02-10 10:38:38

标签: c# .net winforms windows-services

我有两个应用程序:

  • UpdaterService.exe(Windows服务)
  • Updater.exe(UI应用程序)

我想实现,我的Windows服务调用我的UI应用程序。我试过了:

Process p = new Process();
p.StartInfo.FileName = completePath;
p.StartInfo.WorkingDirectory = workingDirectory;
p.Start();

这很有效,但是当我调用UI元素(例如MessageBox)时,我得到一个InvalidOperationException。

我能做到:

p.StartInfo.UserName = userName;
p.StartInfo.Password = password;

但我没有为每个用户提供凭据,因此无法解决问题。

自Windows Vista和Session 0 Isolation以来,我了解Windows服务调用的每个进程也在会话0中运行,并且无法使用UI。

我读到了我找到的这个主题的所有文章,我找到了this article,它描述了我的问题。它使用Win32-API,从winlogon.exe获取实际用户ID并打开exe。我还没有尝试过,但我猜它有效(即使在Win 7/10中)。

我的服务和UI应用程序不需要任何类型的通信,它应该使用登录的实际用户帐户调用exe。

我认为从服务中打开UI-exe并不罕见,因为其他公司(如Adobe)以相同的方式进行更新。

我的问题是:这是一种“清洁方式”吗?使用Win32并破坏Session 0安全性(更新程序只能在Windows操作系统上运行)?有没有更好的方法来实现.Net框架?

0 个答案:

没有答案