Permitir que o aplicativo controle computador (dispositivos auxiliares) no Mavericks via Terminal?

10

Atualmente, estou trabalhando na instalação automatizada do Mavericks 10.9. Eu tenho o NetBoot configurado. Tudo funciona bem até que eu queira executar o Applescript. Desde o lançamento da nova versão, preciso ativar manualmente esses scripts. Existe um comando que eu possa usar no shell script para adicionar um aplicativo à lista de Dispositivos Assistivos? Ou talvez haja alguma lista que precise ser editada para que funcione?

KarolBerlinski
fonte
Eu não estou totalmente certo de que este é o que você está vendo, mas este artigo podem ajudar: support.apple.com/kb/HT5914
Jay Thompson
Obrigado pela resposta. Eu também me deparei com este artigo enquanto procurava por solução. Não é o que estou procurando, pois esta solução ainda usa a interação da GUI.
KarolBerlinski
@KarolBerlinski Qual foi a solução alternativa usada? Ainda estou tentando descobrir como adicionar um aplicativo aos Dispositivos Assistivos via linha de comando ou um método que não seja da GUI. Obrigado Abraham
AbsterT

Respostas:

12

As configurações são armazenadas em /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|

O esquema, dado por 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));

Na minha instalação, as últimas quatro colunas (client_type , allowed, prompt_counte csreq) são 0|1|0|\xfa\xde\x0cpara aplicações que foram adicionadas após o "example.app" would like to control this computer using accessibility featuresdiálogo foi mostrado e 0|1|1|para aplicações que eu adicionei, largando-os à lista em Preferências do Sistema.

~/Library/Preferences/com.apple.universalaccessAuthWarning.plist contém uma lista de aplicativos para os quais a caixa de diálogo de aviso foi mostrada:

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

Porém, não consegui descobrir como realmente permitir o acesso a dispositivos auxiliares para um aplicativo. Eu tentei, por exemplo, executando estes 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

Também tentei reiniciar para aplicar as alterações e definir as últimas quatro colunas 0,1,1,"".

Lri
fonte
2
Muito obrigado pelo seu feedback. Consegui fazer uma solução alternativa graças a ele. O processo tccd não pode ser eliminado, apenas a reinicialização será suficiente aqui. Inicio o aplicativo que precisa de acessibilidade, uso sudo sqlite3 / Library / Application \ Support / com.apple.TCC / TCC.db 'conjunto de acesso de atualização permitido = 1' e reinicializo o sistema. Funciona. Obrigado novamente (se você precisar acessar um aplicativo da lista, poderá adicionar a cláusula WHERE ao seu sql).
KarolBerlinski
+1 para obter ótimos detalhes. Veja a resposta da AbsterT para uma programação programática baseada em sudo sqlite3 .... ~/Library/Preferences/com.apple.universalaccessAuthWarning.plistnão está envolvido na concessão de permissões, ele registra apenas se um aviso foi mostrado para evitar irritar os usuários com avisos repetidos.
mklement0
2
O valor ??( \xfa\xde\x0c) deriva da csreqcoluna, que contém uma impressão digital dos tipos do aplicativo especificado; O OSX gerencia isso automaticamente nos bastidores - não há necessidade de especificá-lo. O valor real é muito mais longo; o truncamento de 3 bytes vem de tentar transmitir o valor binário (tipo de dados BLOB) como se fosse uma cadeia, fazendo com que a saída de paragem no primeiro byte NUL (a ?haste da \xfae \xdenão sendo válido caracteres em codificação UTF-8, \x0cé um verticais guia que efetivamente cria uma quebra de linha).
mklement0
A csreqcoluna contém os requisitos designados compilados para o aplicativo, consulte goo.gl/z10vl e o guia TN2206 Code Signing in Depth da Apple . Os requisitos designados são essencialmente um script que valida a identidade de um aplicativo, verificando o ID do pacote e os certificados.
zoul 25/03
1
Esta técnica parece ser utilizada por Dropbox para adicionar direitos de acessibilidade sem o envolvimento do usuário: applehelpwriter.com/2016/08/29/...
pkamb
8

Você também pode adicionar o arquivo seguindo os comandos abaixo.

Este comando encontrará o Identificador de pacote para o aplicativo que você está tentando adicionar aos dispositivos de assistência.

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

Digamos que o aplicativo que você estava tentando adicionar fosse SKYPE. Você digitaria isso abaixo:

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

E o seu identificador de pacote seria:

com.skype.skype

Você usa essa saída no comando abaixo:

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

Para o Skype, seria assim:

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

Para remover o aplicativo, você usaria o sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "delete from access where client='com.skype.skype';"

AbsterT
fonte
+1, mas para maior robustez, é melhor usá-lo em REPLACE INTOvez de INSERT INTOgarantir que o comando funcione mesmo se o banco de dados já tiver uma entrada para o aplicativo especificado.
mklement0
@mklement Isso adicionaria o aplicativo se ele ainda não existisse no banco de dados?
precisa
Sim, seria ( REPLACE INTOé um alias para os mais descritivos INSERT OR REPLACE INTO).
mklement0
1
O REPLACE INTO está funcionando perfeitamente e melhor que o INSERT INTO.
AbsterT
Esse método funciona para binários executáveis ​​que estão dentro de um pacote .prefpane?
Jasonology