Windowsサーバーを管理している場合、おそらくInternet Information Services (IIS)を使用したことがあるでしょう。ウェブサイトはIISの主要な機能の一つであり、PowerShellを使用してIISを簡単に管理し、自動化することができます!
この記事では、PowerShellを使用してIISを管理する新しい方法について紹介します。この記事の手法を使用することで、簡単にPowerShell IISスクリプトを作成し、IISのウェブサイトを管理することができます。
PowerShellでIISを管理するには、WebAdminstrationまたはIISAdminstrationのいずれかのPowerShellモジュールが必要です。この記事では、より新しいIISAdministrationモジュールをカバーしています。この記事の補足ビデオでは、代替方法を見るために古いWebAdministrationモジュールも紹介されています。
会社や一般のユーザー向けのシンプルなウェブサイトを管理する方法を知っていることは、他の同僚と差別化することになるでしょう。この記事の以下のセクションでは、IISでウェブサイトを作成および管理する方法、およびいくつかのPowerShellコマンドレットを使用してWebアプリケーションプールを管理する方法を学ぶことができます。
IISAdministration vs WebAdministration Modules
IISを管理するためには、WebAdministrationまたはIISAdministrationの2つのオプションがあります。しかし、どちらを使用すべきでしょうか?
新しいIISAdministrationモジュールは、より新しいWebAdministrationモジュールに比べて多くの改良が加えられています。
ここでは、いくつかのハイライトを紹介します:
- IISAdministrationコマンドレットは、パイプラインのサポートが向上し、スケールが向上しています。
- 従来のIIS WebAdministrationコマンドレットと比較して、IISAdministrationにはより効率的なコードが含まれています。
- IISAdministrationコマンドレットはシンプルであり、サーバーマネージャーへの直接アクセスを提供します。
この記事では、新しいIISAdministrationモジュールに焦点を当てます。
前提条件
この記事は実際の操作を伴いますので、一緒に進める場合は以下の前提条件を満たしてください。
- Windows PowerShell 5.1またはPowerShell 6+の最小バージョン
- PowerShellギャラリーからのIISAdministration PowerShellモジュール
- IIS 10.0のWindows機能が有効化されていること

HTMLの基本的な知識があることが推奨されます。次の例でHTMLの使用が必要になりますが、心配しないでコードをコピー&ペーストすることができます!
このブログ投稿のすべての例は、Windows 10上のIIS 10.0およびPowerShell 7 Preview 6を使用して作成されました。IISAdministrationコマンドレットはWindows Server 2016および2019でも同様であり、Windows PowerShell 5.1で動作します。
使用するツールについては以上ですが、続いて必要なリソースについて説明します。
IISAdministrationモジュールのインストール
前提条件を満たしたら、セットアップ作業を始めましょう。幸いなことに、必要なPowerShellモジュール(IISAdministration)はPowerShellギャラリーで無料で利用できます。
Webサーバーで昇格されたPowerShellコンソールを開いて、以下のコマンドを使用してモジュールをインストールしてください。
インターネットにアクセスできない場合は、モジュールを別のホストにダウンロードし、モジュールをモジュールディレクトリにコピーすることもできます。
Save-Module
コマンドのドキュメントを参照してください。
利用可能なCmdletの検出
使い慣れていないPowerShellモジュールの場合、モジュールのCmdletの一覧を確認するために使用するべき最初のコマンドの1つはGet-Command
です。以下に示すように、Get-Command -Module 'IISAdministration'
コマンドを使用すると、このモジュールで可能なことがわかります。
ウェブサイトに対して行う一般的な操作を学ぶことになりますが、これらのコマンドは他のすべての操作についてもアイデアを提供します。

これで利用可能なCmdletのリストがあります。サイトの作成を始めましょう。
最初のウェブサイトの作成
ウェブサイトを作成するために、まずウェブサイトを作成しましょう。そのためには、まずウェブコンテンツを保存するディレクトリを作成する必要があります。さらに、IISが表示するためのHTMLファイルもそのディレクトリに必要です。このディレクトリは、後の例で使用されるウェブディレクトリとして機能します。
ウェブフォルダとページの作成
まず、ディレクトリを作成します。これには、New-Item
コマンドレットを使用できます。以下のコードは、C:\MyWebsiteにディレクトリを作成します。
上記のコードでは、任意のパスを選択できます。ここでは、シンプルにするために一般的なパスを使用します。
ディレクトリを作成したら、新しいウェブサイトのランディングページとなるHTMLファイルを作成する時です。
次に、以下のようにindex.htmlという名前のファイルをC:\Mywebsiteディレクトリに作成してください。
ファイルが作成されたら、お気に入りのエディタで開き、以下のコードをそのドキュメントにコピーして貼り付けます。このHTMLは、IISが正しく設定されていることを確認するために使用されるシンプルなページです。
IISウェブサイトの作成
さあ、作成したウェブページを世界に公開しましょう。そのためには、仮想ディレクトリを作成する必要があります。仮想ディレクトリには、提供されるページに使用されるすべてのアセットとリソースが含まれています。
デフォルトでは、IISはC:\ inetpub \ wwwrootの下に仮想ディレクトリを作成します。このディレクトリには、IISのデフォルトのウェブページのアセットとリソースが含まれています。また、ファイルを保存するためにデフォルトのC:\ inetpub \ wwwrootディレクトリを使用することもできますが、これらの例では、パスをできるだけ短く保つために使用されません。それがC:\ MyWebsiteを使用する理由です。
新しい仮想ディレクトリ(サイト)を作成するには、New-IISSite
コマンドレットを使用します。このコマンドレットを使用すると、IISのウェブサイトを作成できます。
この記事では、Mywebsiteという名前のウェブサイトを作成し、C:\ MyWebsiteディレクトリをポート8088でリッスンするようにします。以下のコードスニペットでは、New-IISSite
コマンドレットを使用してこれを行う方法が示されています。
唯一混乱するかもしれない部分は、BindingInformation
パラメータです。このパラメータでは、バインディング構文のみが許可されます。このスニペットでは、New-IISSite
は、バインドされたIPアドレス(*
は127.0.0.1と同じです)、リッスンするTCPポート、および任意のHTTPヘッダーを持つウェブサイトを作成します。
バインディング構文は、プロトコル、ソース:ポート:宛先の形式で説明できます。この例では、IISをHTTPリクエストの受信に設定し、任意()のIPアドレスからポート8088でリッスンし、宛先はlocalhostです。
サイトが作成されたら、以下のように表示されるかどうかを確認するためにGet-IISSite
を実行できます。

デフォルトでは、ウェブサイトの設定が開始され、ウェブホストがHTTPリクエストを処理し始めます。お好きなブラウザを開き、ポート8088を指定してローカルマシンにアクセスしてください。先ほど作成したウェブページが表示されるはずです。

おめでとうございます!PowerShellを使用してIIS上で最初のウェブサイトを設定しました。
ウェブサイトが動作しているので、ウェブサイトとそれをホストしているIISサーバーを管理する方法を学ぶ時が来ました。
IISウェブサイトの管理
ウェブサイトが動作している場合、ウェブサイトの停止や開始などの一般的な操作を行う必要があります。たとえば、ウェブサイトの更新が必要な場合には、ウェブサイトを再起動する必要があります。
PowerShellでサイトを管理するためには、2つのコマンドレットが使用できます – Start-IISSite
およびStop-IISSite
。これらの2つのコマンドレットは、Stop-Service
およびStart-Service
コマンドレットと同様に動作します。
ウェブサイトの停止は、Windowsサービスの停止と似ています。IISが一意のポートで提供しているプロトコルによってアクセス可能なサイトへのアクセスを制御します。ただし、IISホストは停止しません。個々のサイトごとに停止および開始できます。
単一のサイトの停止
IISのウェブサイトを停止するには、Stop-IISSite
コマンドレットを使用します。デフォルトでは、以前に作成したサイトはStarted
の状態にあるはずです。サイトを停止し、MyWebsiteへのアクセスを防止するには、以下に示すように名前を指定してStop-IISSite
を実行します。このコードは、IISによるMyWebsiteサイトの提供を停止します。サイトを停止すると、それにアクセスすることはできなくなります。
ウェブサイトの状態をStarted
として確認し、停止してから再度状態を確認する例を以下に示します。この例では、次の操作を行います:
Get-IISSite
を使用して、MyWebsiteサイトの状態を取得します。Stop-IISSite
コマンドレットをMyWebsiteサイトに対して実行します。このコマンドレットは、ウェブサイトへのアクセスをシャットダウンします。この操作は運用変更を行うため、確認が求められます。Get-IISSite
を再度実行し、MyWebsiteサイトがStopped
の状態であることを確認します。

すべてのサイトの停止
上記では単一のサイトを停止しましたが、同様にすべてのサイトを停止することも簡単です。Get-IISSite
の出力をパイプラインでStop-IISSite
に渡すことで、PowerShellはすべてのサイトを列挙し、停止します。以下のコード例では、オプションのVerbose
スイッチパラメータを使用して詳細な情報を表示しています。

また、W3SVCまたはWorld Wide Web Publishing Serviceを停止することで、IISですべてのサイトを停止することもできます。Windowsサービスを停止すると、IISがシャットダウンされ、すべてのサイトの提供が阻止されます。ただし、これを行っても、サイトは「開始済み」の状態で表示される場合があります。
単一のサイトの開始
例えば、MyWebsiteサイトに変更を加え、再度開始する必要があるとします。この場合は、Start-IISSite
コマンドを使用します。単純に、Stop-IISSite
コマンドレットと同様に、名前を指定します。
実行すると、Get-IISSite
を使用して状態を確認できます。すると、以下のスクリーンショットと似たような出力が表示されるはずです。

Get-IISSite
and starting the site with Start-IISSite
そして、ブラウザをリフレッシュすると、http://localhost:8088でサイトが再度利用可能になります。
すべてのサイトの開始
サイトの公開をすべて停止した方法と同様に、パイプラインを使用してIISホスト上のすべてのウェブサイトを開始することもできます。
再度、提供されているすべてのIISサイトを取得し、パイプラインを使用してそれぞれを開始しています。出力は以下のスクリーンショットと似たようなものになるはずです。

ウェブバインディングの管理
では、MyWebsiteサイトで一般的な管理タスクのいくつかを実行していきましょう。その中でも最も一般的なタスクの一つは、ウェブバインディングの変更です。
MyWebsite サイトを作成する際、*:8088:
のバインディング構文を使用しました。この構文は、IPアドレス 127.0.0.1 のポート80で、HTTPヘッダーなしでリッスンすることを表しています。今回は代わりにサイトをポート9000でリッスンするように変更したいと思います。そのためには、サイトのバインディングを変更する必要があります。
現在のバインディングの確認
サイトのバインディングを変更する前に、現在の構成を確認する必要があります。そのためには、Get-IISSite
が返す Binding
プロパティを調べる方法があります。以下のコードスニペットにその方法が示されています。スニペットでは、Get-IISSite
が MyWebSite サイトをクエリし、Bindings
プロパティのみを返します。
Bindings
プロパティのみを調べると、以下に示すようにいくつかの異なる情報を含むオブジェクトが返されます。

バインディング情報のみを表示したい場合は、以下のように bindingInformation
プロパティを明示的に参照することができます。

バインディングの削除
サイトがリッスンするポートを変更する場合、まずそのポートにバインドされている既存のバインディングを削除する必要があります。バインディングを削除するには、まずサイトを停止する必要があります。
サイトが停止したら、MyWebsite サイトをポート8088にバインドしている既存のバインディングを削除することができます。そのためには、Remove-IISSiteBinding
cmdlet を使用できます。
以前に定義されたMyWebsiteのバインディングを削除するには、以下にRemove-IISSiteBinding
を使用する例が示されています。以下では、サイトの名前を指定し、以前に発見したバインディング構文を指定しています。
コードを実行すると、以下のように破壊的な操作を行うため、確認のプロンプトが表示されます。

バインディングの数に制限はありません。元のバインディングを保持したまま、新しいバインディングとしてTCPポート9000を追加することも簡単です。
今、Get-IISSite -Name 'MyWebsite'
を再度実行できます。バインディング情報が削除され、Bindings
の下に空の値が表示されていることがわかります。

サイトが公開されているにもかかわらず、IISはトラフィックをサイトにルーティングする方法を知りません。
少なくとも1つのバインディングがサイトに割り当てられていることが重要です。重要性を示すために、再びhttp://localhost:8088/index.htmlに移動しようとしてください。Mozilla Firefoxウェブブラウザを使用している場合、次のメッセージが表示される場合があります。

新しいバインディングの作成
前のセクションでは、MyWebsiteが持っていた唯一のサイトバインディングを削除しました。これにより、サイトは壊れましたが、これは一時的な問題です。新しいバインディングを作成してこの問題を修正する時がきました。
新しいバインディングを作成するには、New-IISSiteBinding
コマンドレットを使用します。今、ポート9000をMyWebsiteサイトにバインドする必要があるため、以下のように正しいバインディング構文を指定します。
新しいバインディングを作成したら、Start-IISSite
を使用してサイトを再起動します。この新しいバインディングを作成するために、IISはサイトを停止する必要があります。
サイトが再び起動したら、ポート9000でアクセスできるはずです。これを確認するために、お好きなウェブブラウザを開き、http://localhost:9000に移動してください。ポート9000でウェブページが正常に動作していることが確認できるはずです。

ウェブサイトの削除
このチュートリアルを終えて、MyWebsiteサイトを永久に保持するつもりはない場合は、クリーンアップする時が来ました。サイトを削除するには、Remove-IISSite
コマンドレットを使用します。
IISサイトの削除は、他の本番ウェブサイトをホストしているIIS上のサイトを削除する場合、危険な作業になる可能性があります。正しいサイトを削除していることを確認するために、一般的なWhatIf
PowerShellパラメータを使用することをおすすめします。このパラメータを使用すると、コマンドが実際に実行された場合に何が起こるかを検査することができます。
以下の例では、MyWebsiteサイトをWhatIf
パラメータを使用して削除しています。

-WhatIf
!すべてが正常に見える場合は、安全バーを離してコードを再実行してください。この場合は、-WhatIf
パラメータは不要です。
Remove-IISSite
コマンドレットを使用すると、サイトは削除されません。IISの構成から削除されますが、ウェブサイトのファイルはそのまま残ります。
要約
この記事では、IISAdministrationモジュールを使用してウェブサイトを作成する方法を学びました。ウェブサイトのメンテナンスに必要な管理操作の実行方法を見ました。これで、PowerShellを使用して任意のモダンなIISホストと連携するための基本的な知識が身に付きました!