システム環境設定の「セキュリティとプライバシー」>「セキュリテイ」>「オートメーション」項目に指定Bundle IDのアプリケーションが登録されているかどうかをチェックするAppleScriptです。
macOS 10.14, Mojaveの機能を利用しているため、macOS 10.14以降を必要とします。また、実行にはScript Debugger上で動かすか、本ScriptをAppleScriptアプレットに保存して結果を別の方法で出力する必要があります(ファイルに書き出すとか、他のテキストエディタなどの新規ドキュメント上に書き込むとか、display notificationコマンドでノーティフィケーション表示するとか)。
プログラムの本体は「Hal Mueller’s Blog」の2018年9月4日掲載記事「Privacy Consent in Mojave (part 2: AppleScript)」内のObjective-CのプログラムをCocoa Framework化した「tccKit」です。
#2023/2/8 Update Universal Binaryでビルド
–> Download tccKit.framework (To ~/Library/Frameworks)
–> Download tccKit source (Xcode 10.1 Project)
掲載Sample Scriptのように、結果は文字列(NSString)で返ってきます。
上記のような「セキュリティ」の状況で実行したところ、
Keynote:”PrivacyConsentStateGranted”(認証ずみ)
CotEditor:”PrivacyConsentStateUnknown”(不明、実際には未認証)
Mail:”PrivacyConsentStateUnknown”(不明、実際には未認証)
のような結果が得られました。
Objective-Cのプログラム側では、PrivacyConsentStateUnknown / PrivacyConsentStateGranted / PrivacyConsentStateDenied の3つの状態を返すようになっています。”PrivacyConsentStateGranted”のみユーザーの認証が得られている、と見てよいのでしょう。
もしも、PrivacyConsentStateDenied(ユーザーがダイアログで「許可しない」ボタンを押した)という状況であれば、シェルの/usr/bin/tccutilコマンドで状態をクリアし(do shell script ”tccutil reset com.apple.Terminal” とか)、再度、ユーザーの認証を取得する(activateなど簡単なコマンドを実行)とよいでしょう。
→ 実際には、activateやpropertyを取得する程度だとOSのオートメーション認証が反応せず、ドキュメントを新規作成するぐらいのことをやる必要があります。じゃあドキュメントを作らないタイプのアプリケーションだとどうなんだという話がありますが、それはひととおり試してみるしかなさそうです
ただ、本Frameworkは本当に単純にHal Mueller’s Blogの記述サンプルをコピペで(ちょっと改変して)呼び出して動かしているだけなので、起動中のアプリケーションのBundle Identifierをすべて取得してループでチェック、といった処理を行うと、なぜか結果が返ってきません(Script Debuggerがハングアップ)。連続で呼び出すのがよくないのか、チェック用のAPIに癖があるのかわかりませんが、現状でわかっている問題点として記載しておきます。
–> いろいろ調査してみたら、Code Signされていないアプリケーション(例:Skim)のチェックを行うとハングアップするようです。スクリプタブルではないアプリケーションのBundle IDを渡しても、ハングアップは起こりません
CAUTION: AEDeterminePermissionToAutomateTarget hangs up with unsigned application such as Skim PDF reader
macOS 10.14上で開発を行う場合には心の底から必要な処理だと思うので、本Frameworkはもうちょっとブラッシュアップしたい気持ちでいっぱいです。macOS 10.13が前代未聞・空前絶後のダメダメさだったので(Tim Cookもう勘弁して)、10.14には期待しているんですよ本当に(文句もいっぱい言ってるけど)。
AppleScript名:tccKitでBundle IDで指定したアプリケーションのtcc状況を取得.scpt |
— – Created by: Takaaki Naganoya – Created on: 2018/11/19 — – Copyright © 2018 Piyomaru Software, All Rights Reserved — use AppleScript version "2.7" — Mojave (10.14) or later use framework "Foundation" use framework "tccKit" –https://halmueller.wordpress.com/2018/09/04/privacy-consent-in-mojave-part-2-applescript/ use scripting additions set tccCheker to current application’s tccCheck’s alloc()’s init() set aBundle to "com.apple.iWork.Keynote" set aRes to (tccCheker’s automationConsentForBundleIdentifier:aBundle promptIfNeeded:false) as string log aRes –> "PrivacyConsentStateGranted" set bBundle to "com.coteditor.CotEditor" set bRes to (tccCheker’s automationConsentForBundleIdentifier:bBundle promptIfNeeded:false) as string log bRes –> "PrivacyConsentStateUnknown" set cBundle to "com.apple.mail" set cRes to (tccCheker’s automationConsentForBundleIdentifier:cBundle promptIfNeeded:false) as string log cRes –> "PrivacyConsentStateUnknown" |
macOS 10.14 AppleScriptリリースノート – AppleScriptの穴 says:
[…] → その後、Hal Mueller氏によるサンプルコードを用いたtccKit.frameworkを介して、指定Bundle IDの「オートメーション」認証状況を取得… […]
ぴよまるソフトウェアが選ぶ、2018年に書いた「価値あるScript」 – AppleScriptの穴 says:
[…] ・tccKitで指定Bundle IDのアプリケーションの「オートメーション」認証状況を取得 macOS 10.14で大幅に変わった環境ですが、それに対処するためのノウハウも蓄積しつつあります。その中で […]
Xcode 10.1+macOS MojaveでGUIアプリケーションを作成 – AppleScriptの穴 says:
[…] 行し、ユーザーによってきちんと認証されれば、tccKitを用いて認証状況を確認できます。 […]