Я хочу создать небольшой веб-интерфейс, чтобы предоставить нашим пользователям определенные разрешения для обработки связанных клонов.
На веб-сервере (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 неправильно добавил себя в переменные среды пользователя / компьютера, которые используются для заполнения $ Env: PSModulePath при загрузке PowerShell. Сохраненные здесь пути определяют, где PowerShell может искать модули, а также помогают автозагрузке командлетов.
Чтобы решить эту проблему способом, который сохраняется между сеансами, вы можете выполнить следующее:
$Current = [Environment]::GetEnvironmentVariable('PSModulePath','Machine')
$Current += ';C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Modules'
[Environment]::SetEnvironmentVariable('PSModulePath',$Current,'Machine')
Получает существующее содержимое PSModulePath на уровне СИСТЕМЫ, как вы можете видеть здесь:
и добавляет к нему путь к модулю VMware PowerCLI, наконец устанавливая его, вызывая метод SetEnvironmentVariable.
Других решений пока нет …