我有两个应用程序:
我想实现,我的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框架?