我很难从 PHP 脚本中运行可执行文件(使用 exec() 或我尝试过的许多其他 PHP 命令)。
该问题似乎归结为用户权限问题(可能?)或 Windows/服务器配置问题,我对此了解甚少。
我目前正在使用 WAMPserver 在 Windows localhost 上进行测试。我目前有一个 .bat 文件,其中包含运行可执行文件的命令,就像我从命令行运行它一样。从命令行运行时,.exe 工作正常;同样,当我直接单击 .bat 文件时,它会启动并按预期运行 .exe。但是,当我尝试从 PHP 脚本运行它时(目前使用exec('open.bat');
,尽管我尝试了许多其他启动它的方法),它会激活称为“Windows 交互式服务检测”的东西。
据我所知,这与 Windows 的“会话”有关,出于安全考虑,用户程序在会话 1 中运行,系统进程在会话 0 中运行。但出于某种原因,只要单击 .bat,就可以正常运行它。
所以也许这与 PHP 执行批处理文件的用户有关?
我尝试了几种以不同用户身份运行文件的方法,例如使用华人会计师协会,它允许程序在不同用户下执行。同样,当直接单击批处理文件时,程序运行良好,但当从 PHP 激活它时,它不起作用(当使用 CPAU 时,而不是弹出交互式服务检测时,它根本没有做任何事情)。
是否有人在尝试从 PHP 内部运行可执行文件时遇到过类似的问题,或者知道如何让它运行?
答案1
Windows 中的所有用户模式进程都以“用户”身份执行,即使该“用户”是“本地系统”。因此,所有 Windows 服务都以“用户”身份运行。无论您使用什么,IIS 或 Apache 都以用户身份运行。
那个用户不是你。
即使您在自己的用户帐户下运行 Web 服务器(Windows 服务),仍会创建一个不是“您的”登录会话的新登录会话,因为系统正在登录您用户帐户的另一个实例。用户帐户和登录会话是两码事。每个交互式登录会话都有一个单独的桌面,因此服务所做的任何涉及在其桌面上显示内容的操作都将在其桌面上进行,而不是在您的桌面上进行。
单击批处理文件和可执行文件时,它们会按预期工作,因为它们在您的会话中启动。当 Windows 检测到作为服务运行的程序试图与桌面交互时,将触发交互式服务检测(它本身作为 Windows 服务运行)。原因是 Windows 服务应该完全非交互式,并且没有需要人工输入的 GUI。否则,您可能正在处理一个设计不适合作为 Windows 服务的可执行文件。即便如此,您应该能够单击“查看消息”或来自交互式服务检测的任何提示,它会暂时将您带到会话 0 的桌面以与“服务”的 GUI 交互,但它也会在您位于会话 0 的桌面时中断您的桌面。(它会在您的会话中创建一个新进程,以通知您会话 0 中的某些内容需要您的注意。)
好吧,那你到底能做什么呢?嗯,你并没有真正详细说明你作为 Windows 服务运行的这个可执行文件是什么,或者它做什么,但你似乎希望它在你的会议,你的桌面,以便您可以像与 Solitaire.exe 一样与其进行交互。
嗯,在其他用户的会话中启动东西并不是 Windows 中的常规操作,但 psexec 应该能够做到这一点。
psexec.exe \\computername -i 1 program.exe
在上面的例子中,数字 1 指定在哪个会话中运行 program.exe。如果您想手动触发交互式服务检测,请使用会话 0。