スクリプトからOfficeアプリの製品名とバージョン(YYMM)情報を取得するには山市良のうぃんどうず日記(263)

現在のMicrosoft Officeアプリには、さまざまな製品の種類と、バージョン/ビルド番号が存在します。これらの情報は製品を特定したり、更新レベルを確認したりする際に重要ですが、WindowsやOfficeアプリのGUI上で確認するのは少し面倒です。プログラム的にコマンドラインやスクリプトから取得する方法を考えてみました。

» 2023年08月16日 05時00分 公開
[山市良テクニカルライター]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「山市良のうぃんどうず日記」のインデックス

山市良のうぃんどうず日記

Officeアプリの更新状態や更新チャネルを目的としたスクリプトを作成

 現在の「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)。

画面1 画面1 2年以上前に紹介した、Officeアプリのバージョン確認、および更新開始メニュー。詳細については、過去の連載記事を参照

 上記記事では、Officeアプリの製品名や、新機能が追加されたときに更新される「YYMM」(YYはリリース年の西暦下2桁、MMは初回リリース月)形式のバージョン情報は考慮しませんでした。これらの情報は、Officeアプリの「ファイル|アカウント」(Microsoft Outlookの場合は「ファイル|Officeアカウント」)で確認できます(画面2)。

画面2 画面2 Officeアプリの製品名(この例ではMicrosoft 365 Apps for enterprise)とYYMM形式のバージョン番号(この例では2304)

Officeアプリの製品名をレジストリから取得するには

 Officeアプリの製品名は、コントロールパネルの「プログラムと機能」にある「プログラムのアンインストールまたは変更」(appwiz.cpl)で、Officeアプリのビルド情報(「バージョン列」とともに「名前」列)で確認できます。そして、この一覧の「名前」と「バージョン」列の情報は、レジストリの「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall」キーの下にあるアプリごとのサブキーの「DisplayName」と「DisplayVersion」に見つかります(画面3)。

画面3 画面3 「プログラムのアンインストールまたは変更」(appwiz.cpl)とレジストリの対応

 なお、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")"
▲サンプルコード:Officeアプリの製品名とビルド番号を取得するPowerShellスクリプトの例

 上記サンプルコードをMicrosoft 365 Apps for EnterpriseがインストールされているPCで実行してみると、期待通りに機能するようです(画面4)。念のため、Officeアプリの永続ライセンス製品でも試してみました。こちらも期待通りの結果となりました(画面5)。

画面4 画面4 Officeのサブスクリプション製品である「Microsoft 365 Apps for Enterprise」を正しく取得できた
画面5 画面5 Officeの永続ライセンス製品である「Microsoft Office Professional Plus 2021」の取得も問題なし

OfficeアプリのYYMM形式はどこにある?

 OfficeアプリのYYMM形式のバージョン情報ですが、レジストリの可能性のありそうな場所を探してみましたが、見つけることはできませんでした。インターネットを検索してみると、同じ情報を取得したいと考えている人がいることが分かりましたが、解決策として示されているのは、以下のWebサイトの「Version History」にある一覧との突き合わせしかなさそうです(画面6)。

画面6 画面6 YYMM形式のバージョン番号をローカルPCから取得する方法は見つからなかった。代わりに、Webの情報利用を考える

 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
▲サンプルコード:OfficeアプリのYYMM形式のバージョン番号を取得するPowerShellスクリプトの例(注:実用的ではありませんが、デモとして)

 このサンプルコードはあまり信用しないでください。スクリプトを作成した時点では、うまく動作しているように見えます(画面7)。

画面7 画面7 サンプルコードは期待通りに動作しているように見えるが、Microsoftのサイト側に大きく依存

 しかし、Microsoftサイト側の情報更新が遅れる、リリース情報が公開されない、サイトに接続できないといったことがあると、情報を取得できません(サンプルでは「Version unknown」と出力します)(画面8)。サイト側のデザイン変更や掲載ミスも直接結果に影響するでしょう。Officeアプリに限らず、Microsoftのリリース情報は遅れやミスがよくあります。

画面8 画面8 サイト側の更新がない、遅れる、ミスがあると、正しい情報を取得できない

筆者紹介

山市 良(やまいち りょう)

岩手県花巻市在住。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.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。