【问题标题】:Can I call system() from a Windows service我可以从 Windows 服务调用 system()
【发布时间】: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() 或近亲实现。我编辑了问题以反映这一点。

标签: c++ windows service lua


【解决方案1】:

使用 CreateProcess 来获取错误代码。如果这没有帮助,请查看http://www.cplusplus.com/forum/windows/105447/,它有一些关于本地系统限制的重要信息和解决方法的链接(特别是http://www.codeproject.com/Articles/18367/Launch-your-application-in-Vista-under-the-local-s)。

【讨论】:

  • 我会调查的。很难从中获取任何事件或错误代码,因为服务只是在后台愉快地运行并且实际上完成了大部分工作。
  • 如我所见,我只能通过 CreateProcessAsUser 方法实现我想要的。我“只是”必须提供正确的访问令牌安全句柄。在我面前的 Windows 仙境中的另一个冒险......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
相关资源
最近更新 更多