Windows 10クライアントのエディションやバージョン情報を収集する便利な方法

Windows 10になって重要度を増したバージョン管理

 「Windows 10」および「Windows Server 2016」以降、Windows/Windows Serverのバージョン(Windows 10の機能更新プログラム)ごとに異なるOSビルド番号(例:19043)や、品質更新プログラムによってインクリメントされるリビジョン番号(例:19043.1052の「1052」の部分)では、そのOSがサポート期間中であるかどうかや、最新状態に更新されているかどうかを判断することができます。半期チャネル(SAC)のWindows 10は「18カ月」(標準)または「30カ月」(EnterpriseおよびEducationの下半期リリース)の短いライフサイクルであるため、バージョン管理は特に重要です。

 最新情報は以下の「Windows 10リリース情報」のサイトで確認できます。このサイトは2021年7月8日(米国時間)に日本語を含む各国語にローカライズされました。

 2021年4月からWindows 10の標準になったChromiumベースの新しい「Microsoft Edge」は、6週ごと(バージョン94以降は4週ごと)のより短いリリースサイクルとなり、セキュリティ更新はさらに頻繁にリリースされています。日本語ページに最新情報が反映されるまでにはタイムラグがあります。

 「Microsoft 365」アプリを導入している場合は、そのバージョン管理も必要です。こちらも日本語ページに最新情報が反映されるまでにはタイムラグがあります。

 管理対象となるPCのバージョン管理ができていないと、更新プログラムの配布や機能更新プログラムの展開作業、Windows 10の新バージョンに追加された新しいセキュリティ技術への対応などを困難にするでしょう

Active DirectoryからOSのバージョン情報を取得するには

 Active Directoryドメインに参加しているクライアントPCやサーバの場合は、コンピュータアカウントの属性値として、ドメインに最後にログオンしたときのOS名とバージョン、「Service Pack」(「Windows 7」および「Windows Server 2008 R2」以前)が記録されています。

 ドメインコントローラーまたはActive Directory用の「リモートサーバー管理ツール(RSAT)」がインストールされているWindows 10クライアントから「Get-ADComputer」コマンドレットを実行することで、これらの情報を一覧として簡単に取得できます。例えば、次のコマンドラインをPowerShellで実行します(画面1)。Windows 10とWindows Server 2016以降の場合は、「OperatingSystemVersion」プロパティに「10.0(OSビルド番号)」の形式でビルド番号を取得できます。

Get-ADComputer -Filter "objectClass -eq 'computer'" -Property * | Select Name, OperatingSystem, OperatingSystemVersion, OperatingSystemServicePack

画面1 Active Directoryのコンピュータアカウントの属性値として記録されたOS名とバージョン情報は、Get-ADComputerコマンドレットで取得できる

 既に存在しない、あるいは長期間ドメインにログオンしていないクライアントやサーバも出力されますが、その判断のために「LastLogonDate」プロパティを合わせて取得し、確認するとよいでしょう。

ログオンスクリプトで詳細なバージョン情報を入手するには

 「グループポリシー」を利用してユーザーのログオンスクリプトとして次のPowerShellスクリプトを実行すると、指定した共有フォルダ内に「コンピュータ名.txt」のファイル名でWindows、Microsoft Edge、Microsoft 365アプリ(クイック実行、C2R版)のバージョン情報を出力することができます(画面2)。

$filename = "\\コンピュータ名\共有名\" + $env:Computername + ".txt"# Get Windows Version and Buildif ($env:PROCESSOR_ARCHITECTURE -eq "AMD64") {  $winArc = "x64"} else {  $winArc = "x86"}$winReg = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -ErrorAction SilentlyContinue)$winName = $winReg.Productname$winVer = $winReg.DisplayVersionif ($winVer.Length -eq 0) {  $winVer = $winReg.ReleaseId}$winBuild = $winReg.CurrentBuild$winRev = $winReg.UBR#Write-Host "$WinName ($winArc), version $winVer, OS build: $winBuild.$winRev""$WinName ($winArc), version $winVer, OS build: $winBuild.$winRev" > $filename# Get Microsoft Edge Version$edgeVer = (Get-ItemProperty "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe" -ErrorAction SilentlyContinue).VersionInfo.ProductVersionif ($edgeVer.Length -eq 0) {  $edgeVer = (Get-ItemProperty "${env:ProgramFiles}\Microsoft\Edge\Application\msedge.exe").VersionInfo.ProductVersion}if ($edgeVer.Length -eq 0) {  #Write-Host "Microsoft Edge (Chromium) is not installed on this PC."  "Microsoft Edge (Chromium) is not installed on this PC." >> $filename} else {  #Write-Host "Microsoft Edge (Chromium), version: $edgeVer"  "Microsoft Edge (Chromium), version: $edgeVer" >> $filename}# Get Microsoft 365 Apps (C2R) Version$m365Ver = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration" -ErrorAction SilentlyContinue).VersionToReport if ($m365Ver.Length -eq 0) {  #Write-Host "Microsoft 365 Apps (C2R) is not installed on this PC."  "Microsoft 365 Apps (C2R) is not installed on this PC." >> $filename} else {  #Write-Host "Microsoft 365 Apps (C2R), version: $m365Ver"  "Microsoft 365 Apps (C2R), version: $m365Ver" >> $filename}

▲[get-winver.ps1](「\\コンピュータ名\共有名\」の部分は、Domain Usersグループのメンバーが書き込みアクセス許可を持つ共有フォルダに書き換えてください)画面2 ログオンスクリプトを利用してクライアントやサーバの各種情報を収集する

 なお、OSやアプリの新製品(新バージョン)が登場した際には、このスクリプトは見直しが必要になる可能性があります。このスクリプトではWindowsの製品名をレジストリ値「ProductName」から取得していますが、「Windows 11」の早期プレビュービルド(OSビルド10.0.22000)では「Windows 10 Enterprise」が設定されています。

 常に最後にログオンしたときの情報に更新されるため、最新情報を収集することができます。PowerShellスクリプトをカスタマイズすることで、その他の業務アプリのバージョン情報やネットワークの情報、ユーザーの情報なども収集対象に簡単に追加できます。

WMIフィルターでバージョンごとのGPOを制御するには

 WindowsやWindows Serverのバージョンごとに異なる処理を実行する際、その処理をグループポリシーで実現できる場合は、「グループポリシーオブジェクト(GPO)」の適用先を「WMIフィルター」で絞り込むのが簡単です(画面3画面4)。WMIフィルターの例を幾つか紹介します。WMIフィルターを利用する場合も、新しいOSが登場した際には見直しが必要になる可能性があります。

Windows Server 2016以降のLTSC(長期サービスチャネル)

select * from win32_OperatingSystem where Caption like "Microsoft Windows Server 20%"

Windows 10 Enterprise(評価版を除く)

select * from Win32_OperatingSystem where Caption like "Microsoft Windows 10%" and OperatingSystemSKU = "4"

Windows 10 Pro

select * from Win32_OperatingSystem where Caption like "Microsoft Windows 10%" and OperatingSystemSKU = "48"

Windows 10 バージョン2004/20H2/21H1

select * from Win32_OperatingSystem where Caption like "Microsoft Windows 10%" and Version like "10.0.1904%"

画面3 Windows Server 2016以降のLTSC(長期サービスチャネル)版Windows Serverを識別するWMIフィルターの例。クエリの妥当性は対象のコンピュータで「Get-CimInstance -Query ‘クエリ文字列’ 」を実行して確認するとよい画面4 WMIフィルターをGPOに関連付ける

 WMIフィルターの作成方法や「Win32_OperatingSystem」クラスで利用可能な属性については、以下のドキュメントを参考にしてください。