しばたテックブログ

気分で書いている技術ブログです。

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と思われるが詳細不明。

PowerShell CoreのWindows PowerShell互換性とWindowsCompatibilityモジュールについて

先日リリースされたPowerShell Core 6.1の新機能一覧に、以下の様にWindows PowerShellに対する互換性について記載されています。

On Windows, the .NET team shipped the Windows Compatibility Pack for .NET Core, a set of assemblies that add a number of removed APIs back to .NET Core on Windows.

We've added the Windows Compatibility Pack to PowerShell Core 6.1 release so that any modules or scripts that use these APIs can rely on them being available.

The Windows Compatibility Pack enables PowerShell Core to use more than 1900 cmdlets that ship with Windows 10 October 2018 Update and Windows Server 2019.

Windows PowerShellに対する互換性について

この内容にあるとおりPowerShell Core 6.1にはWindows Compatibility Pack for .NET Coreのアセンブリが取り込まれており、もうすぐリリース予定のWindows 10 October 2018 Update(RS5, 1809)とWindows Server 2019においては1900以上の(Windows PowerShell向け)コマンドレットがPowerShell Coreでも利用可能になるそうです。

これらの新しいOSにおいては、これまで機能は追加されたものの一切設定がされていなかったモジュールのPSEditionパラメーターが設定され、この内容にCoreが含まれているモジュールはPowerShell Core 6.1(以降)から呼び出すことが可能です。

例としてWindows Server 2019 Insider preview build 17744の環境にPowerShell Core 6.1をインストールして

Get-Module -ListAvailable -PSEdition Desktop

を呼び出しみると下図の様にC:\Windows\system32\WindowsPowerShell\v1.0\Modules配下にあるWindows PowerShell向けの各種モジュールが利用可能になっていることが確認できます。

f:id:stknohg:20180930203209p:plain

(PSEditionの欄がCore,Desk(top)とCoreも追加されている点に注目)

このため例えばNetAdapterモジュールにあるGet-NetAdapterコマンドレットもふつうに呼び出して利用することが可能です。

f:id:stknohg:20180930203229p:plain

ちなみに、新しいOSであってもPowerShell Core 6.0ではダメですので注意してください。

f:id:stknohg:20180930203301p:plain

WindowsCompatibilityモジュールについて

新しいOSであればPowerShell CoreとWindows PowerShellの互換性が大幅に増したことはわかりましたが、残念ながら古いOSにおいてはPowerShell Core 6.1(以降)でも互換性は従来のまま変わりません。

この問題を解消するためにPowerShell TeamによってWindowsCompatibilityというモジュールが提供されています。

github.com

このモジュールはもともと前項の互換性の向上で対応しきれない部分を補完するために作られた様なのですが、古いOSにおける互換性の向上にも使うことができ、こちらの用途の方か多く使われそうな雰囲気を感じます。


【2018/11/16追記】

本日このモジュールのVer.1.0.0がGAされ、PowerShell Team Blogでより詳細な情報が発表されました。

blogs.msdn.microsoft.com

こちらの内容も参考になりますのでぜひご覧ください。

【追記ここまで】

インストール

このモジュールはPowerShell Galleryからインストール可能です。

Install-Module WindowsCompatibility -Scope CurrentUser

使い方

このモジュールの基本的な使い方は、Import-WinModuleコマンドで利用したいWindows PowerShell向けのモジュールを読み込むとそのモジュールの機能が利用可能になります。

例として先述のNetAdapterモジュールにあるGet-NetAdapterコマンドレットを使いたい場合は、

# Import-WinModuleでWindows PowerShell向けのモジュールを読み込む
Import-WinModule NetAdapter

# あとは使いたい機能を利用する
Get-NetAdapter

f:id:stknohg:20180930211039p:plain

(一部結果の表示がおかしくなっているが、プロパティの値は取得できている)

この他にWindows PowerShellのランタイム上でスクリプトブロックを実行してその結果を返すInvoke-WinCommandといった機能もあります。

# Windows PowerShell上でスクリプトブロックを実行
Invoke-WinCommand -ScriptBlock { $PSVersionTable }

f:id:stknohg:20180930211157p:plain

ほかにもまだいくつか機能はあるのですが、本エントリではこのくらいにしておきます。
細かい説明説明はQuick Start Guideを参照してください。

補足

先ほどの例でもそうでしたが、Import-WinModule使ってインポートしたモジュールは完全に互換があるわけではなく、一部表示などに問題がでる様です。
もしこの様な不具合が出た場合はInvoke-WinCommandを使う方が良いでしょう。

# 例えば表示がおかしい場合はInvoke-WinCommand内で調整して対応することが出来る
# ※対応方法はケースバイケースであるが...
Invoke-WinCommand { Get-NetAdapter | Out-String }

f:id:stknohg:20180930211834p:plain

WindowsCompatibilityモジュールの仕組み

このモジュールの仕組みについてですが、仕組みそのものは割と単純です。

ローカルホストのWindows PowerShellに対してリモートセッションをひとつ張り、PowerShell Remotingの機能を使いWindows PowerShell側の機能を利用しています。

このため、このモジュールの使用中は専用のPSSessionが一つ存在しています。

f:id:stknohg:20180930205622p:plain

そして内部処理を簡単にコードで表すと以下の様な感じになります。

# WindowsCompatibilityモジュールの基本イメージ

# ローカルホストのWindows PowerShellに対してリモートセッションを張る
$session = New-PSSession -ComputerName localhost -ConfigurationName 'Microsoft.PowerShell' -EnableNetworkAccess

# Import-WinModuleの処理イメージ
Import-Module NetAdapter -PSSession $session
Get-NetAdapter

# Invoke-WinCommandの処理イメージ
Invoke-Command -ScriptBlock { $PSVersionTable } -Session $session

最後に

ざっとこんな感じです。

PowerShell CoreのWindows PowerShellに対する互換性は日々向上していますので最新のPowerShell Coreをどんどん使っていくのが良いのではないかと思います。