If you manage Windows Servers, you've likely worked with Internet Information Services (IIS). Websites are one of IIS's main features and, using PowerShell, you can easily manage and automate IIS websites with ease!

In this article, you’ll be introduced to a new way to manage IIS using PowerShell. Using the techniques in this article, you can easily build a PowerShell script to create an IIS website.

To manage IIS with PowerShell requires one of two PowerShell modules - WebAdminstration or IISAdminstration. This article covers the more modern IISAdministration module. The companion video to this article demonstrates the older WebAdministration module if you'd like to see an alternative way.

TechSnips "How to Manage IIS Websites in PowerShell" by Adam Bertram

Knowing how to manage even a simple website for your company or for the world at large will distinguish you from the rest of your peers. The following sections in this article will help you learn how to create and manage a website in IIS. You will also learn how to manage web application pools using a few PowerShell cmdlets.

IISAdministration vs WebAdministration Modules

You have two options for managing IIS. You can use WebAdministration or IISAdministration. But which one should you use?

If you're using IIS IIS 10.0 or higher, the newer IISAdministration module offers a lot of improvements over the older WebAdministration module.

Here are a few highlights:

  • IISAdministration cmdlets offer better support for the pipeline and scale better.
  • Compared to the older, legacy IIS WebAdministration cmdlets, IISAdministration contains more efficient code.
  • IISAdministration cmdlets are simpler, and provide direct access to the server manager.

This article is going to focus on this newer IISAdministration module.

Prerequisites

This article will be hands-on. If you intend to follow along, be sure you have the following prerequisites in place.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/bcf45f18-16dd-410a-adf9-bc202fa3e8b3/Untitled.png
The Windows 10 "Turn Windows features on or off" dialogue

It's recommended that you be familiar with basic of HTML. There will be a step that HTML use plays a role in the upcoming examples. But don't worry, you will be able to copy and paste the code!

All examples in this blog post were created using IIS 10.0 on Windows 10 and PowerShell 7 Preview 6. The IISAdministration cmdlets are the same for Windows Server 2016 & 2019 and work with Windows PowerShell 5.1.

That's it for the tools used, now for the resources needed to follow along.

Installing the IISAdministration Module

Once you have met the prerequisites, it's time for some setup work. Luckily, there's not much setup to do since the PowerShell module you need (IISAdministration) is freely available in the PowerShell Gallery.

Go ahead and open up an elevated PowerShell console on your web server and install the module using the command below.

PS> Install-Module -Name 'IISAdministration'
If you do not have internet access, you can download the module to another host and copy the module to your modules directory.  Take a look at the documentation for the Save-Module command.

Discovering Available Cmdlets

As with any PowerShell module that you may not be familiar with, one of the first cmdlets you should use to discover a modules cmdlet inventory is Get-Command. Using the command Get-Command -Module 'IISAdministration' as shown below will allow you to see what's possible with this module.

Even though you'll be learning some common actions to take on websites, these commands will give you an idea on everything else you can do.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/30dd6df0-e838-4c7e-a997-9377b0a7a306/Untitled.png
Get-Command -Module 'IISAdministration' results

Now you have a list of available cmdlets. It's time to begin putting a site together.

Creating Your First Website

To have a website to work with, let's first create a website. To do that, the first step is to create a directory to save the web content. Additionally, you'll need an HTML file in that directory for IIS to display. This directory will serve as the web directory that will be used in later examples.

Creating the Web Folder and Page

First, create a directory. To do that, you can use the New-Item cmdlet. The code below will create a directory at C:\MyWebsite.

PS> New-Item -ItemType Directory -Name 'MyWebsite' -Path 'C:\'
You can choose whatever path you wish with the above code. To keep things simple, generic paths will be used.

Once you have created the directory, it's time to create an HTML file that will be the landing page for your new website.

Now create a file called index.html in the C:\Mywebsite directory as shown below.

PS> New-Item -ItemType File -Name 'index.html' -Path 'C:\MyWebsite\'

Once the file is created, open it up in your favorite editor and copy and paste the code below into that document. This HTML is a simple page that will be used to ensure IIS is configured properly when you're done.

<!DOCTYPE html>
<html>
    <head>
         <title>IIS Administration With PowerShell Demo</title>
    </head>
    <body>
        <h1>IIS Administration with PowerShell Demo</h1>
        <p>Thank you for reading this post on how to administer IIS with PowerShell!</p>

        <p>This page was created using the newer IISAdministration PowerShell module.</p>
        <h2>First Steps</h2>
        <p>Keep calm and learn PowerShell.</p>
    </body>
</html>

Creating an IIS Website

It's now time to make the webpage just created available for the world to see. To do that, you'll need to create a virtual directory. The virtual directory **contains all of the assets and resources used for the page being served.

By default, IIS creates a virtual directory under C:\inetpub\wwwroot. The directory contains all of the default webpage assets and resources for IIS. You could use the default C:\inetpub\wwwroot directory to store your files as well, but for these examples, it will not be used to keep the paths as short as possible. That's why you are using C:\MyWebsite instead.

To create a new virtual directory (site), use the New-IISSite cmdlet. This cmdlet allows you to create the IIS website.

For this article, create a website called Mywebsite pointed to the C:\MyWebsite directory that's listening on port 8088. In the code snippet below, you can see how to do this using the New-IISSite cmdlet.

The only piece that might be confusing is the BindingInformation parameter. This parameter allows only binding syntax. In this snippet, New-IISSite will create a website that is bound to an IP address (* is the same as 127.0.0.1), the TCP port to listen on followed by any HTTP headers.

Binding syntax can be explained as protocol, followed by source:Port:destination . In this example, you've configured IIS to listen for HTTP requests from ANY () IP address on port 8088 and the destination is the localhost.*

PS> New-IISSite -Name 'MyWebsite' -PhysicalPath 'C:\MyWebsite\' -BindingInformation "*:8088:"

Once the site has been created, you can run Get-IISSite to inspect what it looks like as shown below.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/09831a48-0842-43f6-bc47-d616f83f1afd/Untitled.png
Creating a New Website in IIS

By default, the website configuration is started and your web host begins serving those HTTP requests. Open your browser of choice and navigate to the local machine pointing to port 8088. You should now see the webpage you created earlier displayed.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/507d9601-00bd-4ae6-86ac-38d515c650af/Untitled.png
MyWebSite IIS site in a web browser

Congratulations! You've just set up your first website on IIS using PowerShell!

Now that you have a website up and running, it's time to learn how to manage your website and the IIS server hosting it.

Managing the IIS Website

Once a website is up running, you will undoubtedly need to perform common actions like stopping and starting the site. For example, if the site needs updates made to it, you'll sometimes have to restart the site.

To manage the site in PowerShell, you have two cmdlets to work with - Start-IISSite and Stop-IISSite. These two cmdlets work similarly to how the  Stop-Service and Start-Service cmdlets operate.

Stopping a website is similar to stopping a Windows service. You are preventing or allowing access to the site accessible by a protocol being served on a unique port by IIS. However, you are not stopping the IIS host.  Sites can be stopped and started on an individual basis.

Stopping a Single Site

To stop an IIS website, you will use the Stop-IISSite cmdlet. By default, the site that you created earlier should be in a Started state. If you stop the site and thus prevent access to MyWebsite, run Stop-IISSite providing the name as shown below. This code stops the MyWebsite site from being served by IIS. After stopping the site, you will no longer be able to access it.

PS> Stop-IISSite -Name "MyWebsite"

An example of inspecting the website's state as Started, stopping and inspecting the state again is shown below. In this example, you are:

  1. Getting the status of the MyWebsite site using Get-IISSite.
  2. Execute the Stop-IISSite cmdlet against the MyWebsite site. This cmdlet shuts down access to the website. Since this action is making operational changes you will be prompted for confirmation.
  3. Running Get-IISSite again to verify that MyWebsite site is stopped by noticing the Stopped state.
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6aaffca6-3330-42eb-8a17-9136415eac01/Untitled.png
Getting, stopping, and confirming MyWebsite state

Stopping All Sites

Above you stopped a single site but you can also stop all sites just as easily. By using the pipeline and piping the output of Get-IISSite to Stop-IISSite, PowerShell will enumerate all sites and stop them all. In the below code example, the optional Verbose switch parameter is used to show more information.

Get-IISSite | Stop-IISSite -Verbose
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e97c735a-f31e-479a-9127-a2069181827f/Untitled.png
You can also stop all sites in IIS by stopping the W3SVC or World Wide Web Publishing Service. Stopping the Windows service shuts down IIS and prevents all sites being served. If you do this, however, the sites may still show to be in a Started state.

Starting a Single Site

Let's say you've made some changes to the MyWebsite site and need to start it back up again. It's time to use the Start-IISSite command. To do that, simply specify the name just as you did by using the Stop-IISSite cmdlet.

PS> Start-IISSite -Name 'MyWebsite'

When executed, you can then inspect the state again using Get-IISSite. When you do, you should then see similar output to the screenshot below.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2bcbe222-9ecf-47c3-a020-638c1695157e/Untitled.png
Checking the status of MyWebsite using Get-IISSite and starting the site with Start-IISSite

And now your site should be available again at http://localhost:8088 if you refresh your browser.

Starting All Sites

Similar to how you stopped all sites from being published, you can use the pipeline to start all websites on your IIS host as well.

PS> Get-IISSite | Start-IISSite

Once again, you are getting all of the IIS sites being served and using the pipeline to start each one. Your output should look similar to the screenshot below.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a7608b1b-7791-416b-b366-6df3e1438f6e/Untitled.png

Using the pipeline to start all sites on host

Managing Web Bindings

It's now time to start performing some common administrative tasks on the MyWebsite site. Of of the most common task is changing the web bindings.

When you created the MyWebsite site, you used the binding syntax of *:8088:. This syntax represented listening on the IP address 127.0.0.1, on port 80 with no HTTP headers. Let's say now you've decided that you instead want the site to listen on port 9000 instead. To do this, you'll need to modify the site bindings.

Inspecting Existing Bindings

Before you can change the site's bindings, you should first inspect the current configuration. One way to do that is to inspect the Binding property returned by Get-IISSite. Notice in the next code snippet how to do that. In the snippet, Get-IISSite is querying the MyWebSite site, and only returning the Bindings property.

PS> (Get-IISSite -Name 'MyWebsite').Bindings

When you inspect just the Bindings property, PowerShell will return an object with a few different pieces of information as shown below.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5818b7d9-73a0-443a-8010-719f75754cae/Untitled.png
Example 1: Finding binding information

If you'd like to only see the binding information, you can specifically reference the bindingInformation property as shown below.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/b0d54481-5d22-4769-8e03-74bc001ab1d5/Untitled.png
Example 2: Finding binding information

Removing Bindings

If you'd like to change what port a site listens on, you must first remove the existing binding tying it to that port. To remove the binding, you first have to stop the site.

PS> Stop-IISSite -Name 'MyWebsite'

Once the site is stopped, you can now remove the existing binding tying the MyWebsite site to port 8088. To do that, you can use the Remove-IISSiteBinding cmdlet.

To remove the binding for MyWebsite as defined earlier, below you can see an example of using Remove-IISSiteBinding to do just that. Below, you are providing the name of the site and specifying the binding syntax discovered earlier.

PS> Remove-IISSiteBinding -Name 'MyWebsite' -BindingInformation "*:8088:"

When you execute the code, you will be prompted to confirm your decision since you are doing something destructive as shown below.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6407ffb0-4864-4ccd-aaf5-6b6e67def6db/Untitled.png
Removing site binding using Verbose parameter
There's no limit to how many bindings you can have. You can just as easily have kept the original binding and added TCP port 9000 as a new binding.

Now you can run Get-IISSite -Name 'MyWebsite' again. You'll now see that the binding information has been removed as shown by the blank value under Bindings.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/18de0d05-1c24-4e2e-b8ec-8de28723f56f/Untitled.png
Confirming the old bindings were removed

Even though the site is published, IIS has no way of knowing how to route traffic to your site.

It is important to have at least one binding assigned to your site. To show you the importance, try to navigate to http://localhost:8088/index.html again. If you were using Mozilla Firefox web browser, you may see this message below.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/199f61ec-894f-4fde-9920-0ba0bb584b40/Untitled.png
Can't establish a connection

Creating New Bindings

In the last section, you removed the only site binding MyWebsite had. While this broke the site, it's only a temporary problem. It's time to correct this issue by creating a new binding.

To create a new binding, use the New-IISSiteBinding cmdlet. Since you need to bind port 9000 to the MyWebsite site now, specify the correct binding syntax as shown below.

PS> New-IISSiteBinding -Name 'MyWebsite' -BindingInformation "*:9000:"

Once you've created the new binding, start up the site again with Start-IISSite. Recall that to create this new binding, IIS required the site to be brought down.

When the site starts again, you should now be able to access it on port 9000. To verify this, open your web browser of choice and navigate to http://localhost:9000. You should now see the webpage is working again under port 9000.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/199d4e1e-58af-4698-bb7e-958ebb38ee40/Untitled.png
Same page, different TCP port

Removing a Website

This you just went through a tutorial and don't intend to keep the MyWebsite site around for good, it's time to clean it up. To remove a site, use the  Remove-IISSite cmdlet.

Removing an IIS site can be a dangerous undertaking especially if you're removing a site on IIS that's hosting other production websites. To verify you're removing the right site, it's recommend to use the common WhatIf PowerShell parameter. This parameter allows you to inspect what would have happen if the command would have actually run.

You can see an example of removing the MyWebsite site using the WhatIf parameter below.

Remove-IISSite -Name 'MyWebSite' -WhatIf
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/70e053a7-885f-4efd-9b57-8e6520bf68e1/Untitled.png
Being careful with destructive cmdlets by using -WhatIf !

If everything looks good, let go of the safety bar and re-run the code, this time without the -WhatIf parameter.

When using the Remove-IISSite cmdlet, the site is not deleted. It is removed from the IIS configuration. Files for the website remain intact.

Summary

In this article, you've learned to create a website using the IISAdministration module. You've seen how to perform administrative operations necessary to maintain a website. You now know enough of the basics to work with any modern IIS host using PowerShell!

Further Reading