我有一个VS 2012 MVC 4 Web角色项目,我成功地调用PowerShell脚本从角色的bin目录中,我运行后Set-ExecutionPolicy Unrestricted
从启动CMD。 该脚本包含一些蔚蓝的cmdlet,当我在本地运行项目脚本完美的作品。 然而,当我发布在Azure上的项目,在脚本一样湛蓝的cmdlet不运行。 例如:
param([string]$websiteName="itudkcloudqwerdfs", [string]$serverLogin="user", [string]$serverPass="paSS123!@#", [string]$location="North Europe")
# Create new Website
#
$website = New-AzureWebsite -Location $location -Name $websiteName
if ($website -eq $null)
{
throw "Website creation error"
exit
}
当本地运行成功地创建了一个Azure的网站,但公布,并从云服务中运行时抛出,然后退出。
当然,我用Google搜索周围的解决方案,我发现我有才能运行Azure中的cmdlet有预先安装Azure的PowerShell将Web角色。 要做到这一点,我安装了Web平台安装程序4.5,复制它的命令行工具,可执行文件,Microsoft.Web.PlatformInstaller DLL和我的天青publishsettings文件到我的Web角色的bin文件夹,我创建了一个从webpicmd安装在Azure PowerShell来一个cmd在Web角色的bin目录,进口对Web角色启动我publishsettings文件的特殊文件夹:
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的功能,看起来怪我,因为实例已经在默认情况下(Windows Server 2012中)启用了.NET 4.5功能。 无论如何,我启用了从服务器管理和脚本没有错误成功运行。 我打开PowerShell和我测试了一些Azure的cmdlet和他们的工作。 然而,即使在那之后,当我从web应用程序再次调用脚本,它仍然不运行蔚蓝的cmdlet和退出。
我在想什么? 为什么呢webpicmd需要.NET 3.5的功能? 是否有其他的解决方案呢?
更新:拉夫的评论之后,我加入到这个我的WebRole标签下ServiceDefinition.csdef中在升高的执行上下文,但蔚蓝的cmdlet仍然没有在脚本运行运行webrole:
<Runtime executionContext="elevated" />
更新:这是调用脚本的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;
}