ネットワーク上で稼働しているWindowsのバージョンを追跡するのは、特にSCCMなどの適切な管理ツールがない場合、非常に面倒な作業です。さらに、Windows 10、11、あるいはそれ以前のビルドが混在する環境を管理している場合は、さらに面倒になります。幸いなことに、PowerShellがそんな時に頼りになります。ドメイン内で実行している場合でも、少数のデバイスを操作している場合でも、バージョン情報を素早く収集する方法があります。ただし、場合によってはコマンドをいくつか調整したり、適切な権限が付与されていることを確認したりする必要があるかもしれません。しかし、一度設定してしまえば、アップデートの追跡やサポートされていないOSバージョンの特定にかかる時間を大幅に節約できます。
ネットワーク上の Windows のバージョンとビルドを見つける方法
単一のマシンからローカル情報を取得する
これは最も簡単な部分です。特定のWindowsマシンで実行されているバージョンを確認したいだけなら、PowerShellから直接実行できます。以下のコマンドを実行してください。
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' | Select-Object ProductName, ReleaseID, CurrentBuildGet-ComputerInfo | Select-Object WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer
これらには製品名(Windows 10 Proなど)、リリースID(21H2など)、ビルド番号が表示されます。一部のマシンでは、最初のコマンドが失敗したり、管理者権限でPowerShellを実行しないとすべての詳細が表示されない場合があります。再起動するか、管理者としてPowerShellを実行すると問題が解決する場合があります。
Active Directory 内の複数のマシンから情報を取得する
ドメインを管理していて、そこに何があるのかを確認したい場合は、Get-ADComputerコマンドレットを使用できます。Active Directoryモジュール(リモートサーバー管理ツールの一部)がマシンにインストールされていることを確認してください。その後、次のコマンドを実行してください。
Get-ADComputer -Filter {(Enabled -eq $True)} -Property * | Select-Object Name, OperatingSystem, OperatingSystemVersion
これにより、アクティブなコンピューターのリストとOS情報がパイプ処理されます。特にクリーンアップやアップデートを計画している場合には、古いOSバージョンやサポートされていないビルドを見つけるのに役立ちます。念のためお知らせしますが、整理整頓のために非アクティブなアカウントを定期的に削除してください。
ビルド番号をより馴染みのあるバージョンラベルに変換する
Windows 10と11のビルド番号は一般的なラベルと一致しないため、一目で見分けるのが難しくなります。ビルド番号を21H1、22H2などの名前に変換する簡単な関数を追加できます。便利な関数を以下に示します。PowerShellセッションにコピーしてください。
function Convert-WindowsBuild { [CmdletBinding()] param( [string] $OperatingSystem, [string] $OperatingSystemVersion ) if (($OperatingSystem -like '*Windows 10*') -or ($OperatingSystem -like 'Windows 11*')) { $WinBuilds= @{ '10.0 (22621)' = "Windows 11 22H2"; '10.0 (19045)' = "Windows 10 22H2"; '10.0 (22000)' = "Windows 11 21H2"; '10.0 (19044)' = "Windows 10 21H2"; '10.0 (19043)' = "Windows 10 21H1"; '10.0 (19042)' = "Windows 10 20H2"; '10.0 (18362)' = "Windows 10 1903"; '10.0 (17763)' = "Windows 10 1809"; '10.0 (17134)' = "Windows 10 1803"; '10.0 (16299)' = "Windows 10 1709"; '10.0 (15063)' = "Windows 10 1703"; '10.0 (14393)' = "Windows 10 1607"; '10.0 (10586)' = "Windows 10 1511"; '10.0 (10240)' = "Windows 10 1507"; '10.0 (18898)'= 'Windows 10 Insider Preview' } $WinBuild= $WinBuilds[$OperatingSystemVersion] } else { $WinBuild = $OperatingSystem } if ($WinBuild) { $WinBuild } else { 'Unknown' } }
複数の異なるマシンを整理する際に、より正確な情報が得られます。ただし、ビルドデータが完璧ではない場合や、OS情報が標準的でない場合は「不明」と表示される場合があるので、ご注意ください。完璧ではありませんが、通常は十分な情報なので問題ありません。
すべての情報をレポートにまとめる
ネットワークのWindows環境のスナップショット(ホスト名、IPアドレス、ビルド番号、最終ログイン情報など)が必要な場合は、このスクリプトが非常に便利です。このスクリプトは、有効なドメインコンピューターすべてからデータを取得し、わかりやすく表示します。
$Comps=Get-ADComputer -Filter {(Enabled -eq $True)} -Properties * $CompList=foreach ($Comp in $Comps) { [PSCustomObject] @{ Name = $Comp. Name; IPv4Address = $Comp. IPv4Address; OperatingSystem = $Comp. OperatingSystem; Build = Convert-WindowsBuild -OperatingSystem $Comp. OperatingSystem -OperatingSystemVersion $Comp. OperatingSystemVersion; LastLogonDate = $Comp. LastLogonDate } } $CompList | Out-GridView
または、後でアーカイブまたは分析する場合は、CSV にダンプします。
$CompList | Export-Csv -Path.\windows_version_report.csv -NoTypeInformation
こうすることで、どのシステムが古いビルドやサポートされていないビルドを実行しているかを簡単に把握し、それに応じて計画を立てることができます。
ワークグループマシンの情報をリモートで取得する
すべてのマシンがドメイン内にあるわけではないので、リモートコンピューターに直接クエリを実行するという方法もあります。時間はかかりますが、柔軟性は抜群です。これらのマシンでPowerShellリモート処理が有効になっている場合は、Invoke-Commandを使用してください。
Invoke-Command -ScriptBlock {Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' | Select-Object ProductName, ReleaseID, CurrentBuild} -ComputerName wsk-w12b21 | Select-Object PSComputerName, ProductName, ReleaseID, CurrentBuild
テキスト ファイルにコンピューターのリストがある場合は、複数のマシンに対してこれを一度に自動化できます。
Invoke-Command -ComputerName (Get-Content c:\ps\PC_list.txt) -ScriptBlock {Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' | Select-Object ProductName, ReleaseID, CurrentBuild} | Select-Object PSComputerName, ProductName, ReleaseID, CurrentBuild
留意点: PowerShell リモート処理は、すべてのターゲット マシンで有効化して構成する必要がありますが、これはワークグループでは必ずしも簡単ではありません。
なぜこの方法を採用するのでしょうか?
正直に言って、これは実際に何が動いているのかを確認する最も簡単な方法です。WMIフィルターやブラウザスパムに煩わされることなく、シンプルなスクリプトだけで済みます。また、古くなったOSバージョンやサポートされていないビルドを特定し、将来的に大きな問題になる前に対処するのに役立ちます。さらに、ネットワークを手間をかけずに監視できます。