⚙️

Jamf Proを使って実行されているGoogle Chromeのバージョンを取得してみる

2023/11/30に公開

はじめに

アプリケーションのアップデート管理

MacAdminのみなさまは、アプリケーションの配布に何を使っているでしょうか。
VPPやJamf Appカタログ、Installomatorを使っている方が多いのではないのかなと思います。

Jamf Proではパッチ管理という機能でインストール済みのアプリバージョンのサマリを確認したり、スマートコンピュータグループのクライテリアでアプリケーション名とバージョンを指定したりできます。
アプリケーションがアップデートされていないスマートコンピューターグループを作り、アップデートのポリシーを実行している方も多いと思います。

アプリケーションがアップデートされた後もユーザーがそのアプリケーションを再起動せずに使い続けた場合、最新版がインストールされているのに古いバージョンのアプリケーションが実行され続けているみたいなことがあったりします。
対応は様々だと思いますが、ユーザーに再起動を促す通知を出したりする事が多いのかなと思います。

Jamf Proで見れるアプリケーションのバージョン

アプリケーションによっては、Jamf Proのパッチ管理やインベントリ情報で確認できるアプリケーションのバージョンと実行中のバージョンが違う場合があります。
今回例に上げるGoogle Chromeがそうだったのですが、拡張属性を使うことで実行中のGoogle Chromeのバージョンを取得できるんじゃないかな?と思ったのでやってみました。

可視化のための検証です

あくまで可視化とその検証が目的のため、直接的に課題を解決する内容ではありません。
環境などによっては正常に動作しない場合があるかもしれません。BetaやCanaryがインストールされている環境での動作や、Chrome以外のアプリケーションで同じ事ができるかどうかなども未検証です。

また、今回例に上げるGoogle Chromeの管理を行う場合はChrome Enterpriseのポリシーや管理対象ブラウザの機能を使うことになると思いますが、この記事では触れていません。

とりあえずやってみる

後ほど改めて触れますが、実行中のバージョンだけを取得してもスマートコンピュータグループでいい感じに使うのがちょっと面倒です。
なのでまずは

  • 実行中のバージョン
  • インストールされている最新のバージョン

を取得してみようと思います。

環境は
Jamf Pro v11.1.0
MacBook Air M1 2020 Sonoma
Google Chrome 119.0.6045.123 (pkgからインストール後自動更新を確認し、再起動していない状態)
です。

実行中のChromeのバージョンを取得してみる

Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/
を見てみると、バージョンナンバーのディレクトリがありました。
Currentは最新のバージョンのディレクトリへのエイリアスです。

ls /Applications/Google\ Chrome.app/Contents/Frameworks/Google\ Chrome\ Framework.framework/Versions/
119.0.6045.123	119.0.6045.199	Current

この例では119.0.6045.123119.0.6045.199の2つですが、場合によってはより多くのバージョンのディレクトリがあったりします。
なのでこの情報だけでは実行されているバージョンを判断することは出来なさそうなのですが、実行中のChrome Helperのパスを調べれば実行中のChromeのバージョンがわかりそうです。

ということでpsしてみます。-oオプションでcommを指定してコマンドのみを表示させていますが別になくても良いです。
結果をGoogle Chrome Helperでgrepするとたくさん出てきたりするので、シンプルにするためにGoogle Chrome Helper (GPU)を指定してみました。

ps -xo comm | grep -e '[G]oogle Chrome Helper (GPU)'
/Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/119.0.6045.123/Helpers/Google Chrome Helper (GPU).app/Contents/MacOS/Google Chrome Helper (GPU)

この結果から、/Versions/の後に続いているバージョン情報だけを抜き出してみます。

ps -xo comm | grep -e '[G]oogle Chrome Helper (GPU)' | sed 's/.*\/Versions\/\([0-9.]*\)\/.*/\1/'
119.0.6045.123

実行中のChromeのバージョン119.0.6045.123を取得できました。
Chromeの設定画面はこのような表示になっていました。

Jamf Proのインベントリ情報はこのようになっていました。

インストールされている最新のChromeのバージョンを取得してみる

Jamf Proのインベントリ情報や、クライテリアのApplication Versionとかで参照できる値と同じですが、インストールされている最新のバージョンと実行されているバージョンが一致するかどうかをスクリプトで判断するために取得してみます。
Google\ Chrome.app/Contents/Info.plistKSVersionというキーに、現在インストールされている最新のChromeのバージョン情報がありました。

plutil -extract KSVersion raw /Applications/Google\ Chrome.app/Contents/Info.plist
119.0.6045.199

インストールされている最新のChromeのバージョンは119.0.6045.199でした。

インストール済みの最新バージョンと実行中のバージョンが違う事が確認できたので、Jamf Pro上で確認するために拡張属性を作ってみます。

拡張属性を作ってみる

Jamf Proの拡張属性はString、Integer、Dateの型がありますが、不等号で比較できるのはIntegerだけです。
スマートコンピュータグループなどのクライテリアで
インストールされている最新バージョン > 実行中のバージョン
みたいな指定ができると便利だなと思うのですが、これは元々あるクライテリアのApplication VersionOperating System Versionなどでも同様なのでJamfさんにはぜひバージョンナンバーを比較できるようにしてもらえると嬉しいなぁ。

ひとまず今回は

  • 実行されているバージョン
  • 実行されているバージョンが、インストールされている最新のバージョンと一致しているかどうか

を表示する拡張属性を作ってみます。

実行されているChroemのバージョンを表示する拡張属性スクリプト

先ほどの例に加えpsのオプションに-aを追加しています。忘れると無が返ってきます(きました)。

Google Chrome Version Running
#!/bin/bash

runningVersion=$(ps -axo comm | grep -e '[G]oogle Chrome Helper (GPU)' | sed 's/.*\/Versions\/\([0-9.]*\)\/.*/\1/')

echo "<result>$runningVersion</result>"

実行中のバージョンとインストールされている最新のバージョンを比較する拡張属性スクリプト

インストールされているバージョンと実行されているバージョンが一致していたらMatch、そうでない場合はMismatchを出します。
また、インストールされていない場合や実行されていない場合はその旨を表示します。

Google Chrome Versions Compare
#!/bin/bash

installedVersion=$(plutil -extract KSVersion raw /Applications/Google\ Chrome.app/Contents/Info.plist)
runningVersion=$(ps -axo comm | grep -e '[G]oogle Chrome Helper (GPU)' | sed 's/.*\/Versions\/\([0-9.]*\)\/.*/\1/')

if [[ ! -f /Applications/Google\ Chrome.app/Contents/Info.plist ]]; then 
    result="Google Chrome not installed."
elif [[ -z $runningVersion ]]; then 
    result="Google Chrome not running."
elif [[ $installedVersion == $runningVersion ]]; then 
    result="Match"
else
    result="Mismatch"
fi

echo "<result>$result</result>"

zshのis-at-leastを使えるかな?と思ったのですが、知りたいのは一致しているかどうかだけだったのでやめました。

作った拡張属性を見てみる

このように表示されていました。

スマートコンピュータグループを作ってみる

作った拡張属性をクライテリアにして、スマートコンピュータグループを作ってみます。
パッチ管理にGoogle Chromeが追加されており、拡張属性と合わせて参照します。

なおJamf Proの仕様で、パッチ管理のLatest Versionを参照したスマートコンピュータグループは、ポリシーなどのスコープに使用できません。

最新のChromeが実行されている

これはそのまんまです。
Patch Reporting: Google Chrome is Latest Version
and
Google Chrome Versions Compare is Match

最新のChromeがインストールされているが、実行されていない

Early Stableがインストールされていると、パッチ管理のLatest Versionと一致しなくなってしまうため、Unknown Versionを除外しています。

Patch Reporting: Google Chrome is Latest Version
and
Google Chrome Versions Compare is Mismatch
and
Patch Reporting: Google Chrome is not Unknown Version

その他

ここから先は余談的な感じで、こういう状態もあったりするよね?と思ったのを書いてます。

Early Stableがインストールされているかも

たまに一部のデバイスにEarly Stableが降ってくることがあるのですが、その場合Jamf Proのパッチ管理ではUnknown Versionと表示されてしまいます。
Patch Reporting: Google ChromeLatest Versionではないグループと区別するために、Unknown Versionのみのグループを作ってみます。

Early Stableが実行されているかも

Patch Reporting: Google Chrome is Unknown Version
and
Google Chrome Versions Compare is Match

Early Stableがインストールされてるけど古いバージョンを実行しているかも

Patch Reporting: Google Chrome is Unknown Version
and
Google Chrome Versions Compare is Mismatch

最新のChromeがインストールされていない

今回の趣旨とは関係なく普通に課題なやつです。自動アップデートが正常に機能していない可能性があります。
上の例と同様にEarly Stableの可能性があるUnknown Versionを除外しています。
Patch Reporting: Google Chrome is not Latest Version
and
Patch Reporting: Google Chrome is not Unknown Version

他にもChrome入ってないとか、入ってるけど使ってないとか色々ありそうですね。

さいごに

はじめの方にも書いたのですが、今回の内容は直接課題を解決するものではありませんでした。
ふわっと持ってる課題感を数値化したり、見えてなかったから気付かなかった課題を見つけられるかもという感じです。

実際にChromeの管理どうしようという課題感を持っている方は、とりあえずChromeの管理機能を触ってみると良いと思います。
https://support.google.com/chrome/a/topic/7590800?hl=ja

GWSのコンソールからのポリシー配信に必要な管理対象ブラウザ設定や、コンピュータレベルのポリシー配布はJamf Proの構成プロファイルで行えるので、まだ使ってないという方は是非チェックしてみて下さい。

Discussion