Utilisation de Powershell L’API d’installation de W / Web Platform n’extrait que les installateurs x86 sur une machine 64 bits

J’essaie d’écrire un script pour automatiser l’installation du package de routage de demande d’application sur un serveur x64 Windows Server 2012 R2 avec IIS 8 et Web Platform Installer 5. J’ai reproduit le code que j’utilise ci-dessous:

Try { [reflection.assembly]::LoadWithPartialName("Microsoft.Web.PlatformInstaller") | Out-Null $ProductManager = New-Object Microsoft.Web.PlatformInstaller.ProductManager $ProductManager.Load() $product = $ProductManager.Products | Where { $_.ProductId -eq "ARRv3_0" } #Get an instance of InstallManager class to perform package install $InstallManager = New-Object Microsoft.Web.PlatformInstaller.InstallManager $installer = New-Object 'System.Collections.Generic.List[Microsoft.Web.PlatformInstaller.Installer]' $Language = $ProductManager.GetLanguage("en") #Get dependencies $deplist = New-Object 'System.Collections.Generic.List[Microsoft.Web.PlatformInstaller.Product]' $deplist.add($product) $deps = $product.getMissingDependencies($deplist) foreach ($dep in $deps) { Write-Host "$($dep.GetInstaller($Language))" $Installer.Add($dep.GetInstaller($Language)) Write-Host "Dependency $($dep.Title) not found..." } $installer.Add($product.Installers[1]) $InstallManager.Load($installer) #Download the installer package $failureReason=$null foreach ($installerContext in $InstallManager.InstallerContexts) { $InstallManager.DownloadInstallerFile($installerContext, [ref]$failureReason) Write-Host $($installerContext) } $InstallManager.StartSynchronousInstallation() notepad $product.Installers[1].LogFiles Write-Host "Opening logs at $($product.Installers[1].LogFiles)" Write-Host "Installation finished" } Catch { Write-Error "FATAL ERROR! $($_)" } Finally { Write-Host "Press any key to continue ..." $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") } 

Le ARRv3_0 a deux dépendances, ExternalCache et UrlRewrite2.

Cependant, quand j’essaie de tirer les installateurs en utilisant:

 $Language = $ProductManager.GetLanguage("en") $installer.Add($dep.GetInstaller($Language)) 

(où $ dep est la référence au produit), il récupère uniquement la version x86, qui ne sera pas installée sur une machine 64 bits. J’ai parcouru le fichier ProductList Xml qui contient une liste des packages de plate-forme Web, et j’ai copié et collé sous l’occurrence d’une variante x64 du package UrlRewrite2, qui existe.

  20 en     ......  

Chose intéressante, il existe un paramètre d’architecture, mais en regardant l’ API Microsoft.Web.PlatformInstaller, il ne semble pas y avoir de moyen de le définir / d’y accéder. À part le codage en dur, existe-t-il un moyen possible de demander à l’API d’extraire les versions 64 bits à la place?

J’exécute définitivement ceci dans un PowerShell 64 bits sur une machine 64 bits, mais il semble incroyablement contre-intuitif que l’API irait chercher les installateurs x86. Y a-t-il un paramètre incroyablement évident (et mal documenté) qui me manque?

La classe Product en tant que propriété Installers. Au lieu d’obtenir le programme d’installation par défaut, j’obtiens un programme d’installation spécifique (64 bits) et l’ajoute à une liste générique d’installateurs transmise en tant qu’argument à InstallManager. Voici l’extrait de code.

 $installers = New-Object 'System.Collections.Generic.List[Microsoft.Web.PlatformInstaller.Installer]' foreach($i in $product.Installers) { if($i.InstallerFile.InstallerUrl.ToSsortingng().ToLower().EndsWith("_amd64.msi")) { $i.InstallerFile $installers.Add($i) break } }