выполнение скрипта Powershell из php - PullRequest
11 голосов
/ 15 марта 2011

Я пытаюсь выполнить скрипт powershell из PHP, но, похоже, он не работает.

Сценарий 'newEvent.ps1' создает событие на сервере Exchange.

<code>$psPath = "powershell.exe";
$psDIR = "C:\\wamp\\www\\ant\\assets\\ps\\";
$psScript = "newEvent.ps1";
$runScript = $psDIR. $psScript;
$runCMD = $psPath." ".$runScript." 2>&1"; 

echo "\$psPath  $psPath <br>";
echo "\$psDIR  $psDIR <br>";
echo "\$psScript  $psScript <br>";
echo "\$runScript  $runScript <br>";
echo "\$runCMD   $runCMD  <br>";

exec( $runCMD,$out,$ret);

echo "<pre>";
print_r($out);
print_r($ret);
echo "
";

Он выводит:

$psPath powershell.exe
$psDIR C:\wamp\www\ant\assets\ps\
$psScript newEvent.ps1
$runScript C:\wamp\www\ant\assets\ps\newEvent.ps1
$runCMD powershell.exe C:\wamp\www\ant\assets\ps\newEvent.ps1 2>&1

Array
(
    [0] => File C:\wamp\www\ant\assets\ps\newEvent.ps1 cannot be loaded because the execut
    [1] => ion of scripts is disabled on this system. Please see "get-help about_signing"
    [2] => for more details.
    [3] => At line:1 char:39
    [4] => + C:\wamp\www\ant\assets\ps\newEvent.ps1 <<<<
    [5] =>     + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    [6] =>     + FullyQualifiedErrorId : RuntimeException
    [7] => 
)

Если я запускаю powershell.exe C:\wamp\www\ant\assets\ps\newEvent.ps1 в командной строке, он отлично работает.

Это первый разя пытаюсь что-то вроде этого. Я запустил Set-ExecutionPolicy RemoteSigned -Scope LocalMachine, но он все еще дает мне ту же ошибку. На самом деле я запустил Set-ExecutionPolicy unristricted, но это все тот же.

Ответы [ 4 ]

8 голосов
/ 16 марта 2011

Похоже, ваша команда заключена в одинарные кавычки.Я думаю, что если вы удалите их, ваша команда должна запуститься.

shell_exec возвращает вывод команды, которую вы запускаете.Для дальнейшей диагностики сохраните вывод в переменной, а затем распечатайте его:

<code>$output= shell_exec($runCMD);
echo( '<pre>' );
echo( $output );
echo( '
');

Убедитесь, что вы включили запуск сценариев.Эта возможность по умолчанию отключена.Вы должны разрешить выполнение сценариев на каждом компьютере, на котором вы хотите запускать сценарии PowerShell.Запустите about help_signing для получения дополнительной информации.

Microsoft рекомендует запустить Set-ExecutionPolicy RemoteSigned -Scope LocalMachine.Это позволяет всем учетным записям пользователей на компьютере запускать локальные сценарии без проблем, но требует подтверждения для запуска сценариев, загруженных из Интернета.Это должно быть запущено в административной строке.Если вы работаете в 64-битной операционной системе, вам нужно это делать как из 64-битной, так и из 32-битной оболочки.

2 голосов
/ 20 марта 2012

Используйте «-executionPolicy Unrestricted» вместе с командой «powershell.exe». Поэтому команда будет:

powershell.exe -executionPolicy Unrestricted

Тогда это наверняка сработает.

2 голосов
/ 10 января 2012

Нашел это на другом сайте и подумал, что я передам это:

Я отлаживал программу, которая использует Windows API (Создание дочернего элемента Процесс с перенаправленным вводом и выводом) для захвата стандартного вывода Windows PowerShell от Microsoft.

Скрипт, переданный в PowerShell (переключатель -File), не выполняется и PowerShell просто зависал, пока не был убит диспетчером задач.

Оказывается, нужно использовать недокументированный параметр «-InputFormat». доли не имеет»:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -InputFormat none -File file.ps1

Это помогло мне.

0 голосов
/ 16 июля 2019

Чтобы выполнить файл скрипта из PHP, вы должны следовать этому примеру:

Вы должны начать с простого скрипта PowerShell. Создайте текстовый файл с именем « test.ps1 ».

Теперь введите следующий скрипт в этом файле:

Get-Process

Поместите приведенный ниже код в файл PHP с именем " test.php ". Не забудьте обновить путь к файлу в следующем примере "C: /PATH/TO/test.ps1" , указав абсолютный путь к собственному файлу сценария.

<code>echo "<pre>";
echo Shell_Exec('powershell -InputFormat none -ExecutionPolicy ByPass -NoProfile -Command "& { . \"C:/PATH/TO/test.ps1\"; }"');
echo "
";

Приведенный выше код выведет список всех запущенных вами процессов.

Обратите внимание, что я запускал свой скрипт на ПК с Windows и получал сообщения об ошибках из-за пути к файлу. Итак, я заменил все обратные косые черты из пути к файлу на прямые косые черты.

Следующие параметры заслуживают внимания:

  1. -InputFormat none - Благодаря ошибке в PowerShell скрипт никогда не завершит работу или не завершится. Этот параметр обеспечивает обход этой ошибки.
  2. -ExecutionPolicy ByPass - Без этого параметра код выдаст сообщение об ошибке с низким уровнем привилегий.
  3. -NoProfile - С этим параметром ваш скрипт будет работать быстрее и более предсказуемо.
  4. -Command - Загрузка файла сценария через параметр "-Command" вместо параметра "-File" обеспечит большую гибкость. Если, например, вам нужно вызвать функцию внутри вашего скрипта и отправить параметры этой функции, вам нужно будет использовать параметр "-Command".

Вот пример того, как вызвать функцию "my-function" внутри файла скрипта PowerShell и передать параметры "- myParameter" и "- myOtherParameter " для этой функции со значениями " 10 " и " 15 " соответственно:

<code>echo "<pre>";
echo Shell_Exec('powershell -InputFormat none -ExecutionPolicy ByPass -NoProfile -Command "& { . \"C:/PATH/TO/test.ps1\"; my-function -myParameter 10 -myOtherParameter 15 }"');
echo "
";
...