PowerShell IISマスタリー:Webサイトの作成と管理

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モジュールに焦点を当てます。

前提条件

この記事は実際の操作を伴いますので、一緒に進める場合は以下の前提条件を満たしてください。

The Windows 10 “Turn Windows features on or off” dialogue

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コンソールを開いて、以下のコマンドを使用してモジュールをインストールしてください。

PS> Install-Module -Name 'IISAdministration'

インターネットにアクセスできない場合は、モジュールを別のホストにダウンロードし、モジュールをモジュールディレクトリにコピーすることもできます。 Save-Moduleコマンドのドキュメントを参照してください。

利用可能なCmdletの検出

使い慣れていないPowerShellモジュールの場合、モジュールのCmdletの一覧を確認するために使用するべき最初のコマンドの1つはGet-Commandです。以下に示すように、Get-Command -Module 'IISAdministration'コマンドを使用すると、このモジュールで可能なことがわかります。

ウェブサイトに対して行う一般的な操作を学ぶことになりますが、これらのコマンドは他のすべての操作についてもアイデアを提供します。

Get-Command -Module ‘IISAdministration’ results

これで利用可能なCmdletのリストがあります。サイトの作成を始めましょう。

最初のウェブサイトの作成

ウェブサイトを作成するために、まずウェブサイトを作成しましょう。そのためには、まずウェブコンテンツを保存するディレクトリを作成する必要があります。さらに、IISが表示するためのHTMLファイルもそのディレクトリに必要です。このディレクトリは、後の例で使用されるウェブディレクトリとして機能します。

ウェブフォルダとページの作成

まず、ディレクトリを作成します。これには、New-Itemコマンドレットを使用できます。以下のコードは、C:\MyWebsiteにディレクトリを作成します。

PS> New-Item -ItemType Directory -Name 'MyWebsite' -Path 'C:\'

上記のコードでは、任意のパスを選択できます。ここでは、シンプルにするために一般的なパスを使用します。

ディレクトリを作成したら、新しいウェブサイトのランディングページとなるHTMLファイルを作成する時です。

次に、以下のようにindex.htmlという名前のファイルをC:\Mywebsiteディレクトリに作成してください。

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

ファイルが作成されたら、お気に入りのエディタで開き、以下のコードをそのドキュメントにコピーして貼り付けます。このHTMLは、IISが正しく設定されていることを確認するために使用されるシンプルなページです。

<!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>

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です。

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

サイトが作成されたら、以下のように表示されるかどうかを確認するためにGet-IISSiteを実行できます。

Creating a New Website in IIS

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

MyWebSite IIS site in a web browser

おめでとうございます!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サイトの提供を停止します。サイトを停止すると、それにアクセスすることはできなくなります。

PS> Stop-IISSite -Name "MyWebsite"

ウェブサイトの状態をStartedとして確認し、停止してから再度状態を確認する例を以下に示します。この例では、次の操作を行います:

  1. Get-IISSiteを使用して、MyWebsiteサイトの状態を取得します。
  2. Stop-IISSiteコマンドレットをMyWebsiteサイトに対して実行します。このコマンドレットは、ウェブサイトへのアクセスをシャットダウンします。この操作は運用変更を行うため、確認が求められます。
  3. Get-IISSiteを再度実行し、MyWebsiteサイトがStoppedの状態であることを確認します。
Getting, stopping, and confirming MyWebsite state

すべてのサイトの停止

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

Get-IISSite | Stop-IISSite -Verbose
Stopping all IIS sites with PowerShell

また、W3SVCまたはWorld Wide Web Publishing Serviceを停止することで、IISですべてのサイトを停止することもできます。Windowsサービスを停止すると、IISがシャットダウンされ、すべてのサイトの提供が阻止されます。ただし、これを行っても、サイトは「開始済み」の状態で表示される場合があります。

単一のサイトの開始

例えば、MyWebsiteサイトに変更を加え、再度開始する必要があるとします。この場合は、Start-IISSiteコマンドを使用します。単純に、Stop-IISSiteコマンドレットと同様に、名前を指定します。

PS> Start-IISSite -Name 'MyWebsite'

実行すると、Get-IISSiteを使用して状態を確認できます。すると、以下のスクリーンショットと似たような出力が表示されるはずです。

Checking the status of MyWebsite using Get-IISSite and starting the site with Start-IISSite

そして、ブラウザをリフレッシュすると、http://localhost:8088でサイトが再度利用可能になります。

すべてのサイトの開始

サイトの公開をすべて停止した方法と同様に、パイプラインを使用してIISホスト上のすべてのウェブサイトを開始することもできます。

PS> Get-IISSite | Start-IISSite

再度、提供されているすべてのIISサイトを取得し、パイプラインを使用してそれぞれを開始しています。出力は以下のスクリーンショットと似たようなものになるはずです。

Using the pipeline to start all sites on host

ウェブバインディングの管理

では、MyWebsiteサイトで一般的な管理タスクのいくつかを実行していきましょう。その中でも最も一般的なタスクの一つは、ウェブバインディングの変更です。

MyWebsite サイトを作成する際、*:8088: のバインディング構文を使用しました。この構文は、IPアドレス 127.0.0.1 のポート80で、HTTPヘッダーなしでリッスンすることを表しています。今回は代わりにサイトをポート9000でリッスンするように変更したいと思います。そのためには、サイトのバインディングを変更する必要があります。

現在のバインディングの確認

サイトのバインディングを変更する前に、現在の構成を確認する必要があります。そのためには、Get-IISSite が返す Binding プロパティを調べる方法があります。以下のコードスニペットにその方法が示されています。スニペットでは、Get-IISSiteMyWebSite サイトをクエリし、Bindings プロパティのみを返します。

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

Bindings プロパティのみを調べると、以下に示すようにいくつかの異なる情報を含むオブジェクトが返されます。

Example 1: Finding binding information

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

Example 2: Finding binding information

バインディングの削除

サイトがリッスンするポートを変更する場合、まずそのポートにバインドされている既存のバインディングを削除する必要があります。バインディングを削除するには、まずサイトを停止する必要があります。

PS> Stop-IISSite -Name 'MyWebsite'

サイトが停止したら、MyWebsite サイトをポート8088にバインドしている既存のバインディングを削除することができます。そのためには、Remove-IISSiteBinding cmdlet を使用できます。

以前に定義されたMyWebsiteのバインディングを削除するには、以下にRemove-IISSiteBindingを使用する例が示されています。以下では、サイトの名前を指定し、以前に発見したバインディング構文を指定しています。

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

コードを実行すると、以下のように破壊的な操作を行うため、確認のプロンプトが表示されます。

Removing site binding using Verbose parameter

バインディングの数に制限はありません。元のバインディングを保持したまま、新しいバインディングとしてTCPポート9000を追加することも簡単です。

今、Get-IISSite -Name 'MyWebsite'を再度実行できます。バインディング情報が削除され、Bindingsの下に空の値が表示されていることがわかります。

Confirming the old bindings were removed

サイトが公開されているにもかかわらず、IISはトラフィックをサイトにルーティングする方法を知りません。

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

Can’t establish a connection

新しいバインディングの作成

前のセクションでは、MyWebsiteが持っていた唯一のサイトバインディングを削除しました。これにより、サイトは壊れましたが、これは一時的な問題です。新しいバインディングを作成してこの問題を修正する時がきました。

新しいバインディングを作成するには、New-IISSiteBindingコマンドレットを使用します。今、ポート9000をMyWebsiteサイトにバインドする必要があるため、以下のように正しいバインディング構文を指定します。

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

新しいバインディングを作成したら、Start-IISSiteを使用してサイトを再起動します。この新しいバインディングを作成するために、IISはサイトを停止する必要があります。

サイトが再び起動したら、ポート9000でアクセスできるはずです。これを確認するために、お好きなウェブブラウザを開き、http://localhost:9000に移動してください。ポート9000でウェブページが正常に動作していることが確認できるはずです。

Same page, different TCP port

ウェブサイトの削除

このチュートリアルを終えて、MyWebsiteサイトを永久に保持するつもりはない場合は、クリーンアップする時が来ました。サイトを削除するには、Remove-IISSiteコマンドレットを使用します。

IISサイトの削除は、他の本番ウェブサイトをホストしているIIS上のサイトを削除する場合、危険な作業になる可能性があります。正しいサイトを削除していることを確認するために、一般的なWhatIf PowerShellパラメータを使用することをおすすめします。このパラメータを使用すると、コマンドが実際に実行された場合に何が起こるかを検査することができます。

以下の例では、MyWebsiteサイトをWhatIfパラメータを使用して削除しています。

Remove-IISSite -Name 'MyWebSite' -WhatIf
Being careful with destructive cmdlets by using -WhatIf !

すべてが正常に見える場合は、安全バーを離してコードを再実行してください。この場合は、-WhatIfパラメータは不要です。

Remove-IISSiteコマンドレットを使用すると、サイトは削除されません。IISの構成から削除されますが、ウェブサイトのファイルはそのまま残ります。

要約

この記事では、IISAdministrationモジュールを使用してウェブサイトを作成する方法を学びました。ウェブサイトのメンテナンスに必要な管理操作の実行方法を見ました。これで、PowerShellを使用して任意のモダンなIISホストと連携するための基本的な知識が身に付きました!

さらに学ぶための資料

Source:
https://adamtheautomator.com/powershell-iis/