起因:需要浏览器在线做一些测评,但我的 Chrome 没有摄像头/麦克风权限,并且在设置中是没有手动添加按钮的。
我尝试了重装软件,更新系统(上面的 13.5 就是这么来的,我本来都半年懒得更新系统了),都没有任何用。
系统版本:MacOS 13.5.1(需要开启 sip,可参考 macOS 开启或关闭 SIP - 少数派 (sspai.com))
思路来源:https://blog.csdn.net/cneducation/article/details/111403294 ,但这篇在新版本已经失效了,数据表格式和一些值的含义做了一些修改,所以,我这里提供的语句,也并非一定可以执行。本篇后面讲简单讲述下原理,只要知道了原理,只要存储方式没有大更改,都没问题。
例如:向 Chrome 添加摄像头、麦克风权限
/usr/bin/sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db "INSERT INTO access VALUES('kTCCServiceMicrophone','com.google.Chrome',0,2,2,1,NULL,NULL,NULL,'UNUSED',NULL,0,1637381304);"
/usr/bin/sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db "INSERT INTO access VALUES('kTCCServiceCamera','com.google.Chrome',0,2,2,1,NULL,NULL,NULL,'UNUSED',NULL,0,1637381304);"
想知道原理,就继续往下看吧,下面路径中保存着的 SQLite 数据库文件就是 MacOS 的权限配置信息
~/Library/Application Support/com.apple.TCC/TCC.db
使用 PRAGMA table_info(access)
可以看到表结构,重要的就两个 service(权限名称), client(应用包名)
第一步:确认包名
- 首先要打开访达,点击左侧应用程序,找到要增加权限的 app
- 右键,显示包内容,进入 contents ,找到 info.list
- 定位到这一行
<key>CFBundleIdentifier</key>
,下面的<String>
标签里的内容就是我们要找的包
第二步:确认权限名
kTCCServiceCamera 是摄像头权限,kTCCServiceMicrophone 是麦克风权限,整体可读性还是很高的,我根据设置中的权限推测出下表,有几个不确定
权限服务 | 解释 |
---|---|
kTCCServiceAddressBook | 访问通讯录的权限。 |
kTCCServiceAppleEvents | 发送和接收 Apple 事件的权限。 |
kTCCServiceBluetoothAlways | 永久访问蓝牙设备的权限。 |
kTCCServiceCalendar | 访问日历的权限。 |
kTCCServiceCamera | 访问摄像头的权限。 |
kTCCServiceFileProviderDomain | 访问文件与文件夹权限。 |
kTCCServiceFocusStatus | ? |
kTCCServiceLiverpool | ? |
kTCCServiceMicrophone | 访问麦克风的权限。 |
kTCCServicePhotos | 访问照片库的权限。 |
kTCCServiceReminders | 访问提醒事项的权限。 |
kTCCServiceSystemPolicyDesktopFolder | 访问桌面文件夹的系统策略权限。 |
kTCCServiceSystemPolicyDocumentsFolder | 访问文稿文件夹的系统策略权限。 |
kTCCServiceSystemPolicyDownloadsFolder | 访问下载文件夹的系统策略权限。 |
kTCCServiceSystemPolicyNetworkVolumes | 访问网络卷的系统策略权限。 |
kTCCServiceSystemPolicyRemovableVolumes | 访问可移动卷的系统策略权限。 |
kTCCServiceUbiquity | ? |
有了包名和权限名就能唯一定位一个应用程序和一个权限了,接着,剩下的值找已经有摄像头/麦克风权限的软件抄一抄
SELECT * FROM access where service = 'kTCCServiceMicrophone'
SELECT * FROM access where service = 'kTCCServiceCamera'
于是就有了下列语句,给 chrome 添加摄像头/麦克风权限
INSERT INTO access VALUES('kTCCServiceMicrophone','com.google.Chrome',0,2,2,1,NULL,NULL,NULL,'UNUSED',NULL,0,1637381304);
INSERT INTO access VALUES('kTCCServiceCamera','com.google.Chrome',0,2,2,1,NULL,NULL,NULL,'UNUSED',NULL,0,1637381304);
还有能 run 的 python 代码我放在这了,这个是给 edge 加摄像头权限的,根据需要自行更改
import sqlite3
# 连接到 SQLite 数据库文件
conn = sqlite3.connect(r'/Users/xxx/Library/Application Support/com.apple.TCC/TCC.db') # 替换 'example.db' 为你的数据库文件名
# 创建一个游标对象来执行 SQL 查询
cursor = conn.cursor()
# 执行 SQL 查询
# cursor.execute("""SELECT * FROM access where client = 'com.tencent.meeting' """) # 替换 'your_table_name' 为你的表名
# cursor.execute("""SELECT * FROM access where client = 'com.microsoft.edgemac' """) # 替换 'your_table_name' 为你的表名
# cursor.execute("PRAGMA table_info(access)")
cursor.execute("""INSERT INTO access VALUES('kTCCServiceCamera','com.microsoft.edgemac',0,2,2,1,NULL,NULL,NULL,'UNUSED',NULL,0,1637381304);""")
conn.commit() # 提交事务
# 获取查询结果
result = cursor.fetchall()
# 遍历结果并处理数据
for row in result:
print(row) # 在这里你可以根据需要处理每一行的数据
# 关闭游标和数据库连接
cursor.close()
conn.close()