Azure自定义脚本扩展--WindowsVM--重新启动计算机--启动时触发脚本

Azure自定义脚本扩展--WindowsVM--重新启动计算机--启动时触发脚本,windows,azure,automation,cloud,Windows,Azure,Automation,Cloud,我很难在azure计算机(Windows Server 2012 R2数据中心)上自动安装应用程序 我的脚本分两步编写: 步骤1:安装.NET4.6.1,然后重新启动以完成安装 步骤2:安装我的应用程序 当机器发生故障时,我无法重新启动脚本。 有使用ScheduledTask或schtasks的技术,但只有当我使用远程桌面登录计算机时,这才是成功的。当脚本由Azure CustomScript Extension运行时,不会安排脚本重新启动 目标是运行ARM部署,该部署将使用CustomSc

我很难在azure计算机(Windows Server 2012 R2数据中心)上自动安装应用程序

我的脚本分两步编写:

  • 步骤1:安装.NET4.6.1,然后重新启动以完成安装
  • 步骤2:安装我的应用程序
当机器发生故障时,我无法重新启动脚本。

有使用ScheduledTaskschtasks的技术,但只有当我使用远程桌面登录计算机时,这才是成功的。当脚本由Azure CustomScript Extension运行时,不会安排脚本重新启动

目标是运行ARM部署,该部署将使用CustomScript扩展安装我的应用程序,而无需我的任何操作

以下是我使用ScheduledTask创建唤醒任务的代码:

$ Pstart = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
$ Actionscript = "& `"C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.4\Downloads\0\MyScript.ps1`""
$ Action = New ScheduledTaskAction -execute $ pstart -argument $ actionscript
$ Trigger = New ScheduledTaskTrigger -AtStartUp
Register-ScheduledTask `
   -TaskName $TaskName `
   -Action $Action `
   -Trigger $Trigger `
   -RunLevel Highest `
   -User "$Userdomain\$Username" `
   -password $UncryptedPassword
schtasks /create `
  /RU $username `
  /PR $UncryptedPassword `
  /SC ONSTART `
  /TN $taskName `
  /TR "'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' & `"C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.4\Downloads\0\MyScript.ps1`"" `
  /RL HIGHEST
这是我的schtasks代码:

$ Pstart = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
$ Actionscript = "& `"C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.4\Downloads\0\MyScript.ps1`""
$ Action = New ScheduledTaskAction -execute $ pstart -argument $ actionscript
$ Trigger = New ScheduledTaskTrigger -AtStartUp
Register-ScheduledTask `
   -TaskName $TaskName `
   -Action $Action `
   -Trigger $Trigger `
   -RunLevel Highest `
   -User "$Userdomain\$Username" `
   -password $UncryptedPassword
schtasks /create `
  /RU $username `
  /PR $UncryptedPassword `
  /SC ONSTART `
  /TN $taskName `
  /TR "'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' & `"C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.4\Downloads\0\MyScript.ps1`"" `
  /RL HIGHEST
这两个代码激活VM唤醒上的脚本,但仅当我通过远程桌面运行脚本时。


由AzureCustomScriptExtension执行时出现错误。

当用户通过RDP连接时,任务运行时,我想到了配置文件加载。我发现这篇KB文章可能是Windows Server 2012 R2中的一个解决方案。

为了能够重新启动计算机,我最终转到了DSC而不是customScript。由于DSC已经安装在windows虚拟机上,我认为这不是一个真正的解决办法

以下是DSC的代码:

# dscScript.ps1
Configuration InstallDotNet
{
    Node "localhost"
    {
        LocalConfigurationManager
        {
            RebootNodeIfNeeded = $true
        }

        File Download_Directory 
        {
            Ensure          = "Present"
            Type            = "Directory"
            DestinationPath = "C:\DeploymentDownloads"
        }

        Script Install_dotNet461
        {
            DependsOn  = "[File]Download_Directory"
            GetScript  = { @{ Result = "" } }
            TestScript = { $false }
            SetScript  = {
                Write-Verbose "Install_dotNet461"
                $client = New-Object -TypeName System.Net.WebClient
                $url = "https://download.microsoft.com/download/E/4/1/E4173890-A24A-4936-9FC9-AF930FE3FA40/NDP461-KB3102436-x86-x64-AllOS-ENU.exe"
                $dest = "C:\DeploymentDownloads\net461.exe"
                for ($i=1; $i -le 10; $i++) {
                    try { 
                        $client.DownloadFile($url, $dest)
                    }
                    catch { 
                        $now = date
                        if ($i -eq 9) {
                            Write-Error "${$now} -- Error when downloading $url, exiting"
                            return
                        }
                        else {
                            Write-Warning "${$now} -- Error when downloading $url, attempting in a moment ..."
                        }
                        Start-Sleep $i * 2
                    }
                }

                $psi = new-object "Diagnostics.ProcessStartInfo"
                $psi.FileName = $dest 
                $psi.Arguments = " /q"
                $proc = [Diagnostics.Process]::Start($psi)
                $proc.WaitForExit()
            }
        }
    }
}
下面是ARM部署的代码(将该代码添加到您的VM中):

  • provisionUrl是指向DSC zip文件的Url(ps1脚本位于zip的根目录下)
  • 我直接使用与私有blob的sasToken关联的url(azure cli可以返回sasToken或带有sasToken的url),因为ARM sasToken选项似乎存在错误,并且没有在url和sasToken之间添加

谢谢您提供的信息。但是,由于我的问题是在启动时运行脚本,在唤醒脚本之前,我应该如何运行脚本?或者您是在暗示问题发生在customScript时间(步骤1)?KB文章是关于在Windows Server 2012 R2上应用修补程序的,这可能是脚本的第一部分(您可能也想创建自己的映像,但我认为这不是您喜欢的)。也许你可以试试热修复,看看这是否解决了问题:1。应用修补程序,2。定义启动脚本3。不用RDP就可以尝试。如果这样做有效,那么您将需要自动执行步骤1。该修补程序似乎只通过邮件发送。等待它。谢谢您是否需要/想要预定的任务,或者这只是您处理重新启动安装.NET 4.6.1的工作方法?在安装应用程序之前,禁止重新启动.NET安装是否有效?(假设您的应用程序安装不需要.NET)谢谢。不,我也需要.NET4.6.1进行安装(我们使用linqpad)。我也希望能够处理这类问题