【问题标题】:executing a Powershell script from php从 php 执行 Powershell 脚本
【发布时间】:2011-07-16 02:18:34
【问题描述】:

我正在尝试从 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,但还是一样。

【问题讨论】:

  • 看看你正在运行的命令行。
  • 确保同时进入 32 位和 64 位实例并设置执行策略,然后重试。 -> Set-ExecutionPolicy Unrestricted

标签: php powershell exchange-server shell-exec


【解决方案1】:

您的命令似乎被单引号包围。我认为如果你删除它们,你的命令应该运行。

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 执行此操作。

【讨论】:

  • 刚刚更新了我的答案以反映您添加的错误消息。
  • 好的,我知道*.com/questions/4647429/… 需要在 x86 和 64 位控制台上运行它,我只在 64 位控制台上运行它。
  • 很高兴你知道了。我已更新我的答案以包含该信息。
【解决方案2】:

在另一个网站上发现了这个,并认为我会传递它:

我正在调试一个使用 Windows API 的程序(Creating a Child 具有重定向输入和输出的进程)以捕获标准输出 微软的 Windows PowerShell。

传递给 PowerShell 的脚本(-File 开关)没有执行并且 PowerShell 刚刚挂起,直到被任务管理器杀死。

原来你需要使用无证参数“-InputFormat 无”:

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

这对我有用。

【讨论】:

  • 如果是!NSFW,通常也可以将link 发送到源(站点)。
【解决方案3】:

要从 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 中的错误,脚本永远不会完成运行或退出。此参数提供了解决此错误的方法。
  2. -ExecutionPolicy ByPass - 没有这个参数,代码会抛出低权限错误信息。
  3. -NoProfile - 使用此参数,您的脚本将运行得更快且更可预测。
  4. -Command - 通过“-Command”参数而不是“-File”参数加载脚本文件,您将拥有更大的灵活性。 例如,如果您需要在脚本中调用一个函数并向该函数发送参数,则需要使用“-Command”参数。

这是一个示例,说明如何在 PowerShell 脚本文件中调用函数 "my-function" 并传递参数 "-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>";

【讨论】:

    【解决方案4】:

    使用“-executionPolicy Unrestricted”和命令“powershell.exe”。因此命令将是:

    powershell.exe -executionPolicy Unrestricted
    

    那么它肯定会起作用。

    【讨论】:

      最近更新 更多