How to install IIS URL Rewrite Module on Windows Server 2016 & IIS 10

When you start to play with Windows Server 2016 and IIS 10, you'll get an error when you try to install the IIS URL Rewrite Module in IIS. The error occurs because the URL Rewrite Module installer contains an invalid version check for the IIS being used. Here is how to install IIS URL Rewrite Module 2 in IIS 10...
Published on Monday, 30 May 2016

Screenshot by Jan Reilink

You can't install IIS URL Rewrite Module on Windows Server 2016 and IIS 10.0, because it exits with an incompatibility error "IIS version 7.0 or greater is required to install IIS URL Rewrite Module 2.". Looks like the installer tries to compare strings as version numbers. But don't worry, here is how to successfully install IIS URL Rewrite Module in IIS 10.

IIS URL Rewrite Module 2 installation error

If IIS URL Rewrite Module is not installed in Windows Server 2016 IIS 10, and you try to install this module, the IIS URL Rewrite Module 2 installation exits (quits) with the following error message:

IIS version 7.0 or greater is required to install IIS URL Rewrite Module 2.

IIS URL Rewrite Module installation error IIS 10

The solution to successfully install URL Rewrite Module in IIS is quite easy: change IIS' version number in the registry. Whut? Yes, change IIS' version number in the registry.

Change IIS' version number in the registry and install URL Rewrite Module successfully

Protip Create registry keys and values silently with Powershell

You can use the following PowerShell snippet to change IIS' version number in the Windows Server registry, allowing you to successfully install the IIS URL Rewrite Module:

# Install URL Rewrite module in Windows Server 2016 for IIS
if ( $osversion -ge "10.0" ) {
  Write-Host "[!] urlrewrite.msi installation checks the Windows Server IIS version `
    in the registry. This fails on Server 2016. `
    So temporarily change IIS version in the registry."
  $registryPath = "HKLM:\Software\Microsoft\InetStp"
  $Name = "MajorVersion"
  $currentValue = (Get-ItemProperty "hklm:Software\Microsoft\InetStp").MajorVersion
  $newvalue = "7"
  New-ItemProperty -Path $registryPath -Name $name -Value $newvalue -PropertyType DWORD -Force | Out-Null
}

Here you save the current IIS version in the variable $currentValue, so you can easily restore the version number back to this original version.

Before fiddling with the registry and IIS, make sure to make proper IIS backups first.

Restore IIS' version number back After the URL Rewrite Module's installation, you need to restore the IIS' version number back to its original value:

if ( $osversion -ge "10.0" ) {
  Write-Host "[!] Reset IIS version in the registry"
  $registryPath = "HKLM:\Software\Microsoft\InetStp"
  $Name = "MajorVersion"
  New-ItemProperty -Path $registryPath -Name $name -Value $currentvalue -PropertyType DWORD -Force | Out-Null
}

An updated version of IIS URL Rewrite is available for download: https://www.iis.net/downloads/microsoft/url-rewrite#additionalDownloads. Therefore, the above steps are no longer necessary in Windows Server 2016 RTM.

How to get the Windows Server version using PowerShell?

If you want to find out the Windows Server version you're running in PowerShell you can use this PowerShell snippet to easily and quickly look up the Windows Server version and store it in variables:

$osversion = [System.Environment]::OSVersion.Version
$major = $osversion.Major
$minor = $osversion.Minor

Set-Variable -name windowsversion -value "$major.$minor" -scope script
# $windowsversion now contains: 10.0

A shorter variant is:

$osversion = [System.Environment]::OSVersion.Version
if ($osversion -ge (New-Object System.Version "10.0")) {
  Write-Host "Windows Server 2016"
}

Or use WMI/CIM's Win32_OperatingSystem class, for example:

(Get-CimInstance -class Win32_OperatingSystem).Caption

This'll return something like Microsoft Windows Server 2016 Standard.

Protip WMI Filters for Group Policy to manage Windows Server versions