【问题标题】:Creating a Windows Service to open a program- Delphi创建一个 Windows 服务来打开一个程序 - Delphi
【发布时间】:2012-08-10 18:32:09
【问题描述】:

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

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

对不起,我的英语不好。

【问题讨论】:

标签: delphi windows-services


【解决方案1】:

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

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

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

更多详情请参考 MSDN:

Session 0 Isolation

Impact of Session 0 Isolation on Services and Drivers in Windows

Calling CreateProcessAsUser() from service

Launching an interactive process from Windows Service in Windows Vista and later

CreateProcessAsUser function

【讨论】:

  • 谢谢! CreateProcessAsUser()会有所帮助。另一件事,你能举例说明CreateProcessAsUser() 的用途吗?我遇到了参数问题。
  • 我链接的文章向您展示了如何在服务中使用CreateProcessAsUser(),并且网上有很多关于它的信息,所以我不打算在这里解释它。只要知道WinExec()(内部使用CreateProcess())和CreateProcessAsUser()之间的区别在于CreateProcess()在调用进程的用户帐户中运行新进程,而CreateProcessAsUser()在指定的用户帐户中运行新进程用户帐户。这在尝试从服务 Session 访问用户的 Session 时很重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
相关资源
最近更新 更多