¿Permitir que la aplicación controle la computadora (dispositivos de asistencia) en Mavericks a través de la Terminal?

10

Actualmente estoy trabajando en la instalación automatizada de Mavericks 10.9. Tengo configurado NetBoot. Todo funciona bien hasta que quiera ejecutar Applescript. Desde el lanzamiento de la nueva versión, necesito habilitar manualmente esos scripts. ¿Hay algún comando que pueda usar en el script de shell para agregar una aplicación a la lista de dispositivos de asistencia? ¿O tal vez hay algún plist que tiene que ser editado para que funcione?

KarolBerlinski
fuente
No estoy totalmente seguro de que esto es lo que está viendo, pero este artículo podría ayudar: support.apple.com/kb/HT5914
Jay Thompson
Gracias por la respuesta. También me topé con este artículo mientras buscaba una solución. No es lo que estoy buscando, ya que esta solución todavía utiliza la interacción GUI.
KarolBerlinski
@KarolBerlinski ¿Cuál fue la solución que usaste? Todavía estoy tratando de descubrir cómo agregar una aplicación a los dispositivos de asistencia a través de la línea de comandos o un método sin GUI. Gracias Abraham
AbsterT

Respuestas:

12

La configuración se almacena en /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|

El esquema, según lo dado por sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db '.schema access', es:

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));

En mi instalación de las últimas cuatro columnas ( client_type, allowed, prompt_count, y csreq) son 0|1|0|\xfa\xde\x0clas aplicaciones que se agregaron después de la "example.app" would like to control this computer using accessibility featuresse muestra el diálogo y 0|1|1|para aplicaciones que gota a gota a la lista de preferencias del sistema.

~/Library/Preferences/com.apple.universalaccessAuthWarning.plist contiene una lista de aplicaciones para las cuales se ha mostrado el cuadro de diálogo de advertencia:

$ 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;
}    

Sin embargo, no pude encontrar la forma de permitir el acceso a dispositivos de asistencia para una aplicación. Intenté, por ejemplo, ejecutar estos comandos:

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

También intenté reiniciar para aplicar los cambios y configurar las últimas cuatro columnas 0,1,1,"".

Lri
fuente
2
Muchas gracias por sus comentarios. Gracias a ello pude solucionar el problema. El proceso tccd no se puede eliminar, solo reiniciar será suficiente aquí. Inicio la aplicación que necesita accesibilidad, luego uso sudo sqlite3 / Library / Application \ Support / com.apple.TCC / TCC.db 'update access set allow = 1' y luego reinicio el sistema. Funciona. Gracias de nuevo (si necesita acceder a una aplicación de la lista, puede agregar la cláusula WHERE a su sql).
KarolBerlinski
+1 para una gran investigación. Vea la respuesta de AbsterT para una programación programática de trabajo basada en sudo sqlite3 .... ~/Library/Preferences/com.apple.universalaccessAuthWarning.plistno está involucrado en la concesión de permisos, solo registra si se ha mostrado una advertencia para evitar molestar a los usuarios con advertencias repetidas.
mklement0
2
El valor ??( \xfa\xde\x0c) proviene de la csreqcolumna, que contiene una especie de huella digital de la aplicación especificada; OSX lo gestiona automáticamente detrás de escena, sin necesidad de especificarlo. El valor real es mucho más largo; el truncamiento a 3 bytes viene de tratar de dar salida al valor binario (tipo de datos BLOB) como si fuera una cadena, provocando la salida de parada en el primer byte NUL (el ?tallo de la \xfay \xdeno ser caracteres válidos en la codificación UTF8, \x0ces una línea vertical pestaña que efectivamente crea un salto de línea).
mklement0
La csreqcolumna contiene los requisitos designados compilados para la aplicación, consulte goo.gl/z10vl y la guía de profundidad de firma de código TN2206 de Apple . Los requisitos designados son esencialmente un script que valida la identidad de una aplicación al verificar la identificación del paquete y los certificados.
zoul
1
Esta técnica parece ser utilizada por Dropbox para agregar derechos de accesibilidad sin la participación del usuario: applehelpwriter.com/2016/08/29/…
pkamb
8

También puede agregar el archivo siguiendo los comandos a continuación.

Este comando encontrará el Identificador de paquete para la aplicación que está intentando agregar a los Dispositivos de asistencia.

/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' /Applications/enterapplicaitonnamehere.app/Contents/Info.plist

Digamos que la aplicación que intentaba agregar era SKYPE. Luego ingresaría esto a continuación:

/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' /Applications/Skype.app/Contents/Info.plist

Y su identificador de paquete sería:

com.skype.skype

Luego usa esta salida en el siguiente comando:

sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "REPLACE INTO access VALUES('kTCCServiceAccessibility','',0,1,1,NULL);" 

Para Skype se vería así:

sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "REPLACE INTO access VALUES('kTCCServiceAccessibility','com.skype.skype',0,1,1,NULL);" 

Para eliminar la aplicación, usaría el sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "delete from access where client='com.skype.skype';"

AbsterT
fuente
+1, pero por robustez es mejor usarlo en REPLACE INTOlugar de INSERT INTOasegurar que el comando funcione incluso si la base de datos ya tiene una entrada para la aplicación especificada.
mklement0
@mklement ¿Eso agregaría la aplicación si la aplicación no existiera en la base de datos?
AbsterT
Sí, lo haría ( REPLACE INTOes un alias para el más descriptivo INSERT OR REPLACE INTO).
mklement0
1
El REPLACE INTO funciona perfectamente y mejor que el INSERT INTO.
AbsterT
¿Este método funciona para archivos binarios ejecutables que están dentro de un paquete .prefpane?
jasonology