从PHP运行batch file – 交互式服务检测?

我很难从PHP脚本(使用exec()或其他一些我尝试过的PHP命令)中获取可执行文件。

这个问题似乎归结为一个用户权限(可能?)或Windows /服务器configuration的问题,而我知道的很less。

我目前使用WAMPserver在Windows本地主机上进行testing。 我目前有一个.bat文件的命令来运行我的可执行文件,就像我从命令行运行它。 从命令行运行时,.exe工作正常; 同样,当我直接点击.bat文件时,它启动并运行.exe,因为它应该。 然而,当我尝试从PHP脚本运行它(目前通过使用exec('open.bat');虽然我已经尝试了许多其他启动它的方式),它激活了一个名为“Windows交互式服务检测”。

从我读过的内容来看,这与Windows的“会话”有关,为了安全起见,用户程序在会话1中运行,而系统进程在会话0中运行。 但由于某种原因,我可以运行.bat罚款,如果我只是点击它。

所以也许这与PHP执行batch file的用户有关呢?

我已经尝试了几种将文件作为不同用户运行的方法,例如使用CPAU ,它允许程序在不同的用户下执行。 同样,当直接点击batch file时,程序工作正常,但是从PHP激活它时,它不起作用(当使用CPAU,而不是交互式服务检测popup时,它什么也没有做)。

有没有人遇到类似的问题,而试图从PHP内运行一个可执行文件,或有一个想法,我可能会得到它运行?

即使“用户”是“本地系统”,Windows中的所有用户模式进程都将作为“用户”执行。 因此,所有Windows服务以“用户”身份运行。 IIS或Apache,无论你使用什么,都以用户身份运行。

那个用户不是你。

即使您以您的用户帐户运行您的Web服务器(Windows服务),仍然会创build一个不是“您的”login会话的新login会话,因为系统正在login您的用户帐户的另一个实例。 用户帐户和login会话是不同的事情。 每个交互式login会话都有一个单独的桌面,所以服务所做的任何事情都会在桌面上显示,而不是在桌面上显示。

batch file和可执行文件按预期工作,因为它们在您的会话中启动。 当Windows检测到作为服务运行的程序试图与桌面进行交互时,会触发交互式服务检测(它本身作为Windows服务运行)。推理是Windows服务应该完全是非交互式的,并且没有GUI需要来自人的input。 否则,你可能正在处理一个devise不好的可执行文件作为Windows服务。 即使如此,您仍应该可以单击“查看消息”或Interactive Services Detection中的任何提示,并且会暂时将您带到会话0的桌面与“服务”GUI进行交互,但同时也会中断您的桌面你在Session 0的桌面上。 (它会在会话中创build一个新进程,通知您Session 0中的某些内容需要您的注意。)

好的,那么你能做些什么呢? 那么,你没有给出任何关于你作为一个Windows服务运行的可执行文件的细节,或者它是做什么的,但是你似乎希望它在你的会话中,桌面上运行,以便你可以与您使用Solitaire.exe进行交互。

在其他用户会话中启动事件并不是Windows中的例行操作,但是psexec应该能够执行此操作。

 psexec.exe \\computername -i 1 program.exe 

在上面的示例中,编号1指定要在哪个会话中运行program.exe。如果要手动触发交互式服务检测,请使用会话0。

进一步阅读: http : //blogs.msdn.com/b/patricka/archive/2010/04/27/what-is-interactive-services-detection-and-why-is-it-blinking-at-me。 ASPX