App-V mit Windows 10 1703 automatische Paketierung (Teil 2)

Im ersten Teil ist der automatischen Rollout eines Sequencers auf einem Hyper-V Host unter VMware Workstation beschrieben (also eine VM in einer VM). In diesem Teil beschreiben wir die neuen Möglichkeiten zu einer automatisierten Sequenzierung mit dem 1703 ADK. Voraussetzung ist eine Umgebung, die mit den Informationen aus Teil 1 aufgebaut wurde. Alle Aktionen müssen wiederum mit einer administrativen PowerShell durchgeführt werden. Wir zeigen, wie der Auto-Sequencer mit einer Steuerungsdatei zu nutzen ist. Weiterhin ein eigenes PowerShell Skript welches alle MSI und Setup.exe Dateien in einem Verzeichnis automatisiert sequenziert.

Weitere Neuerungen für App-V mit Windows 10 Enterprise 1703

Unveröffentlichte Pakete können jetzt automatisch aus dem Cache gelöscht werden. Dazu existiert die neue Konfigurationseinstellung “AutoCleanupEnabled”. Diese Funktion kann über die Gruppenrichtlinie “Enable automatic cleanup of unused appv packages” aktiviert werden oder über PowerShell mit:

Set-AppvClientConfiguration -AutoCleanupEnabled 1

Und in der Registrierung:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AppV\Client\PackageManagement AutoCleanupEnabled

Get-AppvClientPackage -all zeigt diese Pakete nicht mehr an. Zu berücksichtigen ist dabei, dass sich die Bereitstellungszeit für so ein Paket erhöht, wenn es doch einmal benötigt wird.

Ergänzung zu Teil 1

Zunächst einmal eine Ergänzung zum ersten Teil. Ich habe probiert mich mit Connect-AppVSequencerVM nach einem Neustart der VM noch einmal zu verbinden und habe gleich eine Fehlermeldung bekommen. Microsoft hat eine wichtige Variable AutoSequencingRoot nur unter der PowerShell Funktion New-AppVSequencerVM gesetzt. Wenn nun in einer neuen Sitzung keine neue VM angelegt wird, gibt es die Variable nicht. Zuvor hat das funktioniert, weil es sich um die gleiche PowerShell Sitzung gehandelt hat. Dadurch funktioniert in Zeile 9 im Modul „AutoSequencingTelemetry.psm1“ der Join-Path Befehl nicht mehr. Die Funktion Connect-AppVSequencerVM im Modul New-AppVSequencerVM.psm1 kann wie folgt ergänzt werden, damit es nicht zu dem Fehler kommt (Microsoft, here is a bug):

 

function Connect-AppVSequencerVM
{
param(
..
)
process {
Import-module …
Import-module …
Write-Host "set Root for Connect" -ForegroundColor Green #new
$Script:AutoSequencingRoot = "$PSScriptRoot\.." #new
..

Anschließend hat Connect-SequencerVM wieder funktioniert. 

 

Automatisierte Sequenzierung

Für die automatische Sequenzierung von einem oder mehreren Installationspaketen hat Microsoft den neuen Befehl „New-BatchAppVSequencerPackages“ implementiert, der über eine XML Datei steuert, was auf dem remote Sequencer passieren soll. Der offizielle Technet Artikel dazu ist hier zu finden: https://technet.microsoft.com/en-us/itpro/windows/manage/appv-auto-batch-sequencing

Der Aufruf ist wie folgt definiert:

New-BatchAppVSequencerPackages –ConfigFile –VMName -OutputPath

In diesem Artikel haben sich wiederum einige Fehler eingeschlichen, die den Prozess unmöglich machen. Derjenige, der den Artikel geschrieben hat, hat den Vorgang vermutlich nicht getestet. Hier wird es nun korrekt dokumentiert. Das Tag im Artikel ist , die xml Steuerungsdatei wird nicht mit beendet. Die Anweisung „True“ darf nicht großgeschrieben werden. Die Beispieldatei ist somit unbrauchbar und es kommt zu den folgenden Fehlermeldungen:

(The 'Cmdlet' element is invalid - The value 'True' is invalid according to its datatype oder so The element 'Application' has invalid child element 'Name'. List of possible elements expected.

Selbst das Beispiel im Installationsverzeichnis des ADK ist nicht korrekt (sample_config.xml).

Error App V Autosequencer

Die Steuerungsdatei kann mehrere Aufrufe zur Sequenzierung enthalten und kennt die folgenden „korrekten“ Anweisungen:

 Es können mehrere Applikationen in der Konfigurationsdatei existieren:

 App V Auto Sequencer Config1a

 Im Folgenden eine funktionierende Beispieldatei:

  App V Auto Sequencer Config2a

Anmerkung: Vor jedem Start die VM manuell auf einen neutralen Snapshot zurücksetzen!

 Mit dem Aufruf wird ein Snapshot der Sequencer VM erstellt und bei jedem Paket zurückgesetzt, die Dateien unter dem Ordner „InstallFolder“ werden automatisch auf den Sequencer kopiert und eine Sequenzierung eingeleitet. Nach Abschluss des Vorgangs wird das erstellte „.appv“ Paket mit alles dazugehörenden Dateien in einen Unterordner im Ordner „OutputPath“ auf den Host kopiert. 

Für diesen Vorgang wird zunächst ein Ordner „c:\Packages“ mit den Unterordnern MSI und Output auf dem Hyper-V Host angelegt. In den MSI-Ordner werden in diesem Beispiel die beiden Pakete XmlNotepad.msi und Free_AppDeploy_Repackager.msi gelegt (andere Dateien sind möglich).

Der Vorgang wird mit eingeleitet:

 

New-BatchAppVSequencerPackages -ConfigFile C:\packages\sequence.xml -VMName SEQ1 -OutputPath C:\packages\output\
Log file: C:\Users\Andreas\AppData\Local\Temp\AutoSequencer\Logs\New-BatchAppVSequencerPackages-04-14-2017-18-43-25.txt
Report file: C:\packages\output\\New-BatchAppVSequencerPackages-report-04-14-2017-18-43-27.txt
Number of applications in the batch 2
-- Start sequencing XmlNotepad  --
Applying checkpoint sequencer-base to VM..
Waiting for VM to finish starting up...
Waiting for VM session......
Copying installer to VM..
Scheduling sequencing task..
DNS Resolving for SEQ1
DNS Resolved SEQ1.localdomain
Waiting for sequencing task to start....
Sequencing task is running..........................
Sequencing task has finished running
-- Done sequencing XmlNotepad --
-- Start sequencing Free_AppDeploy_Repackager  --
Applying checkpoint sequencer-base to VM..
Waiting for VM to finish starting up...
Waiting for VM session......
Copying installer to VM..
Scheduling sequencing task..
DNS Resolving for SEQ1
DNS Resolved SEQ1.localdomain
Waiting for sequencing task to start....
Sequencing task is running.......................
Sequencing task has finished running
-- Done sequencing Free_AppDeploy_Repackager --
Sequencing complete.

Irgendwann ist das Ganze hoffentlich erfolgreich abgeschlossen und die beiden Pakete sind im Outputverzeichnis zu finden:

 

App V Auto Sequencer Outpunt
Zusätzlich existieren zwei Log Dateien in dem Verzeichnis. Weitere Logs sind unter %temp%\AutoSequencer\Logs zu finden.
Im App-V Anwendungsverzeichnis findet sich zusätzlich eine Log.txt. Darin ist zu sehen, dass jedes Paket mit dem FullLoad Parameter erzeugt wird. Was aus meiner Sicht überflüssig ist. Meist wird ein FullLoad über eine Gruppenrichtlinie erzwungen. Oft nutzen wir für unsere Umgebungen den SCS-Mode.

Update

Das Batch Update ermöglicht es, ein ganzes Verzeichnis von App-V Paketen mit einem Aufruf einem Update zu unterziehen. Dabei nutzen wir die gleichen Anweisungen, wie schon bei der Batch Paketierung. Der Technet Artikel dazu ist hier zu finden:

https://technet.microsoft.com/en-us/itpro/windows/manage/appv-auto-batch-updating 

Zusätzlich existiert der Tag Packages unter dem das App-V Paket hinterlegt ist, auf welches das Update angewendet werden soll. Der Tag „Name“ aus dem TechNet Artikel ist wiederum durch AppName zu ersetzen.

Automatische Generierung der XML Datei mit PowerShell

Es ist eine kleine Fingerübung für MSI-Dateien in einem Verzeichnis eine passende XML Datei zu generieren. Also, wenn massenhaft MSI-Pakete oder Setup Dateien nach App-V gewandelt werden sollen, kann das beispielsweise mit dem folgenden Skript durchgeführt werden (vereinfacht).

 

<#
	.SYNOPSIS
		Create a xml file to für the 1703 Auto-Sequencer to sequence msi or setup.exe files in a folder 
        Try to sequence every file!
	.PARAMETER  SetupPath
		Path to teh msi (or setup) files on the host
	.PARAMETER  XmlFile
		Output path for the xml file
	.EXAMPLE
		Create-AutoSequencerxml.ps1 -SetupPath c:\Packages\msi
	.LINK
		http://www.software-virtualisierung.de
    -Author
		Andreas Nick 2017
#>

[CmdletBinding()]
param(
	[Parameter(Position=0, Mandatory=$true)]
	[System.IO.FileInfo]$SetupPath,
	[Parameter(Position = 1, Mandatory = $true)]
	[System.IO.FileInfo] $XmlPath
)

# Create a new XML 
[System.XML.XMLDocument]$AppvXML = New-Object System.XML.XMLDocument
[System.XML.XmlNode]$AppvNode = $AppvXML.CreateXmlDeclaration("1.0", $null, $null)
$AppvXML.appendChild($AppvNode)
$AppVApps = [System.XML.XMLElement]$AppvXMLRoot = $AppvXML.CreateElement("Applications")
$AppvXML.appendChild($AppvXMLRoot)

foreach ($file in Get-ChildItem $SetupPath -Recurse -Include *.exe, *.msi)
{
	
	Write-Host "Add application :" $file.FullName -ForegroundColor Blue
	[System.XML.XMLElement]$AppNode = $AppvXML.CreateElement("Application")
	$AppVApps.AppendChild($AppNode)
	$AppNode.AppendChild($AppvXML.CreateElement("AppName")).InnerText = $file.Name.Substring(0, $file.Name.Length - 4)
	$AppNode.AppendChild($AppvXML.CreateElement("InstallerFolder")).InnerText = Split-Path $file.FullName -Parent
	$AppNode.AppendChild($AppvXML.CreateElement("Installer")).InnerText = $file.name
	if ($file.Name -match '.exe$')
	{
		$AppNode.AppendChild($AppvXML.CreateElement("InstallerOptions")).InnerText = "/s"
	}
	else
	{
		$AppNode.AppendChild($AppvXML.CreateElement("InstallerOptions")).InnerText = "/qn"
	}
	
	$AppNode.AppendChild($AppvXML.CreateElement("Cmdlet")).InnerText = "true"
	$AppNode.AppendChild($AppvXML.CreateElement("Enabled")).InnerText = "true"
}

$AppvXML.Save($XmlPath)

Für eine automatische Sequenzierung schaut das wie folgt aus:

 

 

 

Create-AutoSequencerxml.ps1 -SetupPath C:\packages\msi\ -XmlPath C:\packages\autoseq.xml | Out-Null
Add application : C:\packages\msi\Free_AppDeploy_Repackager.msi
Add application : C:\packages\msi\XmlNotepad.msi

New-BatchAppVSequencerPackages -ConfigFile C:\packages\autoseq.xml -VMName SEQ1 -OutputPath C:\packages\output\
Log file: C:\Users\Andreas\AppData\Local\Temp\AutoSequencer\Logs\New-BatchAppVSequencerPackages-04-14-2017-21-43-54.txt
Report file: C:\packages\output\\New-BatchAppVSequencerPackages-report-04-14-2017-21-43-56.txt
Number of applications in the batch 2
-- Start sequencing Free_AppDeploy_Repackager  --
Applying checkpoint sequencer-base to VM..
Waiting for VM to finish starting up...
Waiting for VM session......
Copying installer to VM..
Scheduling sequencing task..
DNS Resolving for SEQ1
DNS Resolved SEQ1.localdomain
Waiting for sequencing task to start.....
Sequencing task is running..........................
Sequencing task has finished running
-- Done sequencing Free_AppDeploy_Repackager --
-- Start sequencing XmlNotepad  --
Applying checkpoint sequencer-base to VM..
Waiting for VM to finish starting up...
Waiting for VM session....

Fazit

 

Im Allgemeinen funktioniert das Verfahren gut. Zwischenzeitlich war die Sequencer VM aber nicht mehr zu gebrauchen, weil eine Anmeldung nicht mehr möglich war (warum auch immer) – die Änderung war im Snapshot und die Vorlage musste neue erstellt werden. Was mit der Anleitung aus Teil 1 wieder sehr schnell ging. Leider scheint die Paketerstellung einige Defizite zu haben denn ein App-V Template (Filetype appvt) kann nicht angegeben werden. Damit fehlt die Möglichkeit, beispielsweise COM Interaktion zu erlauben oder Schreibrechte im VFS. Dafür wird jedes Paket mit dem Fulload Parameter erstellt, ohne die Möglichkeit dieses zu deaktivieren. Naja, wer diese Funktionen möchte, schaut sich bitte meinen Blog zur automatisierten MSI Erstellung an. Statt eines MSI Pakets oder einer Setup.exe ist übrigens ein Skript zur Sequenzierung viel sinnvoller. Dort kann man beispielsweise auch Desktopverknüpfungen automatisiert löschen und es wird zumindest in unseren weiter entwickelten Paketierungsskripten (beispielsweise für den AppBot) auch auf eine deutsche Codepage geachtet.