【发布时间】:2013-12-11 20:16:57
【问题描述】:
是否可以调用system() 在 Windows 服务的上下文中执行子进程?
我使用样板项目在 C++ 中实现了一个 Windows 服务:A basic Windows service
该服务以本地系统帐户和桌面交互权限启动,并在基于计时器的对象中运行各种代码,包括磁盘上的文件操作。
但是,system("C:\\bin\\sth.exe some-param"); 或从静态库运行 lua 代码之类的东西在 Windows 服务中不起作用。我通过在控制台应用程序中运行它们来确保它们完全正常工作。
有什么线索吗?
【问题讨论】:
-
当你说“不起作用”时,你尝试会发生什么?
-
(1) 安装windows服务,将'log on as'设置为'local system',启动。 (服务安装程序可执行文件的“非服务”部分在运行系统调用时没有问题)。 (2) 服务在后台运行,运行一些磁盘操作,做一些日志记录——一切都很好。 (3) 然而,系统调用并没有被执行,什么也没有发生。
-
一些应用程序根本不会在系统服务上下文中运行,因为它们依赖于不可用的功能。例如,它们可能依赖于缺少的环境变量,或者需要运行 Explorer,或者使用用户首次登录时创建的每个用户的注册表设置。测试给定可执行文件是否在服务上下文中运行时遇到问题的最简单方法是使用
psexec(可从 Microsoft 下载)。 -
C库
system命令本身也有可能有这样的依赖。尝试改用原生的CreateProcess,看看是否有什么不同。 -
短语“系统调用”通常用于指调用操作系统已发布的 API。 C 运行时函数
system()在 Unix 上通过系统调用execl(2)或其近亲之一实现,在 Windows 上可能通过CreateProcess()或近亲实现。我编辑了问题以反映这一点。