PHP |将参数传递给Powershell脚本

时间:2014-08-18 10:33:19

标签: php shell powershell active-directory

我正在尝试创建一个运行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

2 个答案:

答案 0 :(得分:0)

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

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

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

  2. 然后您可以使用其上的所有变量执行您的powershell。还尝试通过cmd来查看它是否产生任何消息。如果您看到超时,则表示进程或挂起或Web用户没有足够的权限来执行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上制作没有引号的$密码。

答案 1 :(得分:0)

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

技巧是在命令环境中切换代码页。下面显示了由于test.txt的内容保存了正确的数据,因此ps1文件中的UTF格式得到了很好的修饰。

当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

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

65001 mode上的CMD窗口中,我遇到了需要改进的固定问题

当使用PostgreSQl psql.exe输出数据时,此技巧也适用。我认为Mysql和其他人也一样。