有没有办法从服务中运行可执行文件?
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 的网站上找到。
【讨论】:
以上是关于有没有办法从服务中运行可执行文件?的主要内容,如果未能解决你的问题,请参考以下文章
ubuntu中执行可执行文件时报错“没有那个文件或目录”的解决办法(非权限问题)
有没有办法创建从 pyinstaller --onefile 生成的单个可执行 exe 文件的 MSI 包?
NDK编译可执行文件在Android 中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。(示