Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Windows服务启动新的UI进程_C#_.net_Winforms_Windows Services - Fatal编程技术网

C# 从Windows服务启动新的UI进程

C# 从Windows服务启动新的UI进程,c#,.net,winforms,windows-services,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)时,我

我有两份申请:

  • 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和会话0是隔离的,我知道由Windows服务调用的每个进程也在会话0中运行,不能有UI

我阅读了所有关于这个主题的文章,我发现,我发现,它描述了我的问题。它使用Win32 API,从winlogon.exe获取实际用户ID并打开exe。我还没有试过,但我想它是有效的(即使在7/10获胜时)

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

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


我的问题是:使用Win32并破坏会话0安全性(更新程序将仅在Windows操作系统上运行)是否是一种“干净的方式”?同时,有没有更好的方法用.Net framework实现这一点?

搜索WTSQueryUserToken,关于这个主题有很多现有的问题。@Harry:最后你看了我的问题了吗?我知道Win32 API的功能…作为一种解决方法(这是我所知道的最“干净的方式”),您可以运行运行UI进程的windows任务。您似乎不知道WTSQueryUserToken,因为您从未提到过它。无论如何,这几乎肯定是一条路要走。不支持从
winlogon.exe
中窃取令牌,并且不会执行您想要的操作。支持使用任务,但不方便。只有WTSQueryUserToken提供了一个干净、受支持、简单的解决方案。@Harry:好的,谢谢。我认为我发布的链接中使用了WTSQueryUserToken。我来看看这个函数。搜索WTSQueryUserToken,这个主题上有很多问题。@Harry:你看过我最后的问题了吗?我知道Win32 API的功能…作为一种解决方法(这是我所知道的最“干净的方式”),您可以运行运行UI进程的windows任务。您似乎不知道WTSQueryUserToken,因为您从未提到过它。无论如何,这几乎肯定是一条路要走。不支持从
winlogon.exe
中窃取令牌,并且不会执行您想要的操作。支持使用任务,但不方便。只有WTSQueryUserToken提供了一个干净、受支持、简单的解决方案。@Harry:好的,谢谢。我认为我发布的链接中使用了WTSQueryUserToken。我来看看这个函数。