Using Powershell W/ Web Platform Installer API Only Fetches x86 Installers on 64 bit Machine

1.1k Views Asked by At

I'm trying to write a script to automate the installation of the Application Request Routing package on a x64 Windows Server 2012 R2 with IIS 8 and Web Platform Installer 5. I've reproduced the code I'm using below:

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

The ARRv3_0 has two dependencies, ExternalCache and UrlRewrite2.

However, when I try to pull the installers using:

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

(where $dep is the reference to the product) it only fetches the x86 version, which will not install on a 64 bit machine. I've looked through the ProductList Xml that contains a listing of the Web Platform Packages here, and I've copied and pasted below the occurrence of an x64 variant of the UrlRewrite2 package, which exists.

<installer>
    <id>20</id>
    <languageId>en</languageId>
    <architectures>
        <x64/>
    </architectures>
    <eulaURL>
    ......
</installer>

Interestingly enough, there's an architecture parameter, but looking at the Microsoft.Web.PlatformInstaller API there doesn't seem to be a way to set/access it. Other than hardcoding, is there any possible way to tell the API to fetch the 64 bit versions instead?

I'm definitely running this in a 64 bit powershell on a 64 bit machine, but it seems incredibly counter intuitive that the api would fetch x86 installers. Is there some incredibly obvious (and poorly documented) setting that I'm missing?

1

There are 1 best solutions below

1
On

The Product class as the Installers property. Instead of getting the default installer, I get a specific installer (64bit) and add it to a generic list of installers that is passed as argument to the InstallManager. Here is the snippet.

$installers = New-Object 'System.Collections.Generic.List[Microsoft.Web.PlatformInstaller.Installer]'

foreach($i in $product.Installers)
{        
        if($i.InstallerFile.InstallerUrl.ToString().ToLower().EndsWith("_amd64.msi"))
        {            
            $i.InstallerFile
            $installers.Add($i)
            break
        }
}