我目前正在从事Mavericks 10.9的自动安装。我已经设置了NetBoot。一切正常,直到我要执行Applescript。自从发布新版本以来,我需要手动启用这些脚本。我可以在外壳程序脚本中使用命令将应用程序添加到“辅助设备”列表中吗?也许有些plist必须进行编辑才能起作用?
我目前正在从事Mavericks 10.9的自动安装。我已经设置了NetBoot。一切正常,直到我要执行Applescript。自从发布新版本以来,我需要手动启用这些脚本。我可以在外壳程序脚本中使用命令将应用程序添加到“辅助设备”列表中吗?也许有些plist必须进行编辑才能起作用?
Answers:
设置存储在/Library/Application Support/com.apple.TCC/TCC.db
:
$ sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db 'select * from access'
kTCCServiceAccessibility|com.apple.ScriptEditor2|0|1|0|��
kTCCServiceAccessibility|com.red-sweater.FastScripts|0|1|0|��
kTCCServiceAccessibility|com.apple.AccessibilityInspector|0|1|0|��
kTCCServiceAccessibility|com.slate.Slate|0|1|0|��
kTCCServiceAccessibility|com.apple.Automator|0|1|1|
kTCCServiceAccessibility|com.googlecode.iterm2|0|1|1|
给出的模式sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db '.schema access'
为:
CREATE TABLE access (service TEXT NOT NULL, client TEXT NOT NULL, client_type INTEGER NOT NULL, allowed INTEGER NOT NULL, prompt_count INTEGER NOT NULL, csreq BLOB, CONSTRAINT key PRIMARY KEY (service, client, client_type));
在我安装的最后四列(client_type
,allowed
,prompt_count
和csreq
)是0|1|0|\xfa\xde\x0c
对已添加的应用程序后,"example.app" would like to control this computer using accessibility features
结果显示对话框,并0|1|1|
为应用程序,我将它们拖放到系统偏好设置添加到列表中。
~/Library/Preferences/com.apple.universalaccessAuthWarning.plist
包含已显示警告对话框的应用程序列表:
$ defaults read com.apple.universalaccessAuthWarning
{
"/Applications/Automator.app" = 1;
"/Applications/Automator.app/Contents/MacOS/Automator" = 1;
"/Applications/FastScripts.app" = 1;
"/Applications/FastScripts.app/Contents/MacOS/FastScripts" = 1;
"/Applications/Slate.app" = 1;
"/Applications/Slate.app/Contents/MacOS/Slate" = 1;
"/Applications/Utilities/AppleScript Editor.app" = 1;
"/Applications/Utilities/AppleScript Editor.app/Contents/MacOS/AppleScript Editor" = 1;
"/Applications/Xcode.app/Contents/Applications/Accessibility Inspector.app" = 1;
"/Applications/Xcode.app/Contents/Applications/Accessibility Inspector.app/Contents/MacOS/Accessibility Inspector" = 1;
"/Applications/iTerm.app" = 1;
"/Applications/iTerm.app/Contents/MacOS/iTerm" = 1;
"/Users/lauri/Desktop/aa.app" = 1;
"/Users/lauri/Desktop/aa.app/Contents/MacOS/applet" = 1;
"com.apple.AccessibilityInspector" = 1;
"com.apple.Automator" = 1;
"com.apple.ScriptEditor.id.aa" = 1;
"com.apple.ScriptEditor2" = 1;
"com.red-sweater.FastScripts" = 1;
"com.slate.Slate" = 1;
}
不过,我无法弄清楚如何实际允许访问应用程序的辅助设备。我尝试例如运行以下命令:
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db 'insert into access values ("kTCCServiceAccessibility","com.apple.ScriptEditor.id.qq",0,1,0,"'$'\xfa\xde\x0c''");'
defaults write com.apple.universalaccessAuthWarning com.apple.ScriptEditor.id.qq -bool true
defaults write com.apple.universalaccessAuthWarning /Users/lauri/Desktop/qq.app -bool true
defaults write com.apple.universalaccessAuthWarning /Users/lauri/Desktop/qq.app/Contents/MacOS/applet -bool true
sudo killall tccd
我还尝试重新启动以应用更改并将最后四列设置为0,1,1,""
。
sudo sqlite3 ...
。~/Library/Preferences/com.apple.universalaccessAuthWarning.plist
并不涉及授予权限,它仅记录是否显示了警告,以避免使用户受到重复警告的困扰。
??
(\xfa\xde\x0c
)值从茎csreq
柱,其含有对指定的应用程序中的指纹; OSX在后台自动进行管理-无需指定它。实际值要长得多;截断为3个字节的原因是试图将二进制值(数据类型BLOB
)当作字符串来输出,导致输出在第一个NUL字节处停止(以UTF8编码?
的\xfa
且\xde
不是有效字符为源,\x0c
是垂直的)标签有效地创建了一个换行符)。
csreq
列包含应用程序的已编译指定要求,请参阅goo.gl/z10vl和Apple的TN2206 深度签名代码指南。指定的要求本质上是一个脚本,该脚本通过检查分发包ID和证书来验证应用程序的身份。
您也可以按照以下命令添加文件。
此命令将找到您要添加到辅助设备的应用程序的捆绑包标识符。
/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' /Applications/enterapplicaitonnamehere.app/Contents/Info.plist
假设您要添加的应用程序是SKYPE。然后,您可以在下面输入:
/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' /Applications/Skype.app/Contents/Info.plist
您的捆绑包标识符为:
com.skype.skype
然后,您可以在以下命令中使用此输出:
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "REPLACE INTO access VALUES('kTCCServiceAccessibility','',0,1,1,NULL);"
对于Skype,它看起来像这样:
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "REPLACE INTO access VALUES('kTCCServiceAccessibility','com.skype.skype',0,1,1,NULL);"
要删除该应用程序,您可以使用 sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "delete from access where client='com.skype.skype';"
REPLACE INTO
而不是INSERT INTO
来确保即使数据库已经具有指定应用程序的条目,该命令也可以使用。
REPLACE INTO
是更具描述性的别名INSERT OR REPLACE INTO
)。