无法使用PHP shell_exec执行powershell脚本函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法使用PHP shell_exec执行powershell脚本函数相关的知识,希望对你有一定的参考价值。

我正在尝试将php页面的POST请求中的参数传递给powershell脚本。

这是相关的PHP代码段:

            $selectedPartner = $_POST['partner'];
            $selectedGroup = $_POST['group'];
            $script = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe AddRemPartners";
            if (isset($_POST['partner']) && isset($_POST['group'])){
                if (isset($_POST['AddButton']) && $selectedPartner !== "Select Partner" && $selectedGroup !== "Select Group") {
                    echo "<br>";
                    echo "Adding " . $selectedPartner . " to " . $selectedGroup . "...<br>";
                    $cmd = $script . " -Add $selectedPartner $selectedGroup";
                    echo "command is:<br>" . $cmd;
                    shell_exec($cmd);

                    //shell_exec('C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\xampp\htdocs\admin\AddRemPartners.ps1 -Add $selectedPartner //$selectedGroup');


                    //$command = shell_exec('C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe telnet 10.11.14.32 4444');
                    //echo "User added successfully!";
                }
                if (isset($_POST['RemoveButton']) && $selectedPartner !== "Select Partner" && $selectedGroup !== "Select Group") {
                    echo "<br>";
                    //echo "selection was REMOVE";
                }       
            }

这是我的powershell脚本:

Param([switch]$Add, [switch]$Remove, [string]$User, [string]$Group)

$secpasswd = ConvertTo-SecureString "P@sSw0rd" -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ("userPortal", $secpasswd)
$server = "host.fqdn"

function AddRemPartners
{ 
    if ($Add){
    Write-Host "Add var = $Add"
    Write-Host "Add was selected"
    Add-ADGroupMember -Server $server -Credential $creds -Identity $Group -Member $User
    }
    if ($Remove) {
    Write-Host "Remove var = $Remove"
    Write-Host "Remove was selected"
    Remove-ADGroupMember -Server $server -Credential $creds -Identity "$Group" -Member "$User" -Confirm:$false
    }
}
AddRemPartners -Add $Add -Remove $Remove -User $User -Group $Group

我知道的事情:

  1. php post参数很好。我在burp套件中捕获了请求,并且知道所有正确的args都被发送了
  2. 生成的结果ps查询也很好。我将它输出到屏幕,它看起来像这样: C: Windows System32 WindowsPowerShell v1.0 powershell.exe AddRemPartners -Add Dude1 Dude1Group
  3. 没有网络问题。如果我直接从PowerShell中运行上面的命令就可以正确执行。
  4. 我使用了我的脚本。 。 AddRemPartners.ps1所以我可以直接调用我的函数: PS> AddRemPartners - 添加用户组 PS> AddRemPartners - 删除用户组

我把它缩小到这个:我不能像这样从cmd执行我的ps脚本:

C:WindowsSystem32WindowsPowerShellv1.0powershell.exe AddRemPartners -Add User Group

因为这个错误:

AddRemPartners : The term 'AddRemPartners' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the
name, or if a path was included, verify that the path is correct and try again.

我相信这是可疑/有罪的,因为我需要在PHP中运行它。所以PHP可能遇到了同样的问题。那么,如果我在执行的同时调用powershell,为什么cmd不会识别我的脚本?

任何提示和指导非常感谢。不幸的是,我很有智慧。 :/

答案

PS的第一个参数应该是脚本的完整路径。然后你应该像在脚本中那样在命令行上尊重PS的参数定义。

C:WindowsSystem32WindowsPowerShellv1.0powershell.exe C:whereisAddRemPartners.ps1 -Add -user User -group Group

脚本的第一行应该是参数定义和默认值。

param([string]$user, [string]$group, [switch]$Add, ...);

以上是关于无法使用PHP shell_exec执行powershell脚本函数的主要内容,如果未能解决你的问题,请参考以下文章

LINUX+NGINX下的PHP shell_exec()函数执行linux命令 2019-08-08

PHP协程:并发 shell_exec

php执行外部命令函数:exec()passthru()system()shell_exec()对比

PHP执行系统外部命令函数:exec()passthru()system()shell_exec()

PHP 中的 shell_exec()

phpPHP执行系统外部命令函数:exec()passthru()system()shell_exec()