【问题标题】:Can't execute powershell script function using PHPs shell_exec无法使用 PHP 的 shell_exec 执行 powershell 脚本功能
【发布时间】:2018-03-02 23:29:17
【问题描述】:

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

这是相关的PHP sn-p:

            $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 参数不错。我在 burpsuit 中捕获了请求,并且知道所有正确的参数都被发送了

  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:\Windows\System32\WindowsPowerShell\v1.0\powershell.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 不能识别我的脚本呢?

非常感谢任何提示和指导。不幸的是,我无计可施。 :/

【问题讨论】:

    标签: php powershell cmd shell-exec


    【解决方案1】:

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

    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\whereis\AddRemPartners.ps1 -Add -user User -group Group
    

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

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

    【讨论】:

    • 我试过了,似乎得到了相同的结果。我更新了我的 php 以指向脚本的完整路径,并使用参数。这是最后执行的命令:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\xampp\htdocs\AddRemPartners.ps1 -Add -user guest -group group
    • 抱歉,要明确一点:如果我从 cmd 运行它,它不会给我一个关于 cmdlet 无法识别的错误。它运行,但不起作用。而如果我从 PS 运行它。我认为这可能与在模块中导入我的脚本和/或采购它有关。它似乎在与我采购它的地方相同的外壳中工作。但是一个新的shell它失败了......
    • 我更新了 ps1 脚本,使函数的第一行如下所示: function AddRemPartners ([switch]$Add, [switch]$Remove, [string]$User, [string]$ Group){ ... } AddRemPartners $User $Group
    • 请更新您问题中的脚本。最后一行应该将 add 或 remove 参数传递给函数。
    • 我不会在最后传递 -Add 或 -Remove ,因为这应该是动态的(即取决于用户)?如果 php post 请求看到选择了添加或删除按钮,它会调用相应的逻辑。也就是说,它使用其中一个标志调用脚本。如果我将它添加到最后,不会硬编码它以仅使用其中一个吗?
    猜你喜欢
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多