【问题标题】:PHP | Passing parameters into Powershell scriptPHP |将参数传递到 Powershell 脚本
【发布时间】:2014-08-18 10:33:19
【问题描述】:

我正在尝试创建一个运行 powershell 脚本的 PHP 应用程序。

我有一个名为“change.ps1”的文件,它是一个 powershell 脚本,这是该文件的内容:

Param([string]$username, [string]$password)
Import-Module ActiveDirectory
$newpwd = ConvertTo-SecureString -String "$password" -AsPlainText –Force
Set-ADAccountPassword $username -NewPassword $newpwd –Reset

现在我有一个 PHP 页面,它使用 shell_exec() 函数来运行这个脚本并向它传递两个参数,您可以在上面看到在 ps1 文件中使用了这两个参数($username,$password):

    $psscriptpath = "c:\inetpub\htdocsscripts\change.ps1";
shell_exec("powershell.exe -executionpolicy remotesigned -File" . $psscriptpath . " -username \"" . $username . "\" -password \"" . $password . "\"");

目前这不起作用(页面永远不会完成加载,也就是超时)。所以问题是,我这样做正确吗?我哪里出错了。这背后的原理比较简单,使用PHP将变量作为参数传递到powershell脚本中。

感谢您的浏览,如果您有任何问题,请告诉我。

更新: 我尝试直接通过 cmd 运行脚本,看看问题是否出在脚本本身。这是我显示的错误: http://puu.sh/aXuH3/b8db154625.png

第二次更新: 我已经修复了 CMD 上的错误,这是一个编码问题。但是,当我尝试运行 php 页面时,我仍然遇到超时问题: http://puu.sh/aXEdY/22cc87310c.png

【问题讨论】:

  • 这里没有足够的信息可以提供帮助,不过我会这样说:escape the argumentsthe command 正确
  • 好的,请问您需要什么信息,我很乐意告诉您。
  • 相对于 PHP 代码,change.ps1 存储在什么路径中?您使用的是相对路径scripts/change.ps1,这是否正确。您是否尝试用 \\ 替换 / 路径分隔符?脚本是否由具有执行 powershell 代码所需权限的用户运行?该用户可以运行 powershell.exe 吗?你有错误吗?如果是这样,您看到了什么消息?最后一件事:尝试使用exec 函数,捕获完整输出和状态码以获取更多信息
  • @EliasVanOotegem 是的,路径是正确的。我实际上可以运行 powershell 并手动运行命令,所以我认为权限不是问题?
  • 另外,我想补充一点,我尝试通过 CMD 直接运行它以尝试查看脚本本身是否正确。我遇到了这个通过 cmd.exe 返回的错误:puu.sh/aXuH3/b8db154625.png

标签: php shell powershell active-directory


【解决方案1】:

好吧,你好像错过了什么。

  1. 您需要指向脚本的绝对路径。如果您在 wizpert 上看到我的消息,我对脚本目录执行了 cd 命令以确保正确的环境:

    c:\>cd c:\my\directory\with\powershells

然后您可以执行带有所有变量的 powershell。也尝试通过 cmd 来查看它是否产生任何消息。如果您看到超时,则表示进程或正在挂起或网络用户没有足够的权限来执行 shell。

如果是这样,请修改您的 php.ini 或其他任何内容,让它知道 www-data 用户(在 apache 中,不确定在 IIS 上)有权执行命令。\

也可能是您错误地执行了该参数:

Param([string]$username, [string]$password)
Import-Module ActiveDirectory
$newpwd = ConvertTo-SecureString -String $password -AsPlainText –Force 
Set-ADAccountPassword $username -NewPassword $newpwd –Reset

在 powerscript 上制作不带引号的 $password。

【讨论】:

  • 我曾尝试在 IIS 中执行此操作,但没有运气,我也确信权限/权限有问题。 Mabey你可以通过Skype帮助我吗? Borna.aslimand 是我的 Skype。
【解决方案2】:

这是针对 Windows 2012R2 服务器 - Apache 2.4 - PHP 7.4 的解决方案

诀窍是在命令环境中切换代码页。下面显示 UTF 在 ps1 文件中得到了很好的审查,因为 test.txt 的内容包含正确的数据。

当 PowerShell 的输出返回到以代码页 850 编码的服务器时,问题就出现了。

解决方案是更改代码页 65001 (UTF8)。

这是 test.ps1

param([String]$p1)
$loc = $env:LOCALAPPDATA
"a${p1}b" | Out-File -FilePath "${loc}\test.txt" -Encoding utf8
chcp
chcp 65001
write-host "a${p1}b"
chcp 850

这是 CDM.EXE 的输出

C:\PowerShell>powershell -file test.ps1 -p1 ÆØŁódźÅ€
Active code page: 850
Active code page: 65001
aÆØŁódźÅ€b
Active code page: 850

这是PHP

echo "<pre>";
$psscriptpath = "C:/powershell/test.ps1 -p1 ÆØŁódźÅ€";
echo $psscriptpath . '<br>';
echo 'From PowerShell:<br>';
$psData = shell_exec("powershell.exe -executionpolicy remotesigned -File " . $psscriptpath);
echo $psData . '<br>';
echo 'From readfile: ';
readfile(getenv('LOCALAPPDATA') . "\\test.txt");
echo "</pre>";

这是来自我的浏览器:

C:/powershell/test.ps1 -p1 ÆØŁódźÅ€
From PowerShell:
Active code page: 850
Active code page: 65001
aÆØŁódźÅ€b
Active code page: 850

From readfile: aÆØŁódźÅ€b

最后的评论:从某个应用程序生成数据后,请始终切换回本地化代码页。

当 CMD 窗口位于 65001 mode 时,我在 CMD 窗口中遇到了一些奇怪的事情

这个技巧在使用 PostgreSQl psql.exe 输出数据时也有效。我假设 Mysql 和其他人也是如此。

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 2016-10-26
    • 2018-02-28
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多