Выполнение Powershell script от php
Я пытаюсь выполнить powershell script с PHP, но он не работает.
script 'newEvent.ps1' создает событие на сервере Exchange.
$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 "</pre>";
Он выводит:
$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
, но он все тот же.
Ответы
Ответ 1
Похоже, ваша команда окружена одиночными кавычками. Я думаю, что если вы их удалите, ваша команда должна работать.
shell_exec
возвращает результат выполнения команды. Чтобы продолжить диагностику, сохраните вывод в переменной, а затем распечатайте его:
$output= shell_exec($runCMD);
echo( '<pre>' );
echo( $output );
echo( '</pre>' );
Убедитесь, что вы включили запуск сценариев. По умолчанию эта функция отключена. Вам необходимо включить выполнение сценариев на каждом компьютере, на котором вы хотите запускать сценарии PowerShell. Запустите about help_signing
для получения дополнительной информации.
Корпорация Майкрософт рекомендует запустить Set-ExecutionPolicy RemoteSigned -Scope LocalMachine
. Это позволяет всем учетным записям пользователей на компьютере запускать локальные скрипты без проблем, но требует подтверждения для запуска скриптов, загруженных из Интернета. Это нужно запустить в административном запросе. Если вы используете 64-разрядную операционную систему, вам нужно сделать это как из 64-битной, так и из 32-разрядной оболочки.
Ответ 2
Нашел это на другом веб-сайте и подумал, что пройду его:
Я отлаживал программу, использующую Windows API ( "Создание ребенка" Процесс с перенаправленным вводом и выводом) для Microsoft Windows PowerShell.
Script, переданный в PowerShell (-File-переключатель), не выполнялся и PowerShell просто повешен до тех пор, пока не будет убит диспетчер задач.
Оказывается, вам нужно использовать недокументированный параметр "-InputFormat ни один":
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -InputFormat none -File file.ps1
Это помогло мне.
Ответ 3
Используйте "-executionPolicy Unrestricted
" вместе с командой "powershell.exe
". Поэтому команда будет:
powershell.exe -executionPolicy Unrestricted
Тогда он, безусловно, будет работать.
Ответ 4
Чтобы выполнить файл скрипта из PHP, вы должны следовать этому примеру:
Вы должны начать с простого скрипта PowerShell. Создайте текстовый файл с именем " test.ps1 ".
Теперь введите следующий скрипт в этом файле:
Get-Process
Поместите приведенный ниже код в файл PHP с именем " test.php ". Не забудьте обновить путь к файлу в следующем примере "C: /PATH/TO/test.ps1", указав абсолютный путь к вашему файлу сценария.
echo "<pre>";
echo Shell_Exec('powershell -InputFormat none -ExecutionPolicy ByPass -NoProfile -Command "& { . \"C:/PATH/TO/test.ps1\"; }"');
echo "</pre>";
Приведенный выше код выведет список всех ваших запущенных процессов.
Обратите внимание, что я выполнял свой сценарий на ПК с Windows и получал сообщения об ошибках из-за пути к файлу. Итак, я заменил все обратные косые черты из пути к файлу на прямые косые черты.
Следующие параметры заслуживают внимания:
- -InputFormat нет - из-за ошибки в PowerShell скрипт никогда не завершит работу или не завершится. Этот параметр обеспечивает обход этой ошибки.
- -ExecutionPolicy ByPass - без этого параметра код выдаст сообщение об ошибке с низким уровнем привилегий.
- -NoProfile - с этим параметром ваш скрипт будет работать быстрее и более предсказуемо.
- -Command - Загрузив файл скрипта через параметр "-Command" вместо параметра "-File", вы получите большую гибкость.
Например, если вам нужно вызвать функцию внутри вашего скрипта и отправить параметры этой функции, вам нужно будет использовать параметр "-Command".
Вот пример того, как вызвать функцию "my-function" в вашем файле сценария PowerShell и передать параметры "-myParameter" и "-myOtherParameter" этой функции со значениями "10" и "15" соответственно:
echo "<pre>";
echo Shell_Exec('powershell -InputFormat none -ExecutionPolicy ByPass -NoProfile -Command "& { . \"C:/PATH/TO/test.ps1\"; my-function -myParameter 10 -myOtherParameter 15 }"');
echo "</pre>";