Zulassen, dass die Anwendung den Computer (Hilfsgeräte) auf Mavericks über das Terminal steuert?

10

Ich arbeite derzeit an der automatisierten Installation von Mavericks 10.9. Ich habe NetBoot eingerichtet. Alles funktioniert in Ordnung, bis ich Applescript ausführen möchte. Seit der Veröffentlichung der neuen Version muss ich diese Skripte manuell aktivieren. Gibt es einen Befehl, mit dem ich im Shell-Skript eine App zur Liste der Hilfsgeräte hinzufügen kann? Oder gibt es vielleicht eine Liste, die bearbeitet werden muss, damit sie funktioniert?

KarolBerlinski
quelle
Ich bin nicht ganz sicher, ob dies das ist, was Sie sehen, aber dieser Artikel könnte helfen: support.apple.com/kb/HT5914
Jay Thompson
Danke für Ihre Antwort. Ich bin auch auf diesen Artikel gestoßen, als ich nach einer Lösung gesucht habe. Es ist nicht das, wonach ich suche, da diese Lösung immer noch die GUI-Interaktion verwendet.
KarolBerlinski
@KarolBerlinski Was war die Problemumgehung, die Sie verwendet haben? Ich versuche immer noch herauszufinden, wie eine App über die Befehlszeile oder eine Nicht-GUI-Methode zu den Hilfsgeräten hinzugefügt werden kann. Danke Abraham
AbsterT

Antworten:

12

Die Einstellungen sind gespeichert 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|

Das von gegebene Schema sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db '.schema access'lautet:

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

Bei meiner Installation ist die letzten vier Spalten ( client_type, allowed, prompt_countund csreq) ist 0|1|0|\xfa\xde\x0cfür Anwendungen , die hinzugefügt wurden , nachdem das "example.app" would like to control this computer using accessibility featureswurde Dialog gezeigt und 0|1|1|für Anwendungen , die ich durch Fallenlassen in die Liste in den Systemeinstellungen hinzugefügt.

~/Library/Preferences/com.apple.universalaccessAuthWarning.plist enthält eine Liste von Anwendungen, für die der Warndialog angezeigt wurde:

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

Ich konnte jedoch nicht herausfinden, wie der Zugriff auf Hilfsgeräte für eine Anwendung tatsächlich zugelassen werden kann. Ich habe zum Beispiel versucht, diese Befehle auszuführen:

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

Ich habe auch versucht, neu zu starten, um die Änderungen zu übernehmen und die letzten vier Spalten auf zu setzen 0,1,1,"".

Lri
quelle
2
Vielen Dank für Ihr Feedback. Dank dessen konnte ich eine Problemumgehung durchführen. Der tccd-Prozess kann nicht abgebrochen werden, hier reicht nur ein Neustart aus. Ich starte die App, die Eingabehilfen benötigt, verwende dann sudo sqlite3 / Library / Application \ Support / com.apple.TCC / TCC.db 'Update Access Set erlaubt = 1' und starte das System neu. Es klappt. Nochmals vielen Dank (Wenn Sie Zugriff für eine App aus der Liste benötigen, können Sie die WHERE-Klausel zu Ihrer SQL hinzufügen).
KarolBerlinski
+1 für großartiges Schlafen. Siehe AbsterTs Antwort für ein funktionierendes Programm basierend auf sudo sqlite3 .... ~/Library/Preferences/com.apple.universalaccessAuthWarning.plistist nicht an der Erteilung von Berechtigungen beteiligt, sondern zeichnet nur auf, ob eine Warnung angezeigt wurde, um zu vermeiden, dass Benutzer mit wiederholten Warnungen belästigt werden.
mklement0
2
Der Wert ??( \xfa\xde\x0c) stammt aus der csreqSpalte, die einen Fingerabdruck der angegebenen App enthält. OSX verwaltet dies automatisch hinter den Kulissen - Sie müssen es nie angeben. Der tatsächliche Wert ist viel länger; Die Kürzung auf 3 Bytes ergibt sich aus dem Versuch, den Binärwert (Datentyp BLOB) so auszugeben, als wäre es eine Zeichenfolge, wodurch die Ausgabe beim ersten NUL-Byte stoppt (der ?Stamm aus den \xfaund \xdenicht gültigen Zeichen in der UTF8-Codierung \x0cist vertikal) Registerkarte, die effektiv einen Zeilenumbruch erzeugt).
mklement0
Die csreqSpalte enthält die kompilierten festgelegten Anforderungen für die App, siehe goo.gl/z10vl und Apples TN2206 Code Signing in Depth- Handbuch. Die festgelegten Anforderungen sind im Wesentlichen ein Skript, das die Identität einer App durch Überprüfen der Bundle-ID und der Zertifikate überprüft.
Zoul
1
Diese Technik scheint von Dropbox verwendet zu werden, um Barrierefreiheitsberechtigungen ohne Beteiligung des Benutzers hinzuzufügen: applehelpwriter.com/2016/08/29/…
pkamb
8

Sie können die Datei auch hinzufügen, indem Sie die folgenden Befehle ausführen.

Dieser Befehl findet die Bundle-ID für die Anwendung, die Sie zu Assistive Devices hinzufügen möchten.

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

Angenommen, die Anwendung, die Sie hinzufügen wollten, war SKYPE. Sie würden dies dann unten eingeben:

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

Und Ihre Bundle-ID wäre:

com.skype.skype

Sie verwenden diese Ausgabe dann im folgenden Befehl:

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

Für Skype würde es so aussehen:

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

Um die Anwendung zu entfernen, verwenden Sie die sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "delete from access where client='com.skype.skype';"

AbsterT
quelle
1, aber für Robustheit ist es besser , zu verwenden , REPLACE INTOstatt , INSERT INTOum zu gewährleisten , dass der Befehl funktioniert auch , wenn die Datenbank bereits einen Eintrag für die angegebene Anwendung hat.
mklement0
@mklement Würde das die Anwendung hinzufügen, wenn die Anwendung nicht bereits in der Datenbank vorhanden wäre?
AbsterT
Ja, das wäre es ( REPLACE INTOist ein Alias ​​für die aussagekräftigeren INSERT OR REPLACE INTO).
mklement0
1
Das REPLACE INTO funktioniert perfekt und besser als das INSERT INTO.
AbsterT
Funktioniert diese Methode für ausführbare Binärdateien, die sich in einem .prefpane-Bundle befinden?
Jasonologie