C# WPF应用程序在由使用topshelf创建的Windows服务启动时不显示窗体

polhcujo  于 2023-04-22  发布在  Windows
关注(0)|答案(2)|浏览(288)

我有:
1.简单的WPF应用程序,由Visual Studio创建1个窗口
1.启动该应用程序的Windows服务(使用topshelf创建)
如果我手动启动应用程序,它会出现在任务管理器中,并显示它应该的形式。
但是当它是由windows服务启动,应用程序出现在任务管理器,但形式不显示。这应该是什么原因?
win服务中的应用程序启动代码

System.Diagnostics.Process process = new System.Diagnostics.Process();
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                startInfo.FileName = _app.MainAppDirectory;
                startInfo.Arguments = "";
                process.StartInfo = startInfo;
                process.Start();
tquggr8v

tquggr8v1#

你不能这样做。Windows services不在current user会话下运行。当你登录到Windows时,你将获得一个活动会话,包括(桌面、环境变量..)以及运行应用程序时(例如Simple WindowsFormWPF,您可以打开Task manager并导航到Detail选项卡,以查看有关运行每个进程的用户的信息(当WPF应用程序由您的Windows服务运行时,请选中此选项)。
您可以在Start menu上输入Services,然后打开Services窗口,找到已安装的服务。您可以在那里检查名为Log on As的列。它是运行Windows service的用户帐户(可能是Local SystemLocal Service)。

**这是一个有趣的事实,**你可以编写一个即使没有登录用户也能运行的应用程序。

我有同样的任务,5年前,我试图窃取用户会话.使用Impersonation你可以窃取用户令牌和运行您的应用程序作为一个特定的用户.但你仍然无法看到你的应用程序在桌面上.
寻找一个不同的项目类型来满足你的需求。也许可以将你的应用程序标记为启动应用程序,并对用户隐藏它的Forms

2fjabf4q

2fjabf4q2#

Windows服务在session 0中运行,它将服务与用户应用程序隔离。这篇文章中的引用给出了更多关于他们将用户应用程序与会话0隔离的详细信息。
在Windows XP、Windows Server 2003和早期版本的Windows操作系统中,所有服务都在与第一个登录到控制台的用户相同的会话中运行。2此会话称为会话0。在会话0中同时运行服务和用户应用程序会带来安全风险,因为服务以提升的权限运行,因此成为恶意代理的目标,这些恶意代理正在寻找提升其权限的方法。自己的特权级别。
曾经有一种方法可以通过制作interactive service来完成你想做的事情,但该文档中的第一个重要部分指出。
从Windows Vista开始,服务无法直接与用户交互。因此,在新代码中不应使用“使用交互式服务”一节中提到的技术。
据我所知,复选框仍然存在,以使服务交互,但只是为了与可能设置或读取它的安装程序兼容。

该图像来自我的Windows 10机器,所以打开它的选项就在那里,但就像我说的,我的印象是它除了防止试图设置它的应用程序被破坏之外什么也做不了。
通常情况下,我看到的应用程序解决此限制的方法是编写相应的桌面应用程序,安装该应用程序以在启动时启动,然后使用某种形式的进程间通信,如套接字与应用程序通信。

相关问题