4 votos

¿Cómo puedo automatizar el pegado de la contraseña en SecurityAgent?

En OS X 10.8.x tenía un servicio de Automator configurado para pegar una contraseña desde el portapapeles en la ventana de contraseña que aparece para montar un disco encriptado.

No quiero guardar la contraseña en mi llavero, y es larga y tediosa de escribir.

Nunca conseguí que el applescript dentro del servicio Automator fuera del todo correcto. Generaba un error, pero aún así hacía el trabajo (es decir, la contraseña se pegaba). Desde la actualización a Yosemite parece que el script en el servicio Automator no funciona en absoluto. El error generado indica que la "ventana 1" no existe.

Esto es lo que tenía:

tell application "System Events" to tell process "SecurityAgent"
set value of text field 1 of window 1 to (the clipboard)
if exists (text field 2 of window 1) then
    set value of text field 2 of window 1 to (the clipboard)
end if
click button 1 of group 1 of window 1
end tell

No recuerdo de dónde saqué esto, pero algo de esto puede venir de aquí

Sé muy poco sobre AppleScript, y agradecería alguna ayuda para afinar (o reescribir completamente) este script para que haga lo siguiente:

  1. Comprueba que hay datos en el portapapeles
  2. Comprueba que la ventana de SecurityAgent está activa (o de alguna manera asegura que se puede interactuar con ella, para evitar generar un error)
  3. Pega el contenido del portapapeles
  4. Pulsa el botón "Desbloquear".

No sé si es posible, pero sería práctico que también trajera a primer plano 1Password y activara "Copiar contraseña" (que es una opción del menú "Elementos"). Sin embargo, puedo hacer que las acciones de Automator realicen esa tarea. Pero sería bueno ver (para aprender) cómo lograr eso con AppleScript.

2voto

Mayank Suman Puntos 11

Este script me ha funcionado:

https://gist.github.com/SuperHofstad/f826985ec536ff2d650699cb37a7fadc

set appPass to "PASSWORD" as text

tell application "System Events"
    delay 0.5
    repeat until exists process "SecurityAgent"
        delay 0.5
    end repeat
    tell process "SecurityAgent"
        keystroke appPass
        key code 36
    end tell
end tell

1voto

inspiredlife Puntos 143

Gracias a las aportaciones de markhunte y tetsujin, he llegado a la siguiente solución. Con todo esto, los requisitos exactos evolucionaron a lo siguiente:

  1. Asegúrese de que un diálogo SecurityAgent está realmente presente para que script no se ejecute de otra manera.
  2. Reposicione el diálogo SecurityAgent porque puede estorbar fácilmente en su posición por defecto.
  3. Mostrar un mensaje que permanecerá en la parte superior de 1Password, pero que no se genera a través de 1password, indicando al usuario que seleccione el elemento correcto en 1Password
  4. Copiar automáticamente la contraseña del elemento actual de 1Password
  5. Retrasa el script lo suficiente para que la contraseña acabe realmente en el portapapeles, antes de que el script intente pegarla.
  6. Pegue el portapapeles en el SecurityAgent y envíelo.

Se me ocurrió la siguiente solución:

set appName to "SecurityAgent"
set passApp to "1Password 5" (* set this to the name of your password manager *)

tell application "System Events"
     if not (exists window 1 of process appName) then -- test if SecurityAgent window exists
         return -- abort if SecurityAgent window does not exist
     end if
 end tell
 tell application "System Events"
    set position of window 1 of process appName to {10, 10} -- move SecurityAgent window out of the way 
 end tell
 tell application passApp
      activate -- bring 1Password to the forefront, run it if not running
 end tell
 tell application "System Events"
    tell application "SystemUIServer"
      set answer to display dialog "Make sure correct 1Password item is actively selected (i.e. click it again if it was previously selected), then click “Continue” to proceed." buttons {"Continue"}
    end tell
    tell process passApp
    (* If you are not using 1Password, you may need to change the menu item clicks, below, to whatever is correct in your particular password manager *)
        click menu item "copy password" of menu "item" of menu bar 1
        delay 1
        set appData to the clipboard
    end tell
    tell application "System Events"
        tell process appName
            set value of text field 1 of window 1 to appData
            if exists (text field 2 of window 1) then
                set value of text field 2 of window 1 to appData
                click button 1 of window 1
            else
                click button 2 of window 1
            end if
         end tell
     end tell
end tell

Hice todo el script condicionado a la presencia de SecurityAgent, porque este script será asignado a un atajo de teclado, y si esa combinación de teclas es seleccionada inadvertidamente por el usuario, prefiero que no sean molestados con un proceso inesperado de script.

Si hay formas en las que podría perfeccionar o mejorar esta solución, por favor, aconséjeme. Estoy muy contento de aprender más sobre AppleScript.

ACTUALIZACIONES FINALES: Tuve que hacer un último cambio. Resultó que los números de los botones para CANCELAR y ACEPTAR cambian de la instancia de SecurityAgent para crear un disco/imagen de disco encriptado, y para cuando se abre un disco/imagen de disco encriptado. Así que tuve que modificar la declaración IF THEN justo al final para manejar cada escenario.

0 votos

La razón por la que tienes el problema de que 1Password no se activa es porque se lo estás diciendo dentro de un bloque de eventos del sistema. Sácalo de ahí y ponlo encima del inicio del bloque tell de eventos del sistema.

0 votos

Creo que acabé haciéndolo así porque me costaba hacer todo el script condicional con la sentencia IF THEN que he utilizado. Por lo que recuerdo, la prueba IF de la ventana del proceso SecurityAgent sólo funcionaba si se producía dentro de un tell application "system events" sección. ¿Hay alguna otra forma de hacer que todo el script sea condicional, sin tener que envolver todo dentro del tell application "system events" ¿Sección? Por ejemplo, ¿existe algo como IF THEN ABORT?

0 votos

Entonces al principio del script podría simplemente probar si la ventana SecurityAgent existe, y si no, entonces terminar el script.

1voto

Malik hassan Puntos 16

Para detener el error que está recibiendo necesita quitar la parte "del grupo" del comando de clic.

(Probado creando un dmg encriptado)

No lo necesita y por eso le da el error.

Los botones son el 1 y el 2.

1 será cancelar . 2 será ok

Por lo tanto, tendrá que cambiar el botón que está llamando también.

    set theData to (the clipboard)

set appName to "SecurityAgent"

tell application "System Events"
    if exists window 1 of process appName then (* only continue if process is running. If it is not it will not have a window *)
        tell process appName

            set value of text field 1 of window 1 to theData
            if exists (text field 2 of window 1) then
                set value of text field 2 of window 1 to theData
            end if
            click button 2 of window 1
     end tell
    end if
end tell

Actualización:

En respuesta a las preguntas del OP en los comentarios y utilizar su fragmento de código esta edición muestra cómo activar

1passowrd y utilizar si no, entonces con un devolver para cancelar el script en caso de que no exista una ventana.

    set appName to "SecurityAgent"
set passApp to "1Password 5" (* set this to the name of your password manager *)
tell application "System Events"
    if not (exists window 1 of process appName) then (* only continue if process is running. If it is not it will not have a window *)

        return (* The return ends the script run here*)

    end if

end tell
activate application passApp
tell application "System Events"
    set position of window 1 of process appName to {10, 10}

    tell application "SystemUIServer"
        set answer to display dialog "Make sure correct 1Password item is actively selected (i.e. click it again if it was previously selected), then click “Continue” to proceed." buttons {"Continue"}
    end tell

    tell application "System Events"
        tell process passApp
            (* If you are not using 1Password, you may need to change the menu item clicks, below, to whatever is correct in your particular password manager *)
            click menu item "copy password" of menu "item" of menu bar 1
            delay 1
            set appData to the clipboard
        end tell
        tell process appName
            set value of text field 1 of window 1 to appData
            if exists (text field 2 of window 1) then
                set value of text field 2 of window 1 to appData
            end if
            click button 2 of window 1
        end tell
    end tell

end tell

0 votos

Gracias. Funciona muy bien. He probado a añadir en script para obtener primero la contraseña, usando tell application "System Events" tell process "1Password 5" click menu item "copy password" of menu "item" of menu bar 1 end tell end tell pero de alguna manera los datos resultantes del portapapeles no se asignan a theData. En cambio, cualquier dato anterior del portapapeles se asigna a theData. Lo que significa que si ejecuto el script por segunda vez, los datos correctos acabarán en theData, pero sólo porque se copiaron en el portapapeles la primera vez. ¿Alguna sugerencia de por qué podría ser?

0 votos

Parece que el problema mencionado con la contraseña que se recoge es porque el script se movía demasiado rápido. He añadido un retraso de 1 segundo, y el problema se ha resuelto. Publicaré el script resultante como una nueva respuesta.

0 votos

Se produce el mismo problema. Quiero utilizar la variable passApp para todas las instancias de "1Password 5". Pero activate application passApp no funciona cuando está dentro del tell application "system events" bloque. Ni idea de por qué no. La solución que he actualizado en mi respuesta a continuación parece hacer el truco.

0voto

Tetsujin Puntos 23061

No tengo nada para probarlo, así que esto es una pura suposición.

Tal vez la aplicación no es frontmost en ese punto, por lo que esto podría ayudar

tell process "SecurityAgent" to activate (*this will bring it to the front if it's already running*)
    --tell application "System Events" (*try with & without this - you'll need to balance up the end tells at the end*)
    set value of text field 1 of window 1 to (the clipboard)
    if exists (text field 2 of window 1) then
        set value of text field 2 of window 1 to (the clipboard)
    end if
    click button 1 of group 1 of window 1
    -- end tell (* uncomment to balance tell blocks if using the above System Events*)

No estoy seguro de si necesitas System Events para hacer esa tarea, o si simplemente podrías dirigir la salida al propio SecurityAgent.

Por cierto, hay bastante siempre datos en el portapapeles, por lo que probar eso no ayudaría realmente - sin anotar la contraseña real en el script [inseguro, por supuesto] no hay manera de que pueda ver para probar si coincide con los datos correctos.

0 votos

No es necesario activar la ventana, ya que le está diciendo al proceso que haga otras cosas además de pulsar las teclas. También necesitará "Eventos del Sistema" para decirle al proceso..

0 votos

Gracias por esto. Tengo un pequeño obstáculo. Me sale el error, - Se esperaba el final de la línea pero se encontró """. - Varias veces me salió el mismo error cuando estaba jugando con el script en el que ya estaba trabajando. Pero no tenía ni idea de por qué salía este error, ya que la sintaxis parecía idéntica a la de otros script que tengo a mano. ¿Alguna idea? En este caso, el error se refiere a la primera instancia de " justo antes de SecurityAgent.

0 votos

Ahh dile a la aplicación, no al proceso

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X