【发布时间】:2014-02-13 08:03:03
【问题描述】:
我有一个在 64 位 Windows Server 2008 机器上作为服务运行的 C++ 程序。该程序尝试使用以下命令启动批处理文件:
system(C:\pathtofile\file.bat)
在 32 位 Windows Server 2003 中,这工作正常(批处理文件已执行),但在 Windows Server 2008 上,批处理文件未执行,我得到返回值 0xC0000142(我让批处理文件向其中写入了一些文本)一个文件作为测试,看看它是否执行)。即使我尝试执行不存在的东西,我实际上也会得到相同的返回值。
我阅读了有关 Windows Server 2008 中 Session 0 隔离的信息,因此我使用 psexec 在 Session 0 中启动命令提示符,作为服务的“登录为”用户列出的同一域用户:
psexec -i 0 -u DOMAIN\serviceuser -p passwd cmd.exe
然后我能够从命令提示符成功执行批处理文件。
作为服务的登录身份用户列出的域用户位于管理员组中。此外,如果我手动启动 C++ 应用程序(而不是作为服务),它将启动批处理文件。
那么,会话 0 的隔离是否会导致 system() 调用在作为服务运行时不起作用?或者关于行为变化的其他解释?我知道 system() 不一定是最好的方法,但我正在寻找它不再有效的实际原因。
【问题讨论】:
-
了解批处理文件试图做什么也会有所帮助。
-
由于这是(可能)32 位程序,对
system的调用将启动cmd.exe的32 位版本。检查c:\windows\syswow64\cmd.exe是否运行正常。 -
如果可以向服务添加日志记录,请检查环境变量
COMSPEC和PATH设置为什么。 Process Monitor(可从 MS 网站获得)也可以为您提供一些关于正在发生的事情的线索。 -
Ken - 批处理文件最终会尝试执行另一个可执行文件,但我在顶部添加了一个“echo some text >> temp.txt”行,我没有看到任何结果。
-
0xC0000142L = DLL 初始化失败
标签: c++ windows batch-file service session-0-isolation