現在のMicrosoft Officeアプリには、さまざまな製品の種類と、バージョン/ビルド番号が存在します。これらの情報は製品を特定したり、更新レベルを確認したりする際に重要ですが、WindowsやOfficeアプリのGUI上で確認するのは少し面倒です。プログラム的にコマンドラインやスクリプトから取得する方法を考えてみました。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
現在の「Microsoft Office」アプリ(以下、Officeアプリ)には、「Microsoft 365」サブスクリプション製品(Microsoft 365 Apps for Enterprise/Business/Personalなど)や永続ライセンス製品(Microsoft Office Professional Plus 2021など)など、購入方法やプランに応じてさまざまな製品が存在します。
また、Officeアプリは継続的に更新され、新機能が追加される「YYMM形式」のバージョン番号(2305など)と、更新レベルを示すビルド番号(16.0.16501.20210や16501.20210)も存在します。これらの情報は、WindowsやOfficeアプリのGUI操作で確認できますが、プログラム的にコマンドラインやスクリプトから取得する方法を考えてみました。
2年以上前に書いた以下の連載記事では、Officeアプリの更新バージョン情報(実際には更新ビルド)と、更新チャネルの確認、および更新プログラムのインストール開始を、Officeアプリを開くことなくスタートメニューからのワンクリックでできるようにする方法を紹介しました。この方法は、筆者の複数台のPCで今でも重宝しています(画面1)。
上記記事では、Officeアプリの製品名や、新機能が追加されたときに更新される「YYMM」(YYはリリース年の西暦下2桁、MMは初回リリース月)形式のバージョン情報は考慮しませんでした。これらの情報は、Officeアプリの「ファイル|アカウント」(Microsoft Outlookの場合は「ファイル|Officeアカウント」)で確認できます(画面2)。
Officeアプリの製品名は、コントロールパネルの「プログラムと機能」にある「プログラムのアンインストールまたは変更」(appwiz.cpl)で、Officeアプリのビルド情報(「バージョン列」とともに「名前」列)で確認できます。そして、この一覧の「名前」と「バージョン」列の情報は、レジストリの「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall」キーの下にあるアプリごとのサブキーの「DisplayName」と「DisplayVersion」に見つかります(画面3)。
なお、64bit(x64)版のWindowsで32bit版のOfficeアプリを使用している場合は、「HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall」キーの下を探す必要があるかもしれません。
前掲の記事では、Officeアプリのビルド番号を「HKEY_LOACL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration」キーにある「VersionToReport」値から取得しています。「VersionToReport」値と「DisplayVersion」値が一致し、「DisplayName」に「Microsoft 365 Apps」(サブスクリプション製品)または「Microsoft Office」(永続ライセンス製品)が含まれるものを、「Uninstall」キーの下から見つけ出せれば、Officeアプリの製品名を正しく取得できそうです。
以上のことを踏まえて、Officeアプリの製品名とビルド番号を取得するPowerShellのサンプルコードを考えてみました。
$O365CurrentVer = "" $O365CurrentVer = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration" -ErrorAction SilentlyContinue).VersionToReport if ($O365CurrentVer.Length -eq 0) { Write-Host "Microsoft 365 Apps (C2R) is not installed on this PC." exit } $O365ProductName = "" $productlists = (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion | ? {$_.DisplayName -ne $null }) if (Test-Path HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\) { $productlists = $productlists + (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion | ? {$_.DisplayName -ne $null }) } foreach ($product in $productlists) { if (($product.DisplayVersion -eq $O365CurrentVer) -and (($product.DisplayName -like "Microsoft 365 App*") -or ($product.DisplayName -like "Microsoft Office *"))) { $O365ProductName = $product.DisplayName } } Write-Host $O365ProductName "(Build "$O365CurrentVer")"
上記サンプルコードをMicrosoft 365 Apps for EnterpriseがインストールされているPCで実行してみると、期待通りに機能するようです(画面4)。念のため、Officeアプリの永続ライセンス製品でも試してみました。こちらも期待通りの結果となりました(画面5)。
OfficeアプリのYYMM形式のバージョン情報ですが、レジストリの可能性のありそうな場所を探してみましたが、見つけることはできませんでした。インターネットを検索してみると、同じ情報を取得したいと考えている人がいることが分かりましたが、解決策として示されているのは、以下のWebサイトの「Version History」にある一覧との突き合わせしかなさそうです(画面6)。
MicrosoftのWebサイトの情報に頼るのは、オンラインであることが必須ですし、デザイン変更やサイト側のミスなどで正しく情報を取得できない可能性があります。それを承知の上で、Webコンテンツを取得して、それと付き合わせてバージョン番号を取得する方法をなるべく簡単にコード化してみました。
次のサンプルコードは、上記サイトからコンテンツを取得し「(Build XXXXX.XXXXX)」の文字列を検索して、最初に見つかった場所の前の6文字以内にYYMM形式のバージョン番号と空白が存在するものと仮定したものです。
$O365CurrentVer = "" $O365Bitness = "" $O365CurrentVer = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration" -ErrorAction SilentlyContinue).VersionToReport if ($O365CurrentVer.Length -eq 0) { Write-Host "Microsoft 365 Apps or Microsoft Office (C2R) is not installed on this PC." exit } else { $O365Platform = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration").Platform if ($O365Platform -eq "x64") { $O365Bitness = "64-bit" } else { $O365Bitness = "32-bit" } } $O365BuildStr = "(Build "+$O365CurrentVer.Remove(1,5)+")" $O365VerStr = "unknown" $OfficeVerHisURL = "https://learn.microsoft.com/en-us/officeupdates/update-history-microsoft365-apps-by-date" try { $webcontent = (Invoke-WebRequest -uri $OfficeVerHisURL).Content if ($webcontent.contains($O365BuildStr)) { if ($webcontent.Substring($webcontent.IndexOf($O365BuildStr)-6,6).Trim() -match '[0-9]{4}'){ $O365VerStr = $webcontent.Substring($webcontent.IndexOf($O365BuildStr)-6,6).Trim() } } } catch { Write-Host "Error: Failed to get the release information from Microsoft Web Site." } Write-Host "Version" $O365VerStr $O365BuildStr $O365Bitness
このサンプルコードはあまり信用しないでください。スクリプトを作成した時点では、うまく動作しているように見えます(画面7)。
しかし、Microsoftサイト側の情報更新が遅れる、リリース情報が公開されない、サイトに接続できないといったことがあると、情報を取得できません(サンプルでは「Version unknown」と出力します)(画面8)。サイト側のデザイン変更や掲載ミスも直接結果に影響するでしょう。Officeアプリに限らず、Microsoftのリリース情報は遅れやミスがよくあります。
岩手県花巻市在住。Microsoft MVP 2008 to 2024(Cloud and Datacenter Management)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『Windows版Docker&Windowsコンテナーテクノロジ入門』(日経BP社)、『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.