2017-05-09 92 views
0

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

我的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>"; 

我叫consolefile从\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输出的第一行)从Web服务器上的命令提示符处运行,并在我的帐户(IIS中使用的相同帐户)上运行,一切正常,我可以获取关于链接克隆的信息。 正如您所看到的,浏览器输出报告PowerCLI命令未知。 我完全失去了,任何人都有这方面的经验?

+0

“在IIS中使用相同的帐户”?你的意思是你在正常的用户帐户下操作该deamon? – arkascha

+0

这听起来像是PATH环境变量的问题。 – arkascha

+0

是的,我运行(纯粹作为测试,我将创建一个专门的服务帐户,一旦他的作品)我的个人域管理员帐户下的IIS网站排除任何权限限制。 我看不到路径如何在这里,我指定所有文件调用的完整路径。 –

回答

1

看来在VMware的PowerCLI安装程序没有正确地添加自己的用户/机器的环境变量,这是用来填充$ ENV:PSModulePath时PowerShell的负荷。这里存储的路径决定了PowerShell可以在哪里查找模块,也有助于cmdlet自动加载。

要在跨会话持续的方式解决这个问题,你可以运行以下命令:

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

的获取PSModulePath在系统级水平的现有内容,如你在这里看到:

enter image description here

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

+0

我跑了你建议改变Env变量的PS1脚本。 但是,Env变量未被更改。 我的PS1脚本如下所示:'$ Current = [Environment] :: GetEnvironmentVariable('PSModulePath','Machine') $ Current + ='; C:\ Program Files(x86)\ VMware \ Infrastructure \ vSphere PowerCLI \模块' [环境] :: SetEnvironmentVariable('PSModulePath',$ Current,'Machine') write-host($ env:psmodulepath)',它只输出 C:\ Windows \ system32 \ WindowsPowerShell \ v1.0 \ Modules \ –

+0

我应该提到 - 你只需要运行一次,以管理员身份提升PowerShell。在您的PowerCLI脚本中,如果它仍然输出最后一行,则尝试使第一行为'$ env:PSModulePath = $ env:PSModulePath +'; C:\ Program Files(x86)\ VMware \ Infrastructure \ vSphere PowerCLI \ Modules '' - 我们在PS1脚本中使用这种格式的行来添加一个自定义模块位置,该位置位于通常区域之外,并且运行良好。除此之外,我只能认为这是与服务器OS/IIS/WMF版本有关...(如果可以的话,总是升级WMF)。 – Robin

+0

从高架PowerShell运行路径扩展命令不会改变Web输出中的任何内容。 将'$ env:PSModulePath = $ env:PSModulePath +'; C:\ Program Files(x86)\ VMware \ Infrastructure \ vSphere PowerCLI \ Modules''添加到我的脚本中,但是解决了所有问题。我现在可以从PHP运行PowerCli命令。 非常感谢! –