Acceso de asistencia cuando el agente inicia el script

Problema

Applescript ejecutado por osascript no tiene permitido el acceso de asistencia cuando lo ejecuta un agente ( ~/Library/LaunchAgents). Aunque funciona cuando se ejecuta desde el editor de Applescript o la línea de comandos directamente (usando osascript).

Situación

El applescript realiza varias tareas de GUI para la impresión por lotes y se ejecuta dos veces al día. Por lo tanto, necesita permiso para acceder a Dispositivos de asistencia y lo inicia un agente.

El script se ejecuta como se esperaba cuando se inicia desde:

  • Editor de secuencias de comandos
  • línea de comandos de osascript (no sudo)

Cuando es lanzado por Agent, devuelve:

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

(Mensaje traducido del holandés por mí.)

Esto me llevó a creer que el problema es con osascript, pero como dije anteriormente, funciona bien cuando se ingresa directamente desde la línea de comandos usando: osascript /location/of/my.scpt.

Además, en base a estas dos publicaciones, edité la /Library/Application\ Support/com.apple.TCC/TCC.dbbase de datos SQLite y cuando reviso la tabla de 'acceso', muestra:

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

Como puede ver, se permite el acceso a osascript y también agregué el .plist de mi agente por si acaso.

¿Causa posible?

Lo único que se me ocurre es que, por alguna razón, el script lo ejecuta un 'usuario diferente' cuando lo inicia un Agente y, por lo tanto, tiene diferentes dispositivos de asistencia permitidos. Sin embargo, parece poco probable, ya que TCC.db no parece ser específico del usuario y el agente se encuentra en ~/Library/LaunchAgents.

¿Ayuda, alguien?

Respuestas (2)

Una solución simple es guardar el script como un archivo de texto.

En la parte superior del guión, agregue el osascriptshebang

#!/usr/bin/osascript

ejemplo:

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

En el cuadro de diálogo Guardar, elija Texto como formato de archivo. El archivo se guardará como texto sin formato pero con la .applescriptextensión.

En la terminal, haga que el archivo de texto del script de guardado sea ejecutable.

Solía:

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

En los argumentos de comando de LaunchAgent simplemente agregue la ruta al archivo.

No agregue el comando osascript a los argumentos. No lo necesitas.

El archivo de texto del script guardado actuará como un script de shell ejecutable.

Cuando cargue o ejecute LaunchAgents por primera vez, recibirá un mensaje para configurar el Acceso de asistencia en las Preferencias del sistema. Si ya tiene abiertas las Preferencias del sistema, no lo hará, pero el archivo de texto Script se agregará a la lista.

Ahora solo tiene que marcar su casilla de verificación para permitirlo.

Volvería a cargar el LaunchAgent para que se active de inmediato.

He verificado esto dos veces con el script anterior y todo funciona como se esperaba.

¡gracias! Probaré esto en casa esta noche y lo aceptaré cuando funcione. ¿Alguna idea de POR QUÉ mi método no funciona? Soy curioso.
He estado jugando con esto y obtuve otro error del que no puedo deshacerme. El applescript abre un archivo en otra aplicación (P-touch Editor v5.1, para ser exactos). Me sale este error: /path/to/script.applescript:1226:1292: execution error: LSOpenURLsWithRole() failed with error -10810 for the file /path/to/templatefile.lbx. (1). Los bits de ejecución se han establecido en los archivos .applescript y .lbx. ¿Supongo que esto tiene algo que ver con cambiar el applescript a texto?
Acabo de entrar execution error: System Events got an error: osascript is not allowed assistive access. (-1719)en mi archivo de registro y no me pregunta Preferencias del sistema en 10.12.6

Si bien he aceptado la pregunta de @markhunte porque funciona en el caso general, no funcionó para mí. Es por eso que publico mi propia solución como alternativa.

Cree un shellscript que inicie el applescript

Al hacer que el agente de ejecución ejecute un script de shell que simplemente llame al script de apple (.scpt), se debe permitir que el script de shell acceda a los dispositivos de asistencia una vez y el agente de ejecución puede ejecutarlo para, a su vez, llamar al script de apple.

En mi caso, terminé con el siguiente 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>

Este LaunchAgent llamará shellscript.shdos veces al día según lo especificado por la StartCalendarIntervalclave. También tenga en cuenta las teclas StandardErrorPathy StandardOutPathque fueron útiles durante la depuración.

El shellscript.sh es extremadamente simple:

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

Como puede ver, una simple línea shebang para especificar que de hecho es un shellscript seguido de una sola llamada al applescript que originalmente había estado llamando directamente desde LaunchAgent.

¡Hola! Estoy tratando de hacer algo similar, aunque quiero ejecutar un script de python que llame a AppleScript para hacer algunas cosas específicas de Apple. Usted menciona: "el shellscript debe poder acceder a los dispositivos de asistencia". ¿Cómo le dio acceso de asistencia a un script de shell? Esa interfaz parece permitir que solo se agreguen archivos .app. ¡Gracias!
@ jim70 Al menos en macOS 10.14, no es necesario hacer nada especial en el script. Cuando se ejecuta por primera vez, el sistema operativo solicitará al usuario que otorgue acceso de asistencia al script y, si lo acepta, lo llevará al panel correspondiente en Preferencias del sistema. El script se agregará automáticamente a la lista, pero no se habilitará. Luego, depende del usuario alternar el acceso del script manualmente.