无法使用 PHP 执行 powershell 脚本函数 shell_exec
Can't execute powershell script function using PHPs shell_exec
我正在尝试将来自 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
我知道的事情:
phppost参数好。我在 burpsuit 中捕获了请求,并且知道所有正确的参数都已发送
生成的 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.
我认为这是 suspect/culpable,因为我需要 运行 PHP。所以 PHP 可能 运行 遇到了同样的问题。那么,如果我在执行的同时调用 powershell,为什么 cmd 无法识别我的脚本?
非常感谢任何tips和指导。不幸的是,我束手无策。 :/
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 页面的 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
我知道的事情:
phppost参数好。我在 burpsuit 中捕获了请求,并且知道所有正确的参数都已发送
生成的 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.
我认为这是 suspect/culpable,因为我需要 运行 PHP。所以 PHP 可能 运行 遇到了同样的问题。那么,如果我在执行的同时调用 powershell,为什么 cmd 无法识别我的脚本?
非常感谢任何tips和指导。不幸的是,我束手无策。 :/
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, ...);