使用Delphi创建Windows服务来打开程序

6
我正在使用Delphi创建一个Windows服务。我的服务需要做的基本上是打开一个程序。 在我的代码中,我使用WinExec(aux,SW_SHOWNORMAL);。当我启动和运行服务时,似乎没有任何操作,但当我查看任务管理器时,我的服务应该打开的程序在列表中,并且在用户名列中出现SYSTEM。
所以这个程序正在打开,但它不显示在屏幕上。 我在Google上进行了研究,发现了一些函数,如CreateProcess,但我不知道如何使用它。 我做错了什么?
对不起,我的英语不好。

如果您正在使用Windows Vista或7,则请查看此MSDN文章[在Windows Vista及更高版本中从Windows服务启动交互式进程](http://blogs.msdn.com/b/winsdk/archive/2009/07/14/launching-an-interactive-process-from-windows-service-in-windows-vista-and-later.aspx) - RRUZ
1
@Daniel,你的英语非常好。 - Jerry Dodge
1个回答

6
服务始终在 Session 0 中运行。由服务启动的进程默认情况下在服务的会话中运行,除非服务使用 CreateProcessAsUser() 在不同的会话中运行该进程。
在 XP 及更早版本中,第一个登录的用户也在 Session 0 中运行(随后登录的用户在 Sessions 1+ 中运行)。因此,如果该服务被标记为交互式并且它运行了一个具有 UI 的进程,则在 Session 0 中运行的用户可以看到 UI。
在 Vista 及更高版本中,这已经不再可能。用户不再在 Session 0 中运行,服务也不能再标记为交互式。这被称为“Session 0 隔离”。现在,服务必须使用 CreateProcessAsUser() 才能在交互式会话中运行 UI 进程,以便用户可以看到它。
有关更多详细信息,请参阅 MSDN:
- Session 0 Isolation - Impact of Session 0 Isolation on Services and Drivers in Windows - 从服务中调用 CreateProcessAsUser() - 在 Windows Vista 及更高版本中从 Windows 服务启动交互式进程 - CreateProcessAsUser 函数

谢谢!CreateProcessAsUser()会有所帮助。另外,你能举例说明一下CreateProcessAsUser()的用法吗?我在参数方面遇到了麻烦。 - Daniel
4
我提供的链接展示了如何在服务中使用CreateProcessAsUser()函数,网络上也有大量相关信息,因此我不会在这里进行解释。只需要知道WinExec()(内部使用CreateProcess())和CreateProcessAsUser()之间的区别是:CreateProcess()在调用进程的用户账户中运行新进程,而CreateProcessAsUser()则在指定的用户账户中运行新进程。这一点在尝试从服务Session访问用户Session时非常重要。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接