しばたテックブログ

PowerShellを中心に気分で書いている技術ブログです。

Server Core App Compatibility Feature on DemandのInternet Explorerに対する雑感

前のエントリ

blog.shibata.tech

でServer Core App Compatibility Feature on Demand(FoD)を使いServer CoreにInternet Explorer(IE)がインストールできることを述べましたが、本エントリではこの点について思ったことを書いていきます。

そもそもServer CoreにIEは必要なのか?

そもそもServer CoreにIEは必要なのか?

私が本エントリを書こうと思った理由はこの一点に尽きます。

もともとServer Coreはサーバーとして必須でない機能を削ってOS全体の軽量化とセキュリティの強化を図ったものです。

IEの用途は基本的にWEBブラウスで、サーバー上であればソフトウェアのインストーラーなどのリソースのダウンロードに使うくらいしかないでしょう。
従来からリソースのダウンロードにはPowerShellが使えましたし、たかがダウンロードのためだけにセキュリティ的にナイーブな機能であるIEを追加するというのは、個人的には全く割に合わないものだと思っています。

公式にIEを追加すべき動機について一切アナウンスされておらず、いまのところはこの疑問に対する答えを得ることはできません...

一応想像するかぎりでは、

  • IEコンポーネントを内部的に使うアプリケーションとの互換性確保のため?
  • かつてのmodern.ieの様な、テスト用途のIE入りWindows Server Containerを目論んでいる?

などを思いつきましたが、あくまでも私の妄想であり何とも言えません。

Server CoreでのWEBアクセスについて

私の妄想はさておき、Server CoreでのWEBアクセスについての基本的なところとIEを導入することによる挙動の変化について触れておきます。

IEがなくてもWEBアクセスの方法は以下に示す様に十分ありますし、IEが必要なケースがでればFoDで導入するとよいでしょう。

Windows PowerShellの利用

従来のServer CoreではIEが無いため、WEBアクセスは基本的にPowerShellで、Invoke-WebRequestInvoke-RestMethodを使う必要がありました。

これらの機能は内部的にIEコンポーネントを利用しているのですが、IEコンポーネントを利用しないWEBアクセスを行うために-UseBasicParsingというパラメーターがあり、Server Coreではこのパラメーターを指定してやる必要があります。
また、単純にファイルをダウンロードするだけであればこのパラメーターをつけなくてもServer Coreで動作させることは可能です。

# Server Coreでは-UseBasicParsingをつけないとエラーになる
Invoke-WebRequest -Uri 'https://www.yahoo.co.jp/'

f:id:stknohg:20181004160245p:plain

# -UseBasicParsingをつけてエラーを回避
Invoke-WebRequest -Uri 'https://www.yahoo.co.jp/' -UseBasicParsing

f:id:stknohg:20181004160308p:plain

# ファイルのダウンロードだけなら-UseBasicParsingはなくても良い
Invoke-WebRequest -Uri 'https://download.sysinternals.com/files/SysinternalsSuite.zip' -OutFile '.\SysinternalsSuite.zip'

f:id:stknohg:20181004160326p:plain

そして、FoDでIEを追加すると最初の-UseBasicParsingをつけない場合でも動作する様になります。

f:id:stknohg:20181004160341p:plain

これによりフルのWindows Serverと同等の互換性を得ることはできますが、この程度の互換が必要かといわれると疑問ですし、その様なシナリオも皆無と思っています。

curl.exeの利用

Windows Server 2019にはWindowsにポートされたcurl.exeが導入されており、Server Coreでも利用可能です。

f:id:stknohg:20181004160358p:plain

このためPowerShellに頼らなくてもcurlにより強力なWEBアクセスができる様になっています。

curl.exe https://www.yahoo.co.jp

f:id:stknohg:20181004160408p:plain

curl.exe https://download.sysinternals.com/files/SysinternalsSuite.zip -o .\SysinternalsSuite.zip

f:id:stknohg:20181004160418p:plain

PowerShell Coreの利用

こちらはおまけです。

もしWindows PowerShellのWEBアクセスで機能が足りていない部分があるのであれば、PowerShell Coreを追加でインストールするのも一つの解となるかもしれません。
PowerShell CoreのWebCmdletsはIEへの依存が排除されており、また、新しいWEBの仕組みへの対応もいくつかなされています。

インストール自体は手作業で行う必要がありますが、拙作のインストーラーを使えばワンライナーでインストールできます。

blog.shibata.tech

REM Command prompt
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "[Net.ServicePointManager]::SecurityProtocol=[Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12;iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/stknohg/PSCoreUpdate/master/FirstTimeInstaller/Install-LatestPowerShell.ps1'))"

f:id:stknohg:20181004161620p:plain

f:id:stknohg:20181004161751p:plain

Windows Server 2019のServer Core App Compatibility Feature on Demandを試す

Windows Server 2019で新たに導入されたApp Compatibility Feature on Demand(FoD)は、基本的にCUIのみであるServer Coreに対して後入れでいくつかのGUI管理ツールを導入できる機能になります。

Insider previewの時点で既にムッシュが試しており、リリース版でも結果的には変わらない内容となりましたが、せっかく試したのでエントリとして残しておきます。

FoDをセットアップする

公式の手順はこちらになります。

docs.microsoft.com

最初にWindows Server 2019 Server Coreを普通にセットアップし、その後専用のISO媒体からDISMを使いFoDの機能を追加する形になります。

Server Coreのセットアップ

ここの手順は端折ります。
適当にServer Coreのセットアップをして管理者ユーザーがログインできる状態にしてください。

f:id:stknohg:20181004121229p:plain

エディションはStandard、Datacenterどちらでも構いません。

FoD ISOイメージの取得

先述の通りFoDをセットアップするには専用のISOイメージが必要です。
このイメージの入手先についてはドキュメントにきちんと明記されておらず残念な感じになっています。
(そのうち明記されるとは思いますが...)

とりあえず私はVisual Studioサブスクリプション(MSDNサブスクリプション)からダウンロードすることができたのでそのイメージを利用しています。

f:id:stknohg:20181004121254p:plain

FoD ISOイメージのマウント

このISOイメージをOS内でマウントします。

公式の手順としてはネットワークドライブなどに配置したISOファイルをPowerShellのMount-DiskImageコマンドレットを使ってマウントする手順が紹介されています。

本エントリでは公式の手順に加えてマウントしたボリューム、およびドライブレターの取得方法も提示しておきます。

# ISOイメージのマウント
$image = Mount-DiskImage -ImagePath '[FoD ISOのパス].iso' -PassThru

# マウントしたボリューム情報を取得
Get-Volume -DiskImage $image

# ドライブレターを取得する場合
(Get-Volume -DiskImage $image).DriveLetter

FoDをセットアップする

DISMを使い先ほどマウントしたドライブをソースに指定して機能を追加します。
公式の手順ではDISM.exeを使っていましたが、せっかく最初でPowerShellを使っているので本エントリではAdd-WindowsCapabilityを使った手順を紹介します。

Add-WindowsCapability -Online -Name 'ServerCore.AppCompatibility~~~~0.0.1.0' -Source [マウントしたドライブレター]:\ -LimitAccess

# 公式の手順だとこんな感じ
# DISM /Online /Add-Capability /CapabilityName:"ServerCore.AppCompatibility~~~~0.0.1.0" /Source:[マウントしたドライブレター]:\ /LimitAccess

実行例)

f:id:stknohg:20181004121311p:plain

機能の追加後は再起動が要求されるので、サーバーを再起動すれば完了です。

Restart-Computer

【補足】Internet Explorerの追加方法

FoDを使ってInternet Explorerを利用するにはさらにもうひと機能追加する必要があります。

Add-WindowsCapability -Online -Name 'Browser.InternetExplorer~~~~0.0.11.0' -Source [マウントしたドライブレター]:\  -LimitAccess

こちらもインストール後に再起動が必要です。

なお、iexplore.exeへのパスは追加されないので、IEを起動する際は

"C:\Program Files\internet explorer\iexplore.exe"

の様にフルパスで指定してやる必要があります。

FoDを試してみる

公式には

  • Microsoft Management Console (mmc.exe)
  • イベントビューアー (Eventvwr.msc)
  • パフォーマンスモニター (PerfMon.exe)
  • リソースモニター (Resmon.exe)
  • Device Manager (Devmgmt.msc)
  • エクスプローラー (Explorer.exe)
  • PowerShell ISE (Powershell_ISE.exe)
  • フェイルオーバークラスターマネージャー (CluAdmin.msc)

が利用できると謳われています。

ただ、MMCに関してはデスクトップ版の全機能ではなく、上記以外だと

  • ディスクの管理 (diskmgmt.msc)
  • ローカルグループポリシーエディター (gpedit.msc)
  • ローカルユーザーとグループ (lusrmgr)
  • ポリシーの結果セット (rsop.msc)
  • ローカルセキュリティポリシー (secpol.msc)
  • セキュリティが強化されたWindows Defenderファイアウォール(WF.msc)

のみ使える様です。

加えてざっと調べたところ、

  • コントロールパネル (control.exe)
  • クラスター更新対応 (ClusterUpdateUI.exe )
  • 色の管理 (colorcpl.exe)
  • FAX送付状エディター (FXSCOVER.exe)
  • ハードウェア追加ウィザード (hdwwiz.exe)
  • IExperssウィザード (iexpress.exe (非推奨機能))

の起動を確認できました。
(機能がきちんと利用可能かまでは調べてません...)

以下に適当にスクリーンショットを張っていきます。

f:id:stknohg:20181004124043p:plain

f:id:stknohg:20181004124049p:plain

f:id:stknohg:20181004124055p:plain

f:id:stknohg:20181004124102p:plain

f:id:stknohg:20181004124109p:plain

f:id:stknohg:20181004124116p:plain

f:id:stknohg:20181004124133p:plain

f:id:stknohg:20181004124141p:plain

f:id:stknohg:20181004124146p:plain

f:id:stknohg:20181004124156p:plain

f:id:stknohg:20181004124202p:plain

f:id:stknohg:20181004124209p:plain

f:id:stknohg:20181004124216p:plain

f:id:stknohg:20181004124222p:plain

Insider PreviewでのDockerイメージの取得方法

小ネタ、兼、備忘録です。

ちょっとWindows Server 2019 insider previewでWindows Server Containerを試す必要があり、Dockerイメージを取得するためにググったところVirtualization Blogのこんなエントリを見つけたので紹介します。

blogs.technet.microsoft.com

細かい話はこちらを見てください。

Dockerイメージのビルドバージョン

Windows Server ContainerとHyper-V Container(特にWindows Server Container)ではホストOSのバージョンとDockerイメージのOSバージョンを合わせておく必要があり、定期的に更新されるInsider previewではバージョンを合わせるのは結構面倒です。
このため上記のVirtualization Blogの内容は結構役に立つことになります。

一応補足としてバージョン間の互換性へのリンクを記載しておきます。

docs.microsoft.com

Insider previewでのDockerイメージ取得

基本的にはVirtualization Blogからの引用ですが、本エントリでは併せてServer Core Insider、Nano Server Insiderのイメージ取得コマンドも載せておきます。

# レジストリからOSビルドバージョンを取得し、バージョンタグを生成
$winver = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\'
$versiontag = "$($winver.CurrentMajorVersionNumber).$($winver.CurrentMinorVersionNumber).$($winver.CurrentBuildNumber).$($winver.UBR)"

# ホストバージョンと合わせた Windows 10 Insider Build?イメージの取得
docker pull mcr.microsoft.com/windows-insider:$versiontag

# ホストバージョンと合わせた Windows Sever Core Insider イメージの取得
docker pull mcr.microsoft.com/windowsservercore-insider:$versiontag

# ホストバージョンと合わせた Nano Server Insider イメージの取得
docker pull mcr.microsoft.com/nanoserver-insider:$versiontag

各イメージは、当初はDocker Hubにあった様ですが、いまはMicrosoft独自のレジストリであるmcr.microsoft.com*1から取得する必要があります。

このレジストリはUIが無くイメージの検索もできず詳細はよくわかりません...
ただ一部のイメージについてはDocker Hubに対応しているビルドバージョンが記載されているので参考としてリンクを貼っておきます。

ちなみに、イメージによっては名前に-insiderが付いていてもDocker Hubから取得する必要のあるイメージもありレジストリの完全移行はできていない様です。

今が過渡期なのか移行の予定がないのかははっきりしませんが、しばらくは不便な状況が続きそうなので我慢するしかないのかな、といったところです。

補足

もとのVirtualization Blogにしれっと出てるwindows-insiderイメージですが、こいつに関しては何気に情報がありません。
ざっと調べたところ山市さんのブログがヒットしましたが、こちらでもやっぱり謎の様です...

yamanxworld.blogspot.com

【2018/10/07追記】補足2

Microsoft Container Registry(mcr.microsoft.com)とwindows-insiderイメージについていくつか参考になる記事を見つけたのでリンクしておきます。

blogs.technet.microsoft.com

stefanscherer.github.io

細かい内容はリンク先で確認していただきたいのですが、ざっくり、

  • Microsoft Container Registryは新しいOSイメージ専用としている
  • windows-insiderイメージはOSの機能ほぼ全部入りのイメージで、例えばUIテストの自動化などといった自動化処理向けのイメージ

を押さえておけば良いかと思います。

*1:おそらくMicrosoft Container Registryと思われるが詳細不明。