IISをオフラインでインストールする

# はじめに
Windows 10には、IISが最初からインストールされていません。
IISをインストールしようと「コントロールパネル」の「プログラムと機能」にある「Windows の機能の有効化または無効化」の「インターネットインフォメーションサービス」の階層から必要な機能チェックしてインストールとするとWindows Updateが必要な旨のメッセージが出ます。
しかしながら、今回はオフライン環境でインストールを行いたいのです。

# 環境
* Windows 10 Enterprise 評価版 64 ビット エディション
* VirtualBox 6.1.34
* Mac Book Pro(2.3 GHz 8コアIntel Core i9) Monterey 12.4

https://www.microsoft.com/ja-jp/evalcenter/download-windows-10-enterprise

:::note info
Windows 10 IoT版(LTSC)であれば、Windows Update不要でIISがオフラインでインストールできます。
:::

# オフライン環境でIISインストール
展開イメージのサービスと管理(DISM.exe)は、Windows イメージを提供および準備するために使用できるコマンドライン ツールです。このDISMコマンドを使うことによりオフラインでIISインストールことが出来ます。

## IIS機能一覧
Windows 10版になります。
Windows Server 2016と比較した場合、機能数が同じですが表示順番に違いがありました。

```
インターネットインフォメーションサービス
  FTP サーバー:IIS-FTPServer
    FTP Service:IIS-FTPSvc
    FTP 拡張:IIS-FTPExtensibility
  Web 管理ツール
    IIS 6 管理互換
      IIS 6 WMI互換:IIS-WMICompatibility
      IIS 6 スクリプトツール:IIS-LegacyScripts
      IIS 6 管理コンソール:IIS-LegacySnapIn
      IIS 6 メタベースおよびIIS6構成との互換 :IIS-Metabase
    IIS 管理コンソール:IIS-ManagementConsole
    IIS 管理サービス:IIS-ManagementService
    IIS 管理スクリプトおよびツール:IIS-ManagementScriptingTools
  World Wide Webサービス
    HTTP共通機能
      HTTPエラー:IIS-HttpErrors
      HTTPリダイレクト:IIS-HttpRedirect
      WebDAV発行:IIS-WebDAV
      ディレクトリの参照:IIS-DirectoryBrowsing
      既定のドキュメント:IIS-DefaultDocument
      静的なコンテンツ:IIS-StaticContent
    アプリケーション開発機能
      .NET Extensibility 4.8:IIS-NetFxExtensibility45
      .NET 拡張機能 3.5:IIS-NetFxExtensibility
      Application Initialization:IIS-ApplicationInit
      ASP:IIS-ASP
      ASP.NET 3.5:IIS-ASPNET
      ASP.NET 4.8:IIS-ASPNET45
      CGI:IIS-CGI
      ISAPIフィルタ:IIS-ISAPIFilter
      ISAPI拡張:IIS-ISAPIExtensions
      WebSocket プロトコル:IIS-WebSockets
      サーバー側インクルード:IIS-ServerSideIncludes
    セキュリティ
      IIS クライアント証明書のマッピング証明:IIS-IISCertificateMappingAuthentication
      IP セキュリティ:IIS-IPSecurity
      SSL 証明書の集中サポート:IIS-CertProvider
      URL 承認:IIS-URLAuthorization
      Windows 認証:IIS-WindowsAuthentication
      クライアント証明書のマッピング認証:IIS-ClientCertificateMappingAuthentication
      ダイジェスト認証:IIS-DigestAuthentication
      基本認証:IIS-BasicAuthentication
      要求のフィルタリング:IIS-RequestFiltering
    パフォーマンス機能
      静的なコンテンツの圧縮:IIS-HttpCompressionStatic
      動的なコンテンツの圧縮:IIS-HttpCompressionDynamic
    状態と診断
      HTTP ログ:IIS-HttpLogging
      ODBC ログ:IIS-ODBCLogging
      カスタム ログ:IIS-CustomLogging
      トレース:IIS-HttpTracing
      ログ ツール:IIS-LoggingLibraries
      要求の監視:IIS-RequestMonitor
インターネットインフォメーションサービスのホスト可能なWebコア:IIS-HostableWebCore
```

### 参照
* [【2019年版】コマンドラインからWindows 10の機能を有効・無効にする](https://news.mynavi.jp/article/win10tips-414/)
* [「Disable-WindowsOptionalFeature」コマンドレットで指定するWindows 10の機能リスト](https://news.mynavi.jp/article/win10tips-414/resources/Windows10Tips414.txt)

## バッチ
すべての機能を追加するわけではないですが、例としてバッチを作成しました。  
このバッチでは、Classic ASPの使用を考慮しているため、.NET Framework 3.5をチェックしています。

:::note warn
必要な機能があれば追加して、不要であれば削除またはコメントアウトしてください。
:::

```batch:IIS有効化.bat
@echo off
cd /d %~dp0

openfiles > NUL 2>&1
IF %ERRORLEVEL% EQU 0 goto Admin
echo 管理者権限で実行してください。
pause
exit

:Admin
rem .NET Framework 3.5の存在確認
set REGROOT=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5
reg query "%REGROOT%" >nul 2>&1
echo.

if %ERRORLEVEL% equ 0 (
    echo .NET Framework 3.5がインストール済み
    echo.
) else (
    echo .NET Framework 3.5を先にインストールしてください。
    echo.
    pause
    exit
)

rem ------------------------------------------------------------------------------
rem IISの機能有効化
rem
echo IISの機能を有効化しています。
echo.

dism /online /enable-feature /all /featurename:IIS-WMICompatibility
dism /online /enable-feature /all /featurename:IIS-LegacyScripts
dism /online /enable-feature /all /featurename:IIS-LegacySnapIn
dism /online /enable-feature /all /featurename:IIS-Metabase
dism /online /enable-feature /all /featurename:IIS-ManagementConsole
dism /online /enable-feature /all /featurename:IIS-ManagementService
dism /online /enable-feature /all /featurename:IIS-ManagementScriptingTools
dism /online /enable-feature /all /featurename:IIS-HttpErrors
dism /online /enable-feature /all /featurename:IIS-DirectoryBrowsing
dism /online /enable-feature /all /featurename:IIS-DefaultDocument
dism /online /enable-feature /all /featurename:IIS-StaticContent
dism /online /enable-feature /all /featurename:IIS-NetFxExtensibility45
dism /online /enable-feature /all /featurename:IIS-NetFxExtensibility
dism /online /enable-feature /all /featurename:IIS-ApplicationInit
dism /online /enable-feature /all /featurename:IIS-ASP
dism /online /enable-feature /all /featurename:IIS-ASPNET
dism /online /enable-feature /all /featurename:IIS-ASPNET45
dism /online /enable-feature /all /featurename:IIS-ISAPIFilter
dism /online /enable-feature /all /featurename:IIS-ISAPIExtensions
dism /online /enable-feature /all /featurename:IIS-WindowsAuthentication
dism /online /enable-feature /all /featurename:IIS-RequestFiltering
dism /online /enable-feature /all /featurename:IIS-HttpCompressionStatic
dism /online /enable-feature /all /featurename:IIS-HttpLogging

rem ----- 終了処理
echo.
echo IISの機能有効化が完了しました。
pause
exit
```

### .NET Framework 3.5のインストール
Windows 10では、単純にDISMコマンドを使用しただけでは、.NET Framework 3.5をオフラインでインストールできません。ISOファイルから必要なCABファイルを用意する必要があります。

https://qiita.com/yaju/items/0cc10ff85b4042fc5ed1

:::note info
Windows 10 IoT版(LTSC)であれば、最初から.NET Framework 3.5が有効になっています。
:::

# 最後に
Windows 10 IoT版のインストール準備のために、仮想環境でWindows 10の通常版で導入検証をしていたのですが、.NET Framework 3.5のオフラインインストールでの0x800f081fエラーやIISのオフラインインストールでつまずくなどして、調査に時間がかかってしまいました。
Windows 10 IoT版が最初から.NET Framework 3.5が有効だったり、IISインストールの有効化チェックするだけで済んだのは、本番導入の時に分かったことです。

そのため、せっかく作ったバッチを使用しませんでした。今回記事にして供養することにしました。