В настоящее время я работаю над автоматической установкой Mavericks 10.9. У меня настроен NetBoot. Все работает нормально, пока я не захочу выполнить Applescript. С момента выпуска новой версии мне нужно вручную включить эти скрипты. Есть ли команда, которую я могу использовать в сценарии оболочки, чтобы добавить приложение в список вспомогательных устройств? Или, может быть, есть какой-то plist, который нужно отредактировать, чтобы он работал?
Настройки хранятся в /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 ( ?
основа из \xfa
и \xde
не является допустимыми символами в кодировке UTF8, \x0c
является вертикальным вкладку, которая эффективно создает разрыв строки).csreq
содержит скомпилированные определенные требования для приложения, см. goo.gl/z10vl и подробное руководство Apple по подписи кода TN2206 . Обозначенные требования — это, по сути, сценарий, который проверяет подлинность приложения, проверяя идентификатор пакета и сертификаты.Вы также можете добавить файл, выполнив приведенные ниже команды.
Эта команда найдет идентификатор пакета для приложения, которое вы пытаетесь добавить на вспомогательные устройства.
/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);"
Для скайпа это будет выглядеть так:
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
).
Джей Томпсон
КарольБерлински
АбстерТ