从 PHP 调用 PowerCLI 脚本

Call PowerCLI script from PHP

我想构建一个小型网络界面来授予我们的用户某些处理链接克隆的权限。 在网络服务器 (Windows Datacenter 2008 R2 运行 IIS) 上,我安装了 PowerCLI。该网站在我的用户帐户(域管理员)下运行,以排除任何权限问题。

我的 PHP 文件如下所示:

$PowerCliCommand="C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -PSConsoleFile \"C:\Progra~2\VMware\Infrastructure\vSphere PowerCLI\vim.psc1\" -file C:\inetpub\lcmgmt\listlcs.ps1";
echo $PowerCliCommand . "<br>";
exec($PowerCliCommand, $Output, $ErrorReturned);
echo "<pre>";
print_r($Output);

print_r($ErrorReturned);
echo "</pre>";

我从 \progra~2 调用控制台文件,因为 \program files (x86) 一直用问题困扰我。

PHP在我的浏览器中的输出如下:

C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -PSConsoleFile C:\Progra~2\VMware\Infrastructure\vSphere PowerCLI\vim.psc1" -file C:\inetpub\lcmgmt\listlcs.ps1
Array 
(   
    [0] => Connect-VIserver : The term 'Connect-VIserver' is not recognized as
> the name of
    [1] =>  a cmdlet, function, script file, or operable program. Check the spelling of th
    [2] => e name, or if a path was included, verify that the path is correct and try agai
    [3] => n.
    [4] => At C:\inetpub\lcmgmt\listlcs.ps1:4 char:2
    [5] => +  Connect-VIserver -server "MyVSserver"

调用的 PowerShell 脚本如下所示:

Connect-VIserver -server "MyVSserver"
$VDICluster=get-cluster -Name "MyCluster"
get-vm -location  $VDICluster -name "Server*"

当从网络服务器上的命令提示符调用完整命令(我的 PHP 输出中的第一行)时,运行 在我的帐户(IIS 中使用的相同帐户)上,一切正常很好,我得到了关于我的链接克隆的信息。 如您所见,浏览器输出报告 PowerCLI 命令未知。 我完全迷路了,有人有这方面的经验吗?

VMware PowerCLI 安装程序似乎没有将自身正确添加到 user/machine 环境变量中,这些变量用于在 PowerShell 加载时填充 $Env:PSModulePath。此处存储的路径决定了 PowerShell 可以在何处查找模块,还有助于 cmdlet 自动加载。

要以跨会话持续存在的方式解决此问题,您可以运行以下操作:

$Current = [Environment]::GetEnvironmentVariable('PSModulePath','Machine')
$Current += ';C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Modules'
[Environment]::SetEnvironmentVariable('PSModulePath',$Current,'Machine')

在系统范围内获取 PSModulePath 的现有内容,如您在此处所见:

并将 VMware PowerCLI 模块路径附加到它,最后通过调用 SetEnvironmentVariable 方法对其进行设置。