Autoriser l'application à contrôler l'ordinateur (appareils et accessoires fonctionnels) sur Mavericks via le terminal?

10

Je travaille actuellement sur l'installation automatisée de Mavericks 10.9. J'ai configuré NetBoot. Tout fonctionne bien jusqu'à ce que je veuille exécuter Applescript. Depuis la sortie de la nouvelle version, je dois activer manuellement ces scripts. Existe-t-il une commande que je peux utiliser dans le script shell pour ajouter une application à la liste des appareils et accessoires fonctionnels? Ou peut-être y a-t-il une liste à modifier pour que cela fonctionne?

KarolBerlinski
la source
Je ne suis pas totalement sûr que c'est ce que vous voyez, mais cet article pourrait vous aider: support.apple.com/kb/HT5914
Jay Thompson
Merci pour la réponse. J'ai également trébuché sur cet article alors que je cherchais une solution. Ce n'est pas ce que je recherche car cette solution utilise toujours l'interaction GUI.
KarolBerlinski
@KarolBerlinski Quelle solution de contournement avez-vous utilisée? J'essaie toujours de comprendre comment ajouter une application aux appareils et accessoires fonctionnels via la ligne de commande ou une méthode non graphique. Merci Abraham
AbsterT

Réponses:

12

Les paramètres sont stockés dans /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|

Le schéma, tel que donné par sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db '.schema access', est:

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

Sur mon installation , les quatre dernières colonnes ( client_type, allowed, prompt_countet csreq) sont 0|1|0|\xfa\xde\x0cdes applications qui ont été ajoutés après la "example.app" would like to control this computer using accessibility featuresboîte de dialogue a été montré et 0|1|1|pour les applications que j'ai ajouté en les laissant tomber à la liste dans les Préférences Système.

~/Library/Preferences/com.apple.universalaccessAuthWarning.plist contient une liste des applications pour lesquelles la boîte de dialogue d'avertissement a été affichée:

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

Je n'arrivais pas à comprendre comment autoriser l'accès aux appareils et accessoires fonctionnels pour une application. J'ai essayé par exemple d'exécuter ces commandes:

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

J'ai également essayé de redémarrer pour appliquer les modifications et définir les quatre dernières colonnes 0,1,1,"".

Lri
la source
2
Merci beaucoup pour vos commentaires. J'ai pu contourner ce problème grâce à lui. Le processus tccd ne peut pas être tué, seul le redémarrage sera suffisant ici. Je démarre l'application qui a besoin d'accessibilité, puis j'utilise sudo sqlite3 / Library / Application \ Support / com.apple.TCC / TCC.db 'update access set allowed = 1' puis je redémarre le système. Ça marche. Merci encore (Si vous avez besoin d'accéder à une application de la liste, vous pouvez ajouter une clause WHERE à votre sql).
KarolBerlinski
+1 pour une grande détection. Voir la réponse d' AbsterT pour un programme de travail basé sur sudo sqlite3 .... ~/Library/Preferences/com.apple.universalaccessAuthWarning.plistn'est pas impliqué dans l' octroi d' autorisations, il enregistre uniquement si un avertissement a été affiché pour éviter de déranger les utilisateurs avec des avertissements répétés.
mklement0
2
La valeur ??( \xfa\xde\x0c) provient de la csreqcolonne, qui contient une empreinte digitale des sortes de l'application spécifiée; OSX gère cela automatiquement dans les coulisses - pas besoin de le spécifier. La valeur réelle est beaucoup plus longue; la troncature à 3 octets provient de la tentative de sortie de la valeur binaire (type de données BLOB) comme s'il s'agissait d'une chaîne, provoquant l'arrêt de la sortie au premier octet NUL (la ?racine de \xfaet \xden'étant pas des caractères valides dans le codage UTF8, \x0cest une verticale onglet qui crée efficacement un saut de ligne).
mklement0
La csreqcolonne contient les exigences désignées compilées pour l'application, voir goo.gl/z10vl et le guide détaillé de signature de code TN2206 d'Apple . Les exigences désignées sont essentiellement un script qui valide l'identité d'une application en vérifiant l'ID de l'ensemble et les certificats.
2015
1
Cette technique semble être utilisée par Dropbox pour ajouter des droits d'accessibilité sans implication de l'utilisateur: applehelpwriter.com/2016/08/29/…
pkamb
8

Vous pouvez également ajouter le fichier en suivant les commandes ci-dessous.

Cette commande trouvera l'identifiant de bundle pour l'application que vous essayez d'ajouter aux appareils et accessoires fonctionnels.

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

Supposons que l'application que vous essayez d'ajouter était SKYPE. Vous devez ensuite saisir ceci ci-dessous:

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

Et votre identifiant de bundle serait:

com.skype.skype

Vous utilisez ensuite cette sortie dans la commande ci-dessous:

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

Pour Skype, cela ressemblerait à ceci:

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

Pour supprimer l'application, vous utiliseriez le sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "delete from access where client='com.skype.skype';"

AbsterT
la source
+1, mais pour la robustesse, il est préférable d'utiliser REPLACE INTOau lieu de INSERT INTOafin de garantir que la commande fonctionne même si la base de données a déjà une entrée pour l'application spécifiée.
mklement0
@mklement Est-ce que cela ajouterait l'application si l'application n'existait pas déjà dans la base de données?
AbsterT
Oui, ce serait ( REPLACE INTOest un alias pour les plus descriptifs INSERT OR REPLACE INTO).
mklement0
1
Le REPLACE INTO fonctionne parfaitement et mieux que le INSERT INTO.
AbsterT
Cette méthode fonctionne-t-elle pour les binaires exécutables qui se trouvent dans un bundle .prefpane?
jasonologie