6 votes

Accès assisté lorsque le script est lancé par l'agent

Problème

Applescript exécuté par osascript n'est pas autorisé à accéder aux dispositifs d'assistance lorsqu'il est lancé par un agent (~/Library/LaunchAgents). Bien qu'il fonctionne lorsqu'il est exécuté à partir de l'éditeur Applescript ou de la ligne de commande directement (en utilisant osascript).

Situation

L'Applescript effectue plusieurs tâches GUI pour l'impression par lots et est exécuté deux fois par jour. Par conséquent, il a besoin d'autorisation pour accéder aux dispositifs d'assistance et est lancé par un agent.

Le script s'exécute comme prévu lorsqu'il est lancé à partir de :

  • l'Éditeur Applescript
  • la ligne de commande osascript (non sudo)

Lorsqu'il est lancé par l'Agent, il renvoie :

/location/of/my.scpt: une erreur d'exécution s'est produite : System Events a généré une erreur : osascript n'a pas accès aux dispositifs d'assistance. (-25211)

(Message traduit du néerlandais par moi-même.)

Cela m'a amené à croire que le problème vient d'osascript, mais comme je l'ai indiqué ci-dessus, il fonctionne correctement lorsqu'il est saisi directement à partir de la ligne de commande en utilisant : osascript /location/of/my.scpt.

Aussi, en me basant sur ces deux articles, j'ai modifié la base de données SQLite /Library/Application\ Support/com.apple.TCC/TCC.db et lorsque je vérifie la table 'access', cela affiche :

$ sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "SELECT * FROM access"
Password:
kTCCServiceAccessibility|com.logitech.gaming|0|1|0|??

kTCCServiceAccessibility|com.valvesoftware.steam|0|1|0|??

kTCCServiceAccessibility|com.blizzard.starcraft2|0|0|1|
kTCCServiceAccessibility|com.apple.AccessibilityInspector|0|1|0|??

kTCCServiceAccessibility|com.apple.ScriptEditor2|0|1|0|??

kTCCServiceAccessibility|com.apple.Terminal|0|1|0|??

kTCCServiceAccessibility|/usr/bin/osascript|1|1|1|
kTCCServiceAccessibility|com.my.label|0|1|1|
kTCCServiceAccessibility|/osascript|1|0|1|

Comme vous pouvez le voir, osascript a l'autorisation d'accès et j'ai également ajouté le .plist de mon agent par précaution.

Cause Possible?

La seule chose à laquelle je peux penser est que, pour une raison quelconque, le script est exécuté par un 'utilisateur différent' lorsqu'il est lancé par un Agent et a donc des dispositifs d'assistance différents autorisés? Cela semble improbable, cependant, car la TCC.db ne semble pas être spécifique à l'utilisateur et l'agent est situé dans ~/Library/LaunchAgents.

Aide, quelqu'un?

6voto

markhunte Points 11634

Une solution simple est de sauvegarder le script en tant que fichier texte.

Au début du script, ajoutez le osascript shebang

#!/usr/bin/osascript

exemple:

#!/usr/bin/osascript
say "hello"
tell application "Safari" to activate
tell application "System Events"

    delay 2
    keystroke "p" using command down
    tell application process "Safari"

        tell application "System Events"
            tell process "Safari"
                click menu button "PDF" of sheet 1 of window 1
                delay 1

                click menu item "Save PDF to Web Receipts Folder" of menu of menu button "PDF" of sheet 1 of window 1
            end tell
        end tell
    end tell

end tell

Dans la boîte de dialogue d'enregistrement, choisissez Texte comme format de fichier. Le fichier sera enregistré en tant que texte brut mais avec l'extension .applescript.

Dans le terminal, rendez le fichier texte du script enregistré exécutable.

J'ai utilisé:

chmod +x /Users/UserName/Scripts/newTest1.applescript

Dans les arguments de la commande du LaunchAgent, ajoutez simplement le chemin d'accès au fichier.

Ne pas ajouter la commande osascript aux arguments. Ce n'est pas nécessaire.

Le fichier texte du script enregistré se comportera comme un script shell exécutable.

Lorsque vous chargez ou exécutez pour la première fois les LaunchAgents, vous obtiendrez une invite pour définir l'Accès aux appareils d'assistance dans les Préférences Système. Si vous avez déjà ouvert les Préférences Système, cette invite ne s'affichera pas mais le fichier texte du script sera ajouté à la liste.

Il vous suffit maintenant de cocher sa case pour le permettre.

Je rechargerais le LaunchAgent pour qu'il prenne effet immédiatement.

J'ai vérifié deux fois avec le script ci-dessus et tout fonctionne comme prévu.

2voto

Martin Points 83

Alors que j'ai accepté la question de @markhunte car elle fonctionne en général, cela n'a pas fonctionné pour moi. C'est pourquoi je poste ma propre solution en tant qu'alternative.

Créez un shellscript qui lance l'applescript

En faisant en sorte que le launchagent exécute un shellscript qui appelle simplement l'applescript (.scpt), le shellscript doit être autorisé à accéder aux dispositifs d'assistance une fois et peut être exécuté par le launchagent pour, à son tour, appeler l'applescript.

Dans mon cas, j'ai fini par avoir le fichier .plist LaunchAgent suivant

    Label
    com.mylabel.some-awesome-utility
    Program
    /Users/username/absolute/path/to/shellscript.sh
    StandardErrorPath
    /tmp/com.mylabel.some-awesome-utility.err
    StandardOutPath
    /tmp/com.mylabel.some-awesome-utility.out
    StartCalendarInterval

            Hour
            06
            Minute
            05

            Hour
            20
            Minute
            05

Ce LaunchAgent appellera le shellscript.sh deux fois par jour comme spécifié par la clé StartCalendarInterval. Notez également les clés StandardErrorPath et StandardOutPath qui ont été utiles lors du débogage.

Le shellscript.sh est extrêmement simple:

#!/bin/sh
osascript /Users/mnmt/Documents/InCuffs/Orders/PrepareShipping/print-shipping-labels.scpt

Comme vous pouvez le voir, une simple ligne shebang pour spécifier qu'il s'agit en effet d'un shellscript suivi d'un seul appel à l'applescript que j'appelais initialement directement depuis le LaunchAgent.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X