从PHP执行Powershell脚本

pw136qt2  于 2023-11-16  发布在  PHP
关注(0)|答案(4)|浏览(128)

我试图从PHP执行powershell脚本,但它似乎不工作。
脚本“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,但它仍然是一样的。

ctehm74n

ctehm74n1#

看起来你的命令被单引号包围了。我想如果你把它们去掉,你的命令应该会运行。
shell_exec返回您运行的命令的输出。要进一步诊断,请将输出存储在变量中,然后将其打印出来:

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

字符串
确保启用了运行脚本。默认情况下,该功能处于关闭状态。您必须在要运行PowerShell脚本的每台计算机上启用脚本执行。有关详细信息,请运行about help_signing
Microsoft建议运行Set-ExecutionPolicy RemoteSigned -Scope LocalMachine。这允许计算机上的所有用户帐户运行本地脚本而不会出现问题,但需要确认才能运行从Internet下载的脚本。这需要在管理提示符中运行。如果您运行的是64位操作系统,则需要从64位和32位shell执行此操作。

7uzetpgm

7uzetpgm2#

要从PHP执行脚本文件,您应该遵循以下示例:
你应该从一个简单的PowerShell脚本开始。创建一个名为“test.ps1"的文本文件。
现在在此文件中键入以下脚本:

Get-Process

字符串
将下面的代码放在一个名为“test.php"的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 PC上运行我的脚本,由于文件路径的原因,我收到了错误消息。因此,我将文件路径中的所有反斜杠替换为正斜杠。
以下参数值得注意:
1.-InputFormat none-由于PowerShell中的一个bug,脚本将永远不会完成运行或退出。此参数提供了解决此bug的方法。
1.-ExecutionPolicy ByPass-如果没有此参数,代码将抛出低权限错误消息。
1.-NoProfile-使用此参数,您的脚本将运行得更快,更可预测。
1.-Command-通过“-Command”参数而不是“-File”参数来加载脚本文件,您将拥有更大的灵活性。例如,如果您需要调用脚本中的函数并向该函数发送参数,则需要使用“-Command”参数。
以下是如何在PowerShell脚本文件中调用函数**“my-function”并将参数"-myParameter”"-myParameter”分别传递给该函数的示例,其值为“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>";

uwopmtnx

uwopmtnx3#

在另一个网站上发现了这个,并认为我会把它沿着:
我正在调试一个程序,该程序使用Windows API(使用重定向的输入和输出创建子进程)来捕获Microsoft的Windows PowerShell的标准输出。
传递给PowerShell的脚本(-File开关)没有执行,PowerShell只是挂起,直到被任务管理器杀死。
原来你需要使用未文档化的参数“-InputFormat none”:
第一个月
这对我来说是一个诡计。

yftpprvb

yftpprvb4#

将“-executionPolicy Unrestricted“沿着与命令“powershell.exe“一起使用。因此命令将是:

powershell.exe -executionPolicy Unrestricted

字符串
那它肯定会起作用的

相关问题