Jamf Proを使って実行されているGoogle Chromeのバージョンを取得してみる
はじめに
アプリケーションのアップデート管理
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.123
と119.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.plist
のKSVersion
というキーに、現在インストールされている最新の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 Version
やOperating System Version
などでも同様なのでJamfさんにはぜひバージョンナンバーを比較できるようにしてもらえると嬉しいなぁ。
ひとまず今回は
- 実行されているバージョン
- 実行されているバージョンが、インストールされている最新のバージョンと一致しているかどうか
を表示する拡張属性を作ってみます。
実行されているChroemのバージョンを表示する拡張属性スクリプト
先ほどの例に加えps
のオプションに-a
を追加しています。忘れると無が返ってきます(きました)。
#!/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
を出します。
また、インストールされていない場合や実行されていない場合はその旨を表示します。
#!/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 Chrome
がLatest 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の管理機能を触ってみると良いと思います。
GWSのコンソールからのポリシー配信に必要な管理対象ブラウザ設定や、コンピュータレベルのポリシー配布はJamf Proの構成プロファイルで行えるので、まだ使ってないという方は是非チェックしてみて下さい。
Discussion