2013-04-24 6 views
1

У меня есть проект веб-роли 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; 
} 
+0

Можете ли вы проверить журналы событий и посмотреть, что там зарегистрировано? Также, принимая полное дикое предположение, может ли это быть связано с разрешениями, связанными с учетной записью пользователя, под которой выполняется веб-роль? Вы можете попробовать запустить веб-роль с повышенными привилегиями [Опять же ... просто гадать] –

+0

Журналы событий не показывают ничего связанного. Что касается сценария powershell, я вызываю его из C# с помощью объекта PSCommand. Разве недостаточно «Set-ExecutionPolicy Unrestricted» для решения проблем с правами?Если нет, то как я могу программным образом на C# поднять их до запуска сценария? – grazzt

ответ

0

я столкнулся с подобной проблемой, как вы можете видеть, что я мог in this thread не вижу никаких исключений в Event Viewer, как вы, но добавляя эти строки после каждого вызова оболочки, я мог видеть, что мои ошибки появляются в строке Import-Module.

if (shell1.Streams.Error.Count > 0) 
{ 
    for (int i = 0; i < shell1.Streams.Error.Count; i++) 
    { 
     ResultBox.Text += "Error: " + shell1.Streams.Error[i] + "\r\n"; 
    } 
} 
0

В то время, когда мы делали этот проект с almamouz, не было возможности генерировать ресурсы с помощью Azure REST API и не удалось сделать это с помощью Powershell сценариев из WebRole из-за соображений безопасности. Мы закончили использование ролей в Интернете и рабочих, а сценарий powershell выполнялся в роли рабочего. В нем содержится вся конфиденциальная информация о подключении к серверу.

 Смежные вопросы

  • Нет связанных вопросов^_^