【问题标题】:Why can't I start a batch file from a service using system() in Windows Server 2008?为什么我不能在 Windows Server 2008 中使用 system() 从服务启动批处理文件?
【发布时间】: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是否运行正常。
  • 如果可以向服务添加日志记录,请检查环境变量 COMSPECPATH 设置为什么。 Process Monitor(可从 MS 网站获得)也可以为您提供一些关于正在发生的事情的线索。
  • Ken - 批处理文件最终会尝试执行另一个可执行文件,但我在顶部添加了一个“echo some text >> temp.txt”行,我没有看到任何结果。
  • 0xC0000142L = DLL 初始化失败

标签: c++ windows batch-file service session-0-isolation


【解决方案1】:

根据我现在对该问题的了解,您无法在 Windows Server 2008 中使用 system() 从服务运行批处理文件的原因是因为 Windows 会考虑任何调用 cmd.exe 的尝试(就像它会做的那样运行您的批处理文件)作为启动交互式服务的尝试。由于 Session 0 隔离,这是不允许的,即使您可能不认为您的批处理文件是交互式的或具有 GUI(这让我失望),这也会失败。

我想出了如何使用 CreateProcess 获得我想要的效果。这里的关键是您必须将 dwCreationFlags 参数设置为 CREATE_NO_WINDOW。所以我的(简化的)电话最终看起来像这样:

CreateProcess(NULL,   // No module name (use command line)
    L"C:\\Windows\\System32\\cmd.exe /C myfile.bat", // Call cmd.exe with /C flag
    NULL,           // Process handle not inheritable
    NULL,           // Thread handle not inheritable
    FALSE,          // Set handle inheritance to FALSE
    CREATE_NO_WINDOW,              // Use CREATE_NO_WINDOW!!!
    NULL,           // Use parent's environment block
    NULL,           // Use parent's starting directory 
    &si,            // Pointer to STARTUPINFO structure
    &pi )           // Pointer to PROCESS_INFORMATION structure

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 2020-04-10
    • 2012-05-30
    • 2014-04-11
    • 1970-01-01
    • 2019-02-09
    • 2017-08-13
    相关资源
    最近更新 更多