У меня есть проект веб-роли VS MVC 4, и я успешно вызвал сценарий powershell из каталога bin этой роли после запуска Set-ExecutionPolicy Unrestricted
из startup cmd. Сценарий содержит некоторые синие командлеты, и когда я запускаю проект локально, сценарий работает отлично. Однако, когда я публикую проект на Azure, те же сиреневые командлеты в скрипте не запускаются. Например:Как запустить командлеты Azure из сценария powershell в опубликованной веб-роли Проект VS2012
param([string]$websiteName="itudkcloudqwerdfs", [string]$serverLogin="user", [string]$serverPass="[email protected]#", [string]$location="North Europe")
# Create new Website
#
$website = New-AzureWebsite -Location $location -Name $websiteName
if ($website -eq $null)
{
throw "Website creation error"
exit
}
Конечно, я искал решение для решения проблемы, и я обнаружил, что мне нужно предварительно установить Azure Powershell в роли Web, чтобы запускать там командлеты Azure. Для этого я установил установщик веб-платформы 4.5, скопировал свой инструмент командной строки, исполняемый с dll Microsoft.Web.PlatformInstaller, и файл настроек публикации Azure в папку bin в моей веб-роли, и я создал cmd, который устанавливает Azure Powershell из webpicmd в специальная папка, в веб-роли в каталог бен и импортирует мой publishsettings файл при запуске Web Role:
md "%~dp0appdata"
cd "%~dp0appdata"
cd..
reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" /v "Local AppData" /t REG_EXPAND_SZ /d "%~dp0appdata" /f
"%~dp0\WebpiCmd.exe" /Install /AcceptEula /Products:WindowsAzurePowershell /log:%~dp0WindowsAzurePowershell.log
reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" /v "Local AppData" /t REG_EXPAND_SZ /d %%USERPROFILE%%\AppData\Local /f
powershell Import-AzurePublishSettingsFile
exit /b 0
Он по-прежнему не работает, поэтому я удаленно войти в систему экземпляра, чтобы увидеть для себя то, что может быть не так. Я попытался запустить сценарий cmd выше, и для него потребовалась функция .NET Framework 3.5, которая выглядит странно для меня, поскольку у экземпляра уже включена функция .NET 4.5 по умолчанию (Windows Server 2012). Во всяком случае, я включил его из диспетчера сервера, и сценарий успешно работал без ошибок. Я открыл PowerShell, и я проверил некоторые агенты Azure, и они сработали. Однако даже после этого, когда я снова вызываю скрипт из веб-приложения, он все еще не запускает командлеты azure и выходы.
Что мне не хватает? И почему webpicmd требует функцию .NET 3.5? Есть ли альтернативное решение?
Update: После комментария Gaurav, я добавил это в моем servicedefinition.csdef под тегом WebRole запустить WebRole в поднятом контексте выполнения, но лазурные командлеты до сих пор не работает в сценарии:
<Runtime executionContext="elevated" />
Update: Вот # код C, который вызывает сценарий
//create command
string path = HttpContext.Server.MapPath("/bin/InitializeResources.ps1");
PSCommand cmd = new PSCommand();
cmd.AddCommand(path);
cmd.AddParameter("websiteName", websiteName);
cmd.AddParameter("serverLogin", username);
cmd.AddParameter("serverPass", password);
cmd.AddParameter("location", location);
//set the command into a powershell object and invoke it
Runspace runspace = RunspaceFactory.CreateRunspace();
PowerShell ps = PowerShell.Create();
ps.Commands = cmd;
try
{
runspace.Open();
RunspaceInvoke runSpaceInvoker = new RunspaceInvoke(runspace);
runSpaceInvoker.Invoke("Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force");
ps.Runspace = runspace;
Collection<PSObject> commandResults = ps.Invoke();
//save results
WebsiteInfo websiteInfo = new WebsiteInfo();
foreach (PSObject result in commandResults)
{
websiteInfo.Connectionstring = (string)result.Members["ConnectionString"].Value;
websiteInfo.WebsiteURL = (string)result.Members["WebsiteUrl"].Value;
websiteInfo.ftpUrl = (string)result.Members["SelfLink"].Value;
websiteInfo.ftpUrl = websiteInfo.ftpUrl.Substring(8);
int index = websiteInfo.ftpUrl.IndexOf(":");
if (index > 0)
websiteInfo.ftpUrl = websiteInfo.ftpUrl.Substring(0, index);
websiteInfo.ftpUrl = websiteInfo.ftpUrl.Replace("api", "ftp");
websiteInfo.publishUsername = (string)result.Members["Repository"].Value + "\\" + (string)result.Members["PublishUsername"].Value;
websiteInfo.publishPassword = (string)result.Members["PublishPassword"].Value;
}
runspace.Dispose();
runspace = null;
ps.Dispose();
ps = null;
}
Можете ли вы проверить журналы событий и посмотреть, что там зарегистрировано? Также, принимая полное дикое предположение, может ли это быть связано с разрешениями, связанными с учетной записью пользователя, под которой выполняется веб-роль? Вы можете попробовать запустить веб-роль с повышенными привилегиями [Опять же ... просто гадать] –
Журналы событий не показывают ничего связанного. Что касается сценария powershell, я вызываю его из C# с помощью объекта PSCommand. Разве недостаточно «Set-ExecutionPolicy Unrestricted» для решения проблем с правами?Если нет, то как я могу программным образом на C# поднять их до запуска сценария? – grazzt