PHP执行时,PowerShell脚本不起作用

时间:2014-04-21 05:23:22

标签: php powershell shell-exec

我创建了一个PowerShell脚本,旨在由PHP使用shell_exec()执行。

PowerShell脚本是:

[System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic")
[System.Reflection.Assembly]::LoadWithPartialName("'System.Windows.Forms")
$process=Get-Process "cmd" | where {$_.mainWindowTitle -like "*FTB*"}
[Microsoft.VisualBasic.Interaction]::AppActivate($process.ID)
[System.Windows.Forms.SendKeys]::SendWait("whitelist reload{ENTER}")

PHP执行行是:

$out = shell_exec("powershell C:\whitelist_reload.ps1");
echo ($out);

脚本执行,我通过Echo获得返回信息。它说,分配给PS脚本第3行中$process值的Get-Process变量为空。问题在于,如果我通过PowerShell可执行文件手动执行脚本,脚本将完美执行,并且完全符合我的要求。


有什么原因让Line 3在PHP执行时没有返回任何内容,但在PowerShell中执行时却完全有效吗?

1 个答案:

答案 0 :(得分:0)

问题很可能是Session 0 isolationCMD正在用户会话中运行,而php(或Web服务器)作为服务运行。 Windows 7中的服务在名为Session 0的隔离会话中运行。此会话中的进程无法与其他进程通信。

因此,Get-process命令无法列出您的CMD - 进程,因为它无法访问该进程。您可以通过运行$process=Get-Process "cmd"并回显结果来验证隔离。我从来没有尝试过,但我很确定你找不到任何以交互方式运行的流程。