Php 如果我尝试设置凭据,则使用exec运行PowerShell脚本将挂起

Php 如果我尝试设置凭据,则使用exec运行PowerShell脚本将挂起,php,powershell,Php,Powershell,首先我很抱歉,但我对PHP和PowerShell还很陌生,我们都必须从某个地方开始!我正在创建一个实用程序,每天的IT任务都可以从一个基于web的中央控制台执行。通过执行PowerShell脚本,我成功地查询和报告了密码过期之类的问题,但在解锁帐户时遇到了困难。我查询广告并返回一个锁定用户列表,每个用户旁边都有一个按钮来解锁他们。此按钮发布到一个php页面,该页面运行另一个powershell脚本来解锁用户。 php页面是: <?php // Get the va

首先我很抱歉,但我对PHP和PowerShell还很陌生,我们都必须从某个地方开始!我正在创建一个实用程序,每天的IT任务都可以从一个基于web的中央控制台执行。通过执行PowerShell脚本,我成功地查询和报告了密码过期之类的问题,但在解锁帐户时遇到了困难。我查询广告并返回一个锁定用户列表,每个用户旁边都有一个按钮来解锁他们。此按钮发布到一个php页面,该页面运行另一个powershell脚本来解锁用户。 php页面是:

    <?php    

    // Get the variables submitted by POST in order to pass them to the PowerShell script:
    $lockeduser = $_POST["unlock"];

    // Path to the PowerShell script.
    $psScriptPath = "C:\\code\\psphp\\ps\\unlock.ps1 $lockeduser 2>&1";

    // Execute the PowerShell script:
    exec("powershell -command $psScriptPath",$out,$ret);

    echo "<pre>";
    print_r ($out);
    print_r ($ret);
    echo "</pre>";
?>
如果我在将命令传递给PS之前回显该命令,它看起来很好,可以直接从PS执行

编辑:这与exec(或shell_exec)有关,在PS脚本设置凭据时会导致问题。如果我删除脚本的这一部分,即

$encrypted = Get-Content c:\password1.txt | ConvertTo-SecureString
它运行并返回脚本由于以下原因而失败

访问权限不足,无法执行该操作

以前有没有人遇到过这个问题,我在这上面搜索过任何东西都没有用。谢谢

进一步编辑 经过更多的测试,这是PS代码不起作用

$password = ConvertTo-SecureString "My Password" -AsPlainText -Force
如果我将方法更改为


它工作没有问题。文件中的纯文本密码显然不是我想要使用的东西。有人能测试一下,看看他们是否得到了同样的结果吗?

结果证明,这一切都是因为我是个新手。通过php页面执行脚本时,不得将其作为我的帐户运行。我的帐户是设置凭据并将其存储在文件中的帐户,因此是唯一可以对其进行解密的帐户。我已将convertto securestring方法更改为使用密钥而不是默认值,现在它可以工作。

您的计算机上有多个版本的Powershell。见文章。也许这可以解释您的“格式不正确”错误。@JeroenHeier除非您指的是仿真V2或PowerShell Core,它是不同的产品和可执行文件,否则PC上不能有多个PS版本。@JeroenHeier我可以用同样的方式运行其他脚本,所以我认为它不是多个版本。我认为这可能与权限有关。我可以手动运行ps脚本,它工作正常(使用编程凭据),但当我尝试使用exec或shell_exec执行脚本时,它会挂起。如果我在ps脚本中删除管理员凭据设置,它将运行(但由于权限不足而失败)。
$encrypted = Get-Content c:\password1.txt | ConvertTo-SecureString
$password = ConvertTo-SecureString "My Password" -AsPlainText -Force