2016-05-02 9 views
1

Ich habe Schwierigkeiten bei der Automatisierung der Installation einer Anwendung auf einem azurblauen Rechner (Windows Server 2012 R2 Datacenter).Azure CustomScript-Erweiterung - WindowsVM - Neustart-Computer - Skript beim Start auslösen

Mein Skript wird in zwei Schritten geschrieben:

  • Schritt 1: Installation des .NET4.6.1 starten Installation
  • Schritt 2 beenden: Installation meiner Anwendung

Ich bin Ich kann mein Skript nicht neu starten, wenn der Computer ausfällt.

Es gibt Techniken ScheduldedTask oder schtasks aber es ist ein Erfolg nur dann, wenn ich in der Maschine mit Remote-Desktop angemeldet. Wenn das Skript von Azure CustomScript Extension ausgeführt wird, ist das Skript nicht für den Neustart vorgesehen.

Das Ziel ist es, eine ARM-Bereitstellung auszuführen, die meine Anwendung mithilfe der CustomScript-Erweiterung installieren wird, ohne dass mein Teil davon betroffen ist.

Hier ist mein Code, um die Wake-up-Aufgabe mit ScheduldedTask zu erstellen:

$ 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 

hier mit schtasks mein Code:

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 

Diese beiden Code das Skript auf dem VM aktivieren Wakeup, aber nur, wenn ich es über Remote Desktop laufen lasse.

Der Fehler wird angezeigt, wenn er von AzureCustomScriptExtension ausgeführt wird.

+0

Sie benötigen/wollen die geplante Aufgabe oder war das nur Ihre Abhilfe für den Neustart der Installation.NET 4.6.1? Würde es für Sie funktionieren, den Neustart der .NET-Installation zu unterdrücken, bis Ihre App installiert ist? (vorausgesetzt, Ihre App-Installation benötigt kein .NET) –

+0

Danke. Nein, ich brauche .NET4.6.1 für die Installation (wir benutzen linqpad). Und ich würde gerne in der Lage sein, mit dieser Art von Problem auch umzugehen: -D –

Antwort

1

Da die Aufgabe ausgeführt wird, wenn der Benutzer über RDP verbunden ist, denke ich an das Laden von Profilen. Ich habe festgestellt, dass KB Artikel https://support.microsoft.com/en-us/kb/2968540, die eine Lösung in Windows Server 2012 R2 sein kann.

+0

Danke für Informationen. Aber wie läuft es, wenn ich beim Start ein Skript ausführe, wie soll ich vor dem Skript beim Aufwachen ein Skript ausführen? Oder schlagen Sie vor, dass das Problem zum Zeitpunkt customScript (Schritt 1) ​​liegt? –

+0

Der KB-Artikel bezieht sich auf das Anwenden eines Hotfixes auf Windows Server 2012 R2, der ein erster Teil des Skripts sein könnte (Sie können auch ein eigenes Bild erstellen, aber ich glaube nicht, dass Sie das bevorzugen). Vielleicht könnten Sie das Hotfix versuchen, um zu sehen, ob das das Problem löst: 1. Wenden Sie Hotfix an, 2. definieren Sie das Startskript 3. versuchen Sie es, ohne RDP zu verwenden. Wenn das funktioniert, sollten Sie Schritt 1 automatisieren. – benjguin

+0

Der Patch scheint nur per E-Mail gesendet zu werden. Auf es warten. Vielen Dank –

1

Ich bin schließlich zu DSC anstelle von customScript gewechselt, um den Computer neu starten zu können. Da DSC bereits auf der Windows Virtual Machine installiert ist, denke ich, es ist nicht wirklich eine Problemumgehung. Hier

ist der Code für die 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() 
      } 
     } 
    } 
} 

Und hier ist der Code für die ARM-Bereitstellung (fügen Sie diesen Code in Ihre VM):

"resources": [ 
       { 
        "type": "extensions", 
        "name": "dscExtension", 
        "apiVersion": "2015-05-01-preview", 
        "location": "[resourceGroup().location]", 
        "dependsOn": [ 
         "[concat('Microsoft.Compute/virtualMachines/', variables('vmName'))]" 
        ], 
        "properties": { 
         "publisher": "Microsoft.Powershell", 
         "type": "DSC", 
         "typeHandlerVersion": "2.9", 
         "autoUpgradeMinorVersion": "true", 
         "settings": { 
          "modulesUrl": "[parameters('provisionUrl')]", 
          "privacy": { 
           "DataCollection": "Disable" 
          }, 
          "configurationFunction": "dscScript.ps1\\InstallDotNet", 
          "properties": { 
           "EventstoreLinqpadScriptUrl": "[parameters('provisionEsScriptUrl')]" 
          } 
         } 
        } 
       } 
      ] 
  • provisionUrl ist die URL in die DSC-Zip-Datei (mit ps1-Skript im Wurzelverzeichnis Ihrer Zip-Datei).
  • Ich benutze direkt die url concatanated zu sasToken für private Blob (azur cli kann die sasToken oder die URL mit sasToken zurück), wie es scheint, die ARM sasToken Option ist abgehört und fügt nicht die ? zwischen URL und sasToken.