6

我正在用 Delphi 创建一个 Windows 服务。我的服务需要做的基本上就是打开一个程序。在我的代码中,我使用WinExec(aux,SW_SHOWNORMAL);. 当我启动并运行该服务时,似乎什么也没做,但是当我查看 TaskManager 时,我的服务应该打开的程序在列表中,并且在用户名列中出现 SYSTEM。

所以程序正在打开,但它没有显示在屏幕上。我在谷歌做了一个研究,发现了一些功能,CreateProcess但我不知道如何使用它。我究竟做错了什么?

对不起我的英语不好。

4

1 回答 1

6

服务始终运行在 Session 0 中。由服务启动的进程默认运行在服务的 Session 中,除非该服务用于CreateProcessAsUser()在不同的 Session 中运行该进程。

在 XP 和更早版本中,第一个登录的用户也在 Session 0 中运行(后续登录的用户在 Sessions 1+ 中运行)。因此,如果该服务在安装时被标记为 Interactive,并且它运行具有 UI 的进程,则在 Session 0 中运行的用户可以看到 UI。

在 Vista 及更高版本中,这不再可能。用户不再在 Session 0 中运行,服务不能再被标记为 Interactive。这称为“会话 0 隔离”。现在必须使用服务才能CreateProcessAsUser()在交互式会话中运行 UI 进程,以便用户可以看到它。

有关详细信息,请参阅 MSDN:

会话 0 隔离

Session 0 隔离对 Windows 中的服务和驱动程序的影响

从服务调用 CreateProcessAsUser()

在 Windows Vista 及更高版本中从 Windows 服务启动交互式进程

CreateProcessAsUser 函数

于 2012-08-10T18:47:18.580 回答