我创建了一个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中执行时却完全有效吗?
答案 0 :(得分:0)
问题很可能是Session 0 isolation。 CMD
正在用户会话中运行,而php(或Web服务器)作为服务运行。 Windows 7中的服务在名为Session 0
的隔离会话中运行。此会话中的进程无法与其他进程通信。
因此,Get-process
命令无法列出您的CMD
- 进程,因为它无法访问该进程。您可以通过运行$process=Get-Process "cmd"
并回显结果来验证隔离。我从来没有尝试过,但我很确定你找不到任何以交互方式运行的流程。