Accessive Access lorsque le script est lancé par l'agent

4

Problème

Applescript exécuté par osascript n'est pas autorisé. Assistive Access lorsqu'il est lancé par l'agent ( ~/Library/LaunchAgents ). Bien que cela fonctionne lorsqu'il est exécuté à partir de l'éditeur Applescript ou en ligne de commande directement (avec osascript).

Situation

Applescript effectue plusieurs tâches d'interface graphique pour l'impression par lots et est exécuté deux fois par jour. Par conséquent, il doit être autorisé à accéder aux appareils d'assistance et est lancé par un agent.

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

  • Applescript Editor
  • ligne de commande osascript (non sudo)

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

/location/of/my.scpt: execution error: System Events got an error: osascript does not have access to assistive devices. (-25211)

(Message traduit du néerlandais par moi.)

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

En outre, basé sur celles-ci deux messages j'ai édité le /Library/Application\ Support/com.apple.TCC/TCC.db La base de données SQLite et quand je vérifie la table 'accès', elle montre:

$ 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 constater, l'accès javascript est autorisé et j'ai également ajouté le fichier .plist de mon agent.

Cause possible?

La seule chose à laquelle je puisse 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 que, par conséquent, différents dispositifs d'assistance sont autorisés? Cela semble toutefois peu probable, car le fichier TCC.db ne semble pas être spécifique à l'utilisateur et l'agent se trouve dans ~/Library/LaunchAgents.

Aide, quelqu'un?

Martin
la source

Réponses:

3

Une solution simple consiste à enregistrer le script en tant que fichier texte.

En haut du script, ajoutez le osascript case

#!/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

Le dans la boîte de dialogue de sauvegarde choisissez Texte comme format de fichier. Le fichier sera enregistré en texte brut mais avec le .applescript extension.

Dans le terminal, exécutez le fichier texte du script de sauvegarde.

J'ai utilisé:

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

Dans les arguments de commande du LaunchAgent, ajoutez simplement le chemin du fichier.

Ne pas ajouter la commande osascript aux arguments. Tu n'en a pas besoin.

Le fichier texte de script enregistré agira comme un script shell exécutable.

Lorsque vous chargez ou exécutez les LaunchAgents pour la première fois, vous recevrez une invite pour définir l'Assistant d'accès dans les Préférences Système. Si les préférences système sont déjà ouvertes, vous ne le ferez pas, mais le fichier texte de script sera ajouté à la liste.

Il vous suffit maintenant de cocher sa case pour l'autoriser.

Je rechargerais le LaunchAgent afin qu’il soit immédiatement récupéré.

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

markhunte
la source
Merci! Je vais essayer ça à la maison ce soir et l'accepter quand ça marche. Toute idée quant à pourquoi ma méthode ne fonctionne pas? Je suis curieux.
Martin
Je me suis amusé avec cela et j'ai une autre erreur dont je ne peux pas me débarrasser. Applescript ouvre un fichier dans une autre application (P-touch Editor v5.1, pour être exact). Cela me donne cette erreur: /path/to/script.applescript:1226:1292: execution error: LSOpenURLsWithRole() failed with error -10810 for the file /path/to/templatefile.lbx. (1). Les bits d'exécution ont été définis sur les fichiers .applescript et .lbx. Je suppose que cela a quelque chose à voir avec le changement de la description de la pomme en texte?
Martin
Je viens d'avoir execution error: System Events got an error: osascript is not allowed assistive access. (-1719) dans mon fichier journal et ne pas être invité par les préférences système dans 10.12.6
swrobel
2

Bien que j'aie accepté la question de @ markhunte parce que cela fonctionne dans le cas général, cela n'a pas fonctionné pour moi. C'est pourquoi je publie ma propre solution comme alternative.

Créer un script shell qui lance l'applescript

Lorsque le launchagent exécute un script shell qui appelle simplement le script pomme (.scpt), il doit être autorisé une fois à accéder aux périphériques d'assistance.

Dans mon cas, je me suis retrouvé avec le suivant LaunchAgent .plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.mylabel.some-awesome-utility</string>
    <key>Program</key>
    <string>/Users/username/absolute/path/to/shellscript.sh</string>
    <key>StandardErrorPath</key>
    <string>/tmp/com.mylabel.some-awesome-utility.err</string>
    <key>StandardOutPath</key>
    <string>/tmp/com.mylabel.some-awesome-utility.out</string>
    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Hour</key>
            <integer>06</integer>
            <key>Minute</key>
            <integer>05</integer>
        </dict>
        <dict>
            <key>Hour</key>
            <integer>20</integer>
            <key>Minute</key>
            <integer>05</integer>
        </dict>
    </array>
</dict>
</plist>

Ce LaunchAgent appellera le shellscript.sh deux fois par jour comme spécifié par le StartCalendarInterval clé. Notez également le StandardErrorPath et StandardOutPath clés 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 constater, une simple ligne shebang spécifie qu’il s’agit bien d’un script de shell suivi d’un appel unique à l’applecript que j’appelais directement à partir du LaunchAgent.

Martin
la source
salut! J'essaie de faire quelque chose de similaire - bien que je veuille exécuter un script python qui appelle AppleScript pour effectuer des tâches spécifiques à Apple. Vous mentionnez - "le shellscript doit être autorisé à accéder aux dispositifs d'assistance". Comment avez-vous donné un accès d'assistance à un script shell - cette interface semble ne permettre que l'ajout de fichiers .app. Merci!
jim70
@ jim70 Au moins dans macOS 10.14, rien de spécial à faire dans le script. Lorsqu'il s'exécute pour la première fois, le système d'exploitation invite l'utilisateur à accorder un accès d'assistance au script. S'il est accepté, il l'achemine vers le panneau approprié de la préférence Système. Le script sera automatiquement ajouté à la liste mais non activé. Il appartient ensuite à l'utilisateur de basculer manuellement l'accès au script.
wst