このページの本文へ

Windows Info 第206回

最新Previewで生じたWindows 10のカーネルの変化を調べる

2020年01月12日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

Windows Insider ProgramのFast Ringの位置付けが変わった

 昨年12月16日にWindows Insider ProgramのFast RingでBuild 19536、今年に入って8日にBuild 19541が公開されている。以前解説したように(「完成が近づいてきたWindows 10 20H1とともに、Windows Insider Programも変わる」)、Build 19536は「rs_prelease」というブランチになるが、これはマイクロソフト社内のアクティブな開発ブランチからビルドを直接受け取るのだという。

 このブランチで公開される新機能は、今春以降のアップデートに取り込まれるが、特定のWindows 10バージョンを想定したものではないとのこと。つまり、Fast Ringは今後ずっとプレビュー版ビルドが公開されていくが、機能アップデートに関しては別途プレビュービルドを提供するということらしい。

 20H1でWindows Insider ProgramでFast Ringを選択していたユーザーは、強制的にSlow Ringに移行された。おそらく、Slow Ringが春の機能アップデート用になると推測できる。19H2のプレビューでは、最終的にReleas Preview Ringが使われたので、今後のWindows Insider Programでは、

Fast Ring:継続開発される開発ブランチのプレビュー
Slow Ring:春の機能アップデートのプレビュー
Release Preview Ring:秋の機能アップデートのプレビュー

となると思われる。

 20H1は、3月末から4月に完成し、5月には一般向け配布が開始される予定だ。しかし、Slow Ringのほうは、昨年12月10日にビルド19041が公開されたのを最後にほぼ1ヵ月、プレビュー版が配布されていない。Slow Ringの説明では、「1ヵ月に1回か2回」となっているので、そろそろ何かあるはずだ。

Fast RingでWindows 10の変化を調べる

 Fast Ringが特定の機能更新を想定しなくなるため、Fast RingでのWindows 10の改良がすべてSlow Ringで公開されるプレビューに反映しなくなる可能性がある。

 新機能の追加などは、MSのブログなどで確認することができるが、情報としてはバグフィックス程度しか公開されないビルドも、リリース前になると増えてくる。また、カーネルの変更などに関する情報は公開されていない。そこで、Fast Ringに登録しているPC(複数台ある)の変化を記録することにした。

 プレビューがアップデートすると必ず再起動するので、そのタイミングでスクリプトを実行しようかと思ったが、プレビュー版のアップデートのあと、初期設定が起動することもあり、スクリプトが原因で障害が起こるのも面倒である。このため、以前紹介したPowerShellのリモート実行機能を使い(「PowerShell Remotingで自宅にあるたくさんのWindowsマシンを管理する」)、1台のマシンから他のマシンの情報を取得することにした。このようにすれば調査対象のマシンにプログラムやスクリプトを入れる必要がない。

 PSRemotingは、操作されるマシン側で1回コマンドを実行して、リモート実行を許可すれば、あとは、操作元のPCからネットワーク経由で見えるようになっていればよい。

 これまで、プレビュー版に対してずっと使ってきたが、アップデートでは無効にはならない。もちろんインターネットを介しての実行などはできないが、ローカルネットワークであれば、Windowsマシンのリモート実行などが簡単に実行できる。具体的には、リモート先のマシンで以下のコマンドを実行する。

Enable-PSRemoting

 なお、Hyper-Vなどで仮想ネットワークアダプター組み込んでいる場合、すべてのネットワークをPrivateにするのが難しい(設定する場合には、ネットワークに接続して動作状態にする必要がある)。この場合には、

Enable-PSRemoting -SkipNetworkProfileCheck

として、ネットワークのチェックを抑制する。

 さて何を調べるかだが、アップデートされたファイルを全部では情報量が多すぎてどうしようもない。ここは、ビルド番号などの情報とカーネルファイルの変遷を調べることにした。

 具体的には「ntoskrnl.exe」(C:\Windows\System32\ntoskrnl.exe)の違いを調べる。システム情報などは、Systeminfo.exeコマンドを使うこともでき、このコマンドもリモートコンピューターに対して実行が可能なのだが、こちらも情報が多すぎるし、OS名称など、利用価値のないものが多数含まれている。

 最低限必要な情報としては、カーネルファイルのサイズの作成日、そしてプロパティとして公開されているバージョン情報、そしてWindowsのビルド番号などだ。カーネルファイルも通常のファイルなので、PowerShellのGet-ChildItemコマンドでファイルオブジェクトを取得したら、「Length」(ファイルサイズ)、「CreationTime」(ファイルの作成日)、「VersionInfo」(ファイルのプロパティ)を取得すればよい。VersionInfoは、エクスプローラーの右クリックメニューでファイルのプロパティを開いたときの「詳細」タブに表示される情報だ。

 ただし、PowershellでVersionInfoを取得すると単なる文字列になるため、ちょっとした工夫が必要になる。まずは、ファイルオブジェクトを取得する。

$L=Get-ChildItem "C:\\Windows\\System32\\ntoskrnl.exe"

変数$Lにカーネル(ntoskrnl.exe)のファイルプロパティが入るため、あとは、以下のようにして情報を出力できる。

$L.Length
$L.CreationTimeUtc
$L.Versioninfo -split "`n" | select-string "Version|Filename"

 また、Windowsのビルド番号などは、レジストリから取得する。これには、

(Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").BuildLabEx

を使う。BuildLabExは、ビルド番号やビルドのブランチ名などを含むレジストリ値である。

 さて、他のマシンにPSRemotingでコマンドを実行させるには、以下のような手順を使う

$SX=New-PSSession "PC名"
Invoke-Command -Session $SX -ScriptBlock {リモートで実行するコマンド}
Remove-PSSession $SX

最初の行は、リモートのコンピューター名を指定してセッションを作るもの、2行目はこれを使ってスクリプトを実行させるもの、3行目は作成したセッションの終了である。コマンド1つだけなら、

Invoke-Command -ComputerName "PC名" -ScriptBlock {リモートで実行するコマンド}

としてもいいのだが、複数のInvoke-Commandを使うなら、セッションの作成、終了は別にしたほうが効率的だ。あとで、コマンドを追加する可能性を考えると、最初からこの形式にしておいたほうがいいだろう。

 なお、単独のInvoke-Commandなら、"PC名"に複数のPC名をカンマで区切って並べると、同時に複数のマシンに実行ができるのだが、出力が混ざってしまうため、設定変更リモート側で完結する処理には向いているが、情報収集用途では使うのが難しい。そこで複数のPCを対象にする場合、foreachなどでPC名1つについて、情報を取得するようにしたほうが便利だ。

 このあたりをまとめたのが、以下のリストのプログラムである。メモ帳などにコピーして、拡張子.ps1(ファイル名はなんでもいい)として保存し、Powershellから起動することで、最初の行で指定したPCから情報を取得する。

 実行日時を先頭に出力するようにしてあるので、このままファイルに追記していけば記録ができる。必要なら、CSVにするとか、いろいろと考えられるが、今回はとりあえず原理を示すにとどめた。

$PC="pc1","pc2","pc3"
"Date:$(get-date)"
foreach ($x in $PC) {
    $SX=New-PSSession $x
    "`n########## Computer Name= $x";
    $L=(Invoke-Command -Session $SX -ScriptBlock { Get-ChildItem "C:\\Windows\\System32\\ntoskrnl.exe" } )
    $L.Versioninfo -split "`n" | select-string "Version|Filename"
    "File Size: $($L.Length)"
    "CreationTimeUtc: $($L.CreationTimeUtc)`n"
    (Invoke-Command -Session $SX -ScriptBlock { ”BuildLabEx: " + (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").BuildLabEx })
    remove-PSSession $SX
    }

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン