我正在尝试创建一个运行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
答案 0 :(得分:0)
您需要指向脚本的绝对路径。如果你在wizpert上看到我的消息,我对脚本目录执行了cd命令以确保正确的环境:
c:\> cd c:\ my \ directory \ with \ powershells
然后您可以使用其上的所有变量执行您的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)
技巧是在命令环境中切换代码页。下面显示了由于test.txt
的内容保存了正确的数据,因此ps1文件中的UTF格式得到了很好的修饰。
当PowerShell的输出返回到代码页850中编码的服务器时,就会出现问题。
这是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和其他人也一样。