2014-04-21 4 views
0

shell_exec()을 사용하여 PHP로 실행되도록 설계된 PowerShell 스크립트를 만들었습니다.PHP로 실행하면 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 스크립트의 Line 3에있는 Get-Process 값에 할당 된 $process 변수가 비어 있다고 말합니다. 문제는 PowerShell 실행 파일을 통해 수동으로 스크립트를 실행하면 스크립트가 완벽하게 실행되고 내가 원하는 것을 정확히 수행한다는 것입니다.


3 행이 PHP에 의해 실행될 때 아무것도 반환하지 않지만 PowerShell에서 실행될 때 완전히 작동하는 특별한 이유가 있습니까?

답변

0

문제는 대부분 Session 0 isolation입니다. CMD은 사용자 세션에서 실행 중이며 php (또는 웹 서버)는 서비스로 실행 중입니다. Windows 7의 서비스는 Session 0이라는 분리 된 세션에서 실행됩니다. 이 세션의 프로세스는 다른 프로세스와 통신 할 수 없습니다.

따라서 명령에는 액세스 할 수 없기 때문에 CMD- 프로세스를 나열 할 수 없습니다. $process=Get-Process "cmd"을 실행하고 결과를 표시하여 격리를 확인할 수 있습니다. 한번도 시도한 적이 없지만 대화 형으로 실행하는 프로세스를 찾지 못할 것이라고 확신합니다.

+0

소리가 문제입니다. cmd 창을 먼저 시작한 다음 해당 창에서 일괄 처리를 통해 스크립트를 실행하는 등의 방법이 있는지 궁금합니다. –