Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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服务加载GUI应用程序_C#_Windows_Service_Launching Application - Fatal编程技术网

C# 从Windows服务加载GUI应用程序

C# 从Windows服务加载GUI应用程序,c#,windows,service,launching-application,C#,Windows,Service,Launching Application,我正在编写一个.NET Windows服务,其角色是启动GUI应用程序(其源代码不可用)。 该操作是一个火灾后遗忘操作,除了初始命令行参数外,没有通信 该服务应作为给定的Windows帐户运行 问题:服务启动的应用程序未显示在桌面上。它必须是,因为它是一个交互式应用程序。解决办法是什么 注:这是系统的规格和设计。与服务/应用程序通信和安全相关的典型问题不适用于此特定情况 编辑:当以本地系统帐户登录时,GUI元素将正确显示,但是,由于GUI应用程序需要访问网络驱动器(它无法理解UNC映射),它需要

我正在编写一个.NET Windows服务,其角色是启动GUI应用程序(其源代码不可用)。 该操作是一个火灾后遗忘操作,除了初始命令行参数外,没有通信

该服务应作为给定的Windows帐户运行

问题:服务启动的应用程序未显示在桌面上。它必须是,因为它是一个交互式应用程序。解决办法是什么

注:这是系统的规格和设计。与服务/应用程序通信和安全相关的典型问题不适用于此特定情况

编辑:当以本地系统帐户登录时,GUI元素将正确显示,但是,由于GUI应用程序需要访问网络驱动器(它无法理解UNC映射),它需要作为指定的用户帐户运行,并且没有“显示交互元素”设置


edit2:操作系统是Windows 2003 Server,没有升级的计划。

这是一个暗中操作,但希望能引导您找到解决方案

尽管安全不是一个问题,但它可能是一个问题。该服务使用与当前登录用户不同的一组凭据启动应用程序。这就像是将远程桌面连接到用户的机器上,然后启动一个他们可以看到的应用程序

作为测试,可能将服务的凭据更改为当前登录的用户,以查看发生了什么


由于服务即使在用户未登录的情况下也会运行,如果启动应用程序会发生什么情况?您的业务规则或功能可能会阻止这种情况发生,但windows可能正在采取措施阻止其工作。

不幸的是,这是因为Vista。。。有关原因的一些详细信息发布在

那篇文章提到了一些可能的解决办法。这详细说明了整个过程,以及您可能面临的一些潜在问题


但是,我强烈建议您尝试看看是否可以切换到用户模式应用程序作为启动应用程序运行(当用户登录时),并且与您的服务的任何通信都由该应用程序处理。它更可靠,尤其是在vista、终端服务和其他情况下。

您可以使用Sysinternals/Microsoft提供的免费实用程序,并将应用程序启动以获得自动登录用户配置文件。之后,您可以将screen Server配置为几分钟后启动,并选中“恢复时显示登录屏幕”复选框

启用终端服务器角色后,您希望应用程序/服务正常工作吗?如果是这样,您确实需要执行“轮询服务的应用程序”模型,而不是“启动应用程序的服务”模型


原因是您可能随时有多个用户连接到机器上,无法知道“控制台”上有哪个用户-实际上控制台上可能根本没有人。

这是我过去在任务管理服务中使用的代码,有时需要在交互会话中运行东西。用你的应用程序替换wibble.exe。它应该可以在Server2003(即NT5)上正常运行。我们没有费心尝试在NT6上运行交互模式(太麻烦了),我们让我们的应用程序在服务会话中运行,并编写了我们自己的调试实用程序,通过管道与它们对话

STARTUPINFO  sui ;
PROCESS_INFORMATION pi;

ZeroMemory (&sui, sizeof(STARTUPINFO));
sui.cb = sizeof (STARTUPINFO);
sui.wShowWindow = pTask->GetWinStartState();
sui.dwFlags     = STARTF_USESHOWWINDOW;
ZeroMemory (&pi,sizeof(pi));

if (InteractiveMode)
{
   HANDLE  hToken = NULL;
   DWORD dwSessionId = GetCurrentUserSession();

   if (dwSessionId != (DWORD)-1)
   {
      if (WTSQueryUserToken (dwSessionId, &hToken))
      {
         sui.lpDesktop = TEXT("winsta0\\default");
         LPVOID  pEnv = NULL;
         dwCreateFlags |= CREATE_NEW_CONSOLE;
         HMODULE hModu = LoadLibrary(TEXT("Userenv.dll"));

         if (hModu)
         {
            if (CreateEnvironmentBlock (&pEnv, hToken, FALSE))
            {
               dwCreateFlags |= CREATE_UNICODE_ENVIRONMENT;    
            }
            else
            {
               pEnv = NULL;
            }
         }

         bCreatedOk = CreateProcessAsUser (hToken,
                                           NULL,
                                           TEXT("wibble.exe"),
                                           NULL,
                                           NULL,
                                           FALSE,
                                           dwCreateFlags,
                                           pEnv,
                                           NULL,
                                           &sui,
                                           &pi);
      }
      else
      {
         // error case
      }
   }
   else
   {
      // remote session? error case.
   }
}

我认为,您的“指定用户帐户”必须是这里的控制台会话。如果您需要它在指定的帐户中运行,而该帐户尚未登录,那么您就进入了一个全新的世界,充满了伤害、加载注册表配置单元等内容。

为了清晰起见进行了编辑。安全性肯定是这里的“问题”。服务器是Win2K3,它可以保持这种状态。指定的目标是首选方法将应用程序作为服务运行。