Consentire all'applicazione di controllare il computer (dispositivi di assistenza) su Mavericks tramite terminale?


10

Attualmente sto lavorando all'installazione automatica di Mavericks 10.9. Ho installato NetBoot. Tutto funziona bene fino a quando non voglio eseguire Applescript. Dal rilascio della nuova versione ho bisogno di abilitare manualmente quegli script. Esiste un comando che posso usare nello script della shell per aggiungere un'app all'elenco dei dispositivi assistivi? O forse c'è qualche plist che deve essere modificato per farlo funzionare?


Non sono del tutto sicuro che questo sia ciò che stai vedendo, ma questo articolo potrebbe aiutarti: support.apple.com/kb/HT5914
Jay Thompson,

Grazie per la risposta. Mi sono anche imbattuto in questo articolo mentre cercavo una soluzione. Non è quello che sto cercando poiché questa soluzione utilizza ancora l'interazione con la GUI.
KarolBerlinski,

@KarolBerlinski Qual è stata la soluzione alternativa che hai usato? Sto ancora cercando di capire come aggiungere un'app ai dispositivi di assistenza tramite la riga di comando o un metodo non GUI. Grazie Abraham
AbsterT

Risposte:


12

Le impostazioni sono memorizzate in /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|

Lo schema, come indicato da 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));

Sulla mia installazione degli ultimi quattro colonne ( client_type, allowed, prompt_counte csreq) sono 0|1|0|\xfa\xde\x0cper le applicazioni che sono stati aggiunti dopo la "example.app" would like to control this computer using accessibility featuresfinestra di dialogo è stato mostrato e 0|1|1|per le applicazioni che ho aggiunto facendole cadere alla lista in Preferenze di Sistema.

~/Library/Preferences/com.apple.universalaccessAuthWarning.plist contiene un elenco di applicazioni per le quali è stata mostrata la finestra di avviso:

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

Non sono riuscito a capire come consentire effettivamente l'accesso ai dispositivi di assistenza per un'applicazione. Ho provato ad esempio a eseguire questi comandi:

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

Ho anche provato a riavviare per applicare le modifiche e impostare le ultime quattro colonne su 0,1,1,"".


2
Grazie mille per il tuo feedback. Sono stato in grado di risolvere il problema grazie ad esso. Il processo tccd non può essere ucciso, solo il riavvio sarà sufficiente qui. Avvio l'app che necessita di Accessibilità, quindi uso sudo sqlite3 / Library / Application \ Support / com.apple.TCC / TCC.db 'set di accesso consentito = 1' e quindi riavvio del sistema. Funziona. Grazie ancora (se hai bisogno dell'accesso per un'app dalla lista puoi aggiungere la clausola WHERE al tuo sql).
KarolBerlinski,

+1 per ottimi scherzi. Vedi la risposta di AbsterT per un programmatico funzionante basato su sudo sqlite3 .... ~/Library/Preferences/com.apple.universalaccessAuthWarning.plistnon è coinvolto nella concessione di autorizzazioni, registra solo se è stato mostrato un avviso per evitare fastidiosi utenti con avvisi ripetuti.
mklement0,

2
Il valore ??( \xfa\xde\x0c) deriva dalla csreqcolonna, che contiene una sorta di impronta digitale dell'app specificata; OSX lo gestisce automaticamente dietro le quinte: non è necessario specificarlo mai. Il valore reale è molto più lungo; il troncamento a 3 byte proviene dal tentativo di emettere il valore binario (tipo di dati BLOB) come se fosse una stringa, causando l'arresto dell'uscita al primo byte NUL (lo ?stelo da \xfae \xdenon essendo caratteri validi nella codifica UTF8, \x0cè verticale scheda che crea effettivamente un'interruzione di riga).
mklement0,

La csreqcolonna contiene i requisiti designati compilati per l'app, vedere goo.gl/z10vl e la guida alla profondità della registrazione del codice TN2206 di Apple . I requisiti designati sono essenzialmente uno script che convalida l'identità di un'app controllando l'ID del pacchetto e i certificati.
zoul

1
Questa tecnica sembra essere utilizzata da Dropbox per aggiungere diritti all'accessibilità
pkamb

8

È inoltre possibile aggiungere il file seguendo i comandi seguenti.

Questo comando troverà l'identificatore del bundle per l'applicazione che si sta tentando di aggiungere ai dispositivi di assistenza.

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

Supponiamo che l'applicazione che stavi cercando di aggiungere fosse SKYPE. Inserire quindi questo sotto:

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

E il tuo identificativo del bundle sarebbe:

com.skype.skype

Quindi utilizzare questo output nel comando seguente:

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

Per Skype sembrerebbe così:

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

Per rimuovere l'applicazione è necessario utilizzare il sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "delete from access where client='com.skype.skype';"


+1, ma per robustezza è meglio usare REPLACE INTOinvece INSERT INTOche per garantire che il comando funzioni anche se il database ha già una voce per l'applicazione specificata.
mklement0,

@mklement Aggiungerebbe l'applicazione se l'applicazione non esistesse già nel database?
AbsterT

Sì, sarebbe ( REPLACE INTOè un alias per il più descrittivo INSERT OR REPLACE INTO).
mklement0

1
REPLACE INTO funziona perfettamente e meglio di INSERT INTO.
AbsterT

Questo metodo funziona con file binari eseguibili che si trovano all'interno di un pacchetto .prefpane?
jasonology
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.