我正在尝试将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

我知道的事情:
  • php post参数很好。我在burpsuit中捕获了请求,并且知道所有正确的args都已发送给
  • 构建的结果ps查询也很好。我将其输出到屏幕,看起来像这样:

    C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe AddRemPartners-添加Dude1 Dude1Group
  • 没有网络问题。如果我直接从PowerShell内部运行上述命令,则将正确执行。
  • 我使用来获取脚本。 。\ 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无法识别我的脚本?

    任何提示和指导,不胜感激。我很不幸。 :/

    最佳答案

    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, ...);
    

    10-07 19:10
    查看更多