Rick Strahl's Web Log

Wind, waves, code and everything in between...
ASP.NET • C# • HTML5 • JavaScript • AngularJs
Contact   •   Articles   •   Products   •   Support   •   Search
Ad-free experience sponsored by:
ASPOSE - the market leader of .NET and Java APIs for file formats – natively work with DOCX, XLSX, PPT, PDF, images and more

Automating IIS Feature Installation with Powershell


Automagicking

Here's an oldie but goodie, that keeps coming up for me rather frequently. I've been working with IIS on Windows for a loooong time and I have a number of products that go way back that run on IIS. As a result I deal with a lot of support issues around IIS and people who install IIS run an application for years, have their servers eventually break down and then have to reinstall years after their last install. And a lot of times the people who set up the system are long gone.

The chief complaints I hear frequently is that it's a pain to get IIS to install initially with all the right components. I tend to agree - especially on Server versions installing IIS through the insanely user hostile Server Manager interface is a pain.

But there's an easier, quicker and repeatable way if you're willing to dive into the command line or create and run a small Powershell script.

Enter Enable-WindowsOptionalFeature

Apparently many people are unaware that in recent versions of Windows - using Powershell - you can automate the IIS Features installation using a few simple Powershell Commandlet calls. It's as easy as creating a small PowerShell script file and letting her rip.

You can use the Enable-WindowsOptionalFeature command to install IIS Features as well as any other Windows Features. This command works both on desktop and server versions (server versions also have Enable-WindowsFeature which has the same effect) and makes it pretty easy to automate an IIS install by whittling away a few commands in a POSH script file.

Here's what I typically use to configure my base version of IIS:

Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerRole
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServer
Enable-WindowsOptionalFeature -Online -FeatureName IIS-CommonHttpFeatures
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpErrors
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ApplicationDevelopment
Enable-WindowsOptionalFeature -Online -FeatureName IIS-NetFxExtensibility45
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HealthAndDiagnostics
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpLogging
Enable-WindowsOptionalFeature -Online -FeatureName IIS-LoggingLibraries
Enable-WindowsOptionalFeature -Online -FeatureName IIS-RequestMonitor
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpTracing
Enable-WindowsOptionalFeature -Online -FeatureName IIS-Security
Enable-WindowsOptionalFeature -Online -FeatureName IIS-RequestFiltering
Enable-WindowsOptionalFeature -Online -FeatureName IIS-Performance
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerManagementTools
Enable-WindowsOptionalFeature -Online -FeatureName IIS-IIS6ManagementCompatibility
Enable-WindowsOptionalFeature -Online -FeatureName IIS-Metabase
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ManagementConsole
Enable-WindowsOptionalFeature -Online -FeatureName IIS-BasicAuthentication
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WindowsAuthentication
Enable-WindowsOptionalFeature -Online -FeatureName IIS-StaticContent
Enable-WindowsOptionalFeature -Online -FeatureName IIS-DefaultDocument
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebSockets
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ApplicationInit
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ASPNET
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ASPNET45
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ISAPIExtensions
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ISAPIFilter
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpCompressionStatic

You can tweak and fiddle with the features you actually need for IIS, but the above is pretty standard for my base installs.

Put the above into a POSH script file (SetupIIS.ps1) and then:

  • Open a PowerShell command prompt using Run as Administrator
  • Run the script

What's Available?

Commands like this are great, as long as you know what's available. Luckily it's easy to figure out what's available and what's installed and what's not.

Check for Installed Features:

Get-WindowsOptionalFeature -Online | where {$_.state -eq "Enabled"} | ft -Property featurename

Check for Features available but Not Installed

Get-WindowsOptionalFeature -Online | where {$_.state -eq "Disabled"} | ft -Property featurename

Disable a Windows Feature

Disable-WindowsOptionalFeature -Online -FeatureName IIS-DirectoryBrowsing

Create an IIS Application Pool and Web Site

Once IIS is installed you can then configure IIS via more powershell helpers by using the WebAdministration powershell module (most like already installed):

Import-Module WebAdministration 

Once installed it's easy to create a new WebSite and Application Pool.

To create an Application Pool:

New-WebAppPool -name "NewWebSiteAppPool"  -force

$appPool = Get-Item -name "NewWebSiteAppPool" 
$appPool.processModel.identityType = "NetworkService"
$appPool.enable32BitAppOnWin64 = 1
$appPool | Set-Item

Then to create a Web Site:

md "c:\Web Sites\NewWebSite"

# All on one line
$site = $site = new-WebSite -name "NewWebSite" 
                            -PhysicalPath "c:\Web Sites\NewWebSite" 
                            -HostHeader "home2.west-wind.com"
                            -ApplicationPool "NewWebSiteAppPool" 
                            -force

Discover Features with PowerShell ISE

There are obviously a lot more options you can set on these components, but it's easy to find out about those. I also recommend that while you're discovering features, use the PowerShell ISE shell (run from the Start menu using Run as Administrator) to discover what's available:

Figure 1 - Powershell ISE lets you get Intellisense on commands and live object instances

The Intellisense in the editor and the command window gives you live property values on commands and even live objects as shown in the Figure 1 which makes it relatively easy to figure out settings. For the rest the various cmd-lets and admin objects are well documented and searchable.

Summary

None of this is new of course, but it's always good to be reminded that you can automate installation and configuration of IIS relatively easily. This is especially true since I just this week I heard from several people how much of a pain IIS can be to install and get up and running. It doesn't have to be this way... the tools are there.

Posted in IIS  Windows  

The Voices of Reason


 

Rich
May 26, 2017

# re: Automating IIS Feature Installation with Powershell

Very useful Rick! For some reason IIS does not come as standard with the very useful feature to import an application as a ZIP file and Microsoft make it super hard to find the link to download that add-on. It forces you to first install the "Web Platform Platform Installer Platform" or something, and then find an obscure link. I'm guessing that can't be done from PowerShell, but it sure would be useful.


SomeUser
May 27, 2017

# re: Automating IIS Feature Installation with Powershell

Rich,

Web Deploy can be downloaded without WebPI (https://www.iis.net/downloads/microsoft/category/deploy-and-migrate). While it is possible to use PowerShell (or any other scripting toy, or msiexec) to get the bits installed, the installer's user interface is the only documented way to fully customize the setup.


Jon
May 30, 2017

# re: Automating IIS Feature Installation with Powershell

This looks good, Rick. I ended up doing something similar with Desired State Configuration (DSC) to configure IIS the way that I wanted. https://msdn.microsoft.com/en-us/powershell/dsc/windowsfeatureresource This simplifies the re-running of my configuration script, but doesn't always provide the level of granularity that I need. I combined it with non-DSC PowerShell that manually checks to see if things are already configured, and now have a re-runnable script that I can run on my "pet" servers. Maybe this will become less important once I start treating my servers more like cattle, and stand up new ones every deployment.

 

West Wind  © Rick Strahl, West Wind Technologies, 2005 - 2017