如何运行PowerShell脚本Azure中的cmdlet在已发布的Web角色VS2012项目(Ho

2019-10-18 02:18发布

我有一个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;
}

Answer 1:

我面临着类似的问题,你可以看到在这个线程我看不到事件查看器中的任何异常如你,但添加这些行,每行后壳调用,我可以看到我的错误来在导入模块线。

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";
   }
}


Answer 2:

而此时,我们做了与almamouz该项目的时候,它是不可能通过Azure的REST API生成的资源,也不是有可能做到这一点通过从webrole出于安全考虑PowerShell脚本。 我们结束了使用Web和辅助角色和PowerShell脚本在工人角色上运行。 它包含了所有敏感的服务器连接信息。



文章来源: How to run Azure cmdlets from a powershell script in a published Web Role VS2012 project