pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


macOSでZoomやSkypeを使おうとしたらカメラへのアクセス許可ができない状態になっていたので、強制的になんとかする

macOSではアプリケーションがカメラやマイクなどのデバイスにアクセスする際に、明示的にアクセス許可を与えることを必要としています。

この設定は「システム環境設定」の「セキュリティとプライバシー」から設定できます。 f:id:pslabo:20200610202505p:plain

たとえばカメラへのアクセスを行おうとしたアプリ一覧が表示されており、チェックされている項目はアクセスを許可したアプリです。 f:id:pslabo:20200610202343p:plain

しかし、あるときから、アプリ側がカメラアクセスを求めても、このリストに追加されなくなりました。本来ならば、このスクリーンショットで示すように、カメラアクセスが必要なアプリがこのように表示されていて、ここで権限をコントロールできます。しかしここに対象にアプリが表示されない限り権限を割り当てることができません。

本質的には、発生している問題を適切に修正して、システム環境設定のアプリから権限をコントロールできる状態に戻すべきですが、なにをどうしたら元どおりになるのか分かりません。

しかし、権限を管理する設定ファイルに関する情報はいくつかのページに書かれていましたので、これを参考にファイルを編集し、Webミーティングで必要なカメラアクセス、マイクアクセスを行えるようにしようと思います。

とりあえずZoomとSkypeのマイクアクセスとカメラアクセスを許可する。

これらの設定は ~/Library/Application\ Support/com.apple.TCC/TCC.db で管理されており、このファイルは sqlite3 形式のデータベースです。

したがって、このデータベースにSkypeやZoomのマイクアクセスやカメラアクセス情報を追加すればよいわけです。

sqlite3 でデータファイルを開く

sqlite3 でいきなりひらくことはできません。このファイルはSIP (System Integrity Protection) で保護されているため、編集するにはSIPを無効化する必要があります。

SIPについては Appleの開発者向けサイトのConfiguring System Integrity Protectionというページで説明されています。

SIPを無効化したら sqlite3 を次のように実行すると、対話的にSQLを入力可能なモードになります。

$ sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db

抜けるときは ctrl + D で抜けられます。実際に書き換えを行う前に TCC.db のバックアップをとっておき、問題があれば元にもどせるようにしておいたほうがよいと思います。

Skype や Zoom のカメラアクセス、マイクアクセスを許可する設定を追加する

Zoomの設定は下記2行のSQLを実行してください。

INSERT INTO access VALUES('kTCCServiceCamera','us.zoom.xos',0,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);
INSERT INTO access VALUES('kTCCServiceMicrophone','us.zoom.xos',0,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);

Skypeの設定はこちらです。

INSERT INTO access VALUES('kTCCServiceCamera','com.skype.skype',0,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);
INSERT INTO access VALUES('kTCCServiceMicrophone','com.skype.skype',0,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);

他のアプリでカメラアクセスやマイクアクセスを許可する

Zoom や SkypeSQL には、それぞれ us.zoom.xos や com.skype.skype というアプリ固有の識別子を指定していますが、これを対象アプリの識別子に置き換えてください。

この識別子はアプリ内のInfo.plistファイルに含まれる CFBundleIdentifier で確認できます。この情報は mdls コマンドで抽出できます。以下は LICEcap アプリのCFBundleIdentifierを取得する例です。

$ mdls -name kMDItemCFBundleIdentifier /Applications/LICEcap.app/ 
kMDItemCFBundleIdentifier = "com.cockos.LICEcap"

Zoomの場合は /Applications/zoom.us.app/ にインストールされており、次のように確認できます。

$ mdls -name kMDItemCFBundleIdentifier /Applications/zoom.us.app
kMDItemCFBundleIdentifier = "us.zoom.xos"

他のパーミッションを許可したい場合は?

こちらの記事とか見ていただくと、他のサービス名を調べられると思います。

qiita.com

ただし、サービスによっては、OS全体のTTC.dbに設定を追加する必要があります。

例えば、画面収録の権限はkTCCServiceScreenCapture で設定できますが、これは /Library/Application Support/com.apple.TCC/TCC.db に設定します。

これには管理者権限が必要なので、sudo 経由で sqlie3 を次のように実行します。

sudo sqlite3 "/Library/Application Support/com.apple.TCC/TCC.db"

以下の SQL は、Chrome , Skype, Zoom, DuetDisplay で画面録画を許可する設定です。これにより画面共有が行えるはずです。

INSERT INTO access VALUES('kTCCServiceScreenCapture','com.google.Chrome',0,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);
INSERT INTO access VALUES('kTCCServiceScreenCapture','us.zoom.xos',0,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);
INSERT INTO access VALUES('kTCCServiceScreenCapture','com.skype.skype',0,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);
INSERT INTO access VALUES('kTCCServiceScreenCapture','com.kairos.duetMac',0,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);
INSERT INTO access VALUES('kTCCServiceScreenCapture','com.cockos.LICEcap',0,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);