有没有办法从服务中运行可执行文件?

Posted

技术标签:

【中文标题】有没有办法从服务中运行可执行文件?【英文标题】:Is there a way to run an executable from within a service? 【发布时间】:2015-04-03 21:07:17 【问题描述】:

我在这里使用模板开始了我的服务设计:

https://msdn.microsoft.com/en-us/library/windows/desktop/bb540475(v=vs.85).aspx

我只想打开记事本来证明我可以在服务中做一些事情,因为最终我想运行以在一个单独的进程中启动一个批处理文件,该进程将启动一个 nginx 服务器。然后我想运行一个停止服务器批处理文件来停止它。看起来很简单。

我创建了一个进程并在 C++ 项目的 main 中运行它(这个 main 注册了一个服务 main,以便在服务启动时调用)。

在 Visual Studio 的调试器中,我看到 createprocess 返回正常,然后记事本打开。

然后,我在注册的服务主程序中移动该代码,添加 30 秒的睡眠延迟,启动服务,然后将 Visual Studio 的调试器附加到该进程。我看到代码在创建记事本进程时遇到了断点。

然后创建进程函数返回正常,但由于某种原因记事本没有打开。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx

if (!CreateProcess(
        "C:\\Windows\\System32\\Notepad.exe",   // No module name (use command line)
        NULL,        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi           // Pointer to PROCESS_INFORMATION structure
        )
        )
    
        printf("CreateProcess failed (%d).\n", GetLastError());
    

我让它成功运行 bat 文件并写入文件。路径设置错误。非常感谢

【问题讨论】:

【参考方案1】:

服务在没有桌面的单独用户帐户下运行。您可以正常完美运行进程,但无法显示任何 UI。

【讨论】:

我做同样的事情,没有 gui 试图只运行一个运行控制台程序的批处理文件,但它不起作用。这也不允许吗? 它创建了承诺并返回 true,但我没有看到任何输出。让我将 bat 文件添加到开头的帖子中。 @JamesJoshuaStreet:您看不到输出,因为启动的控制台运行在与用户登录的会话不同的会话上。如果您想在从服务启动时查看控制台 UI,请改用 CreateProcessAsUser()。使用WTSEnumerateSessions() 查找处于WTSActive 状态的会话,然后使用WTSQueryUserToken() 获取该会话的用户令牌。 @JamesJoshuaStreet:服务可以运行网络代码,它不依赖于登录的用户。如果您在使用 Nginx 时遇到问题,很可能是与 Nginx 本身有关的问题,而不是在服务会话中工作。再次尝试使用CreateProcessAsUser() 在与服务自身会话不同的会话上下文中运行它。 @JamesJoshuaStreet:不,除非用户已登录,否则没有用户会话可以在其中运行进程。如果问题只是 Nginx 不喜欢作为本地系统运行,则可以重新配置在真实帐户中运行的服务。但是,如果 Nginx 不喜欢在服务上下文中运行,那么您无能为力。您可能需要就此提出一个单独的问题,尽管这不是主题;也许是 Nginx 自己的支持资源?【参考方案2】:

转到http://nginx-win.ecsds.eu/ 并下载 Install_nginx_php_services.zip,阅读脚本如何用于 nginx 和 php 以及其他任何东西,所用工具的来源可以在 MS 的网站上找到。

【讨论】:

以上是关于有没有办法从服务中运行可执行文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 python 脚本作为可执行文件运行? [复制]

ubuntu中执行可执行文件时报错“没有那个文件或目录”的解决办法(非权限问题)

从 php 运行可执行文件而不产生 shell

有没有办法创建从 pyinstaller --onefile 生成的单个可执行 exe 文件的 MSI 包?

NDK编译可执行文件在Android 中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。(示

避免从 Linux 上的可执行文件中导出符号