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

3

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

No deseo almacenar la contraseña en mi llavero, y es largo y tedioso escribir.

Nunca obtuve el applecript dentro del servicio de Automator del todo bien. Generaría un error, pero aún así se hizo el trabajo (es decir, se pegó la contraseña). Desde la actualización a Yosemite parece que el script en el servicio de Automator no funciona en absoluto. El error generado indica que la "ventana 1" no existe.

Aquí está 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 obtuve esto, pero parte de esto puede haber venido de aquí

Sé muy poco acerca de AppleScript, y agradecería que me ayudara a ajustar (o reescribir completamente) este script para que haga lo siguiente:

  1. Comprueba que haya datos en el portapapeles
  2. Verifica que la ventana de SecurityAgent esté activa (o de alguna manera garantiza que pueda interactuar, para evitar generar un error)
  3. pega el contenido del portapapeles
  4. Haz clic en el botón 'Desbloquear'

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

    
pregunta inspirednz 07.03.2015 - 00:41

3 respuestas

1

Gracias a las aportaciones de markhunte y tetsujin, se me ocurrió la siguiente solución. Con todos los aspectos considerados, los requisitos exactos evolucionaron a lo siguiente:

  1. Asegúrese de que haya un cuadro de diálogo SecurityAgent presente para que la secuencia de comandos no se ejecute de otra manera.
  2. Vuelva a colocar el cuadro de diálogo SecurityAgent porque puede entrar fácilmente en la posición predeterminada.
  3. Muestra un mensaje que se mantendrá en la parte superior de 1Password, pero no se genera a través de 1password, indicando al usuario que seleccione el elemento correcto en 1Password
  4. Copie automáticamente la contraseña para el elemento actual de 1Password
  5. Retrasa el script el tiempo suficiente para que la contraseña termine en el portapapeles, antes de que el script intente pegarlo.
  6. Pegue el portapapeles en 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 que todo el guión estuviera condicionado a la presencia de SecurityAgent, porque este guión se asignará a un método abreviado de teclado y, si esa combinación de teclas es seleccionada inadvertidamente por el usuario, prefiero que no se moleste con un guión inesperado proceso.

Si hay formas en que podría refinar o mejorar esta solución, por favor avise. Estoy muy feliz de aprender más sobre AppleScript.

ACTUALIZACIONES FINALES: tuvo que hacer un cambio final. Resultó que los números de botón para CANCELAR y ACEPTAR cambian desde la instancia de SecurityAgent para crear un disco / imagen de disco cifrado, y para abrir un disco / imagen de disco cifrado. Así que tuve que modificar la declaración IF THEN cerca del final para manejar cada escenario.

    
respondido por el inspirednz 08.03.2015 - 03:21
0

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

Tal vez la aplicación no esté al frente en ese punto, así 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 necesita Eventos del sistema para realizar esa tarea, o si simplemente podría dirigir la salida al propio SecurityAgent.

Por cierto, hay casi siempre datos en el portapapeles, por lo que probarlos no sería realmente útil, sin tener en cuenta la contraseña real en el script [inseguro, por supuesto] no hay forma de que Se puede ver para comprobar si coincide con los datos correctos.

    
respondido por el Tetsujin 07.03.2015 - 11:50
0

Para detener el error que está recibiendo, debe eliminar la parte 'de grupo' del comando de clic.

(Probado creando un dmg encriptado)

No lo necesita y es por eso que recibe el error.

Los botones son 1 y 2.

1 será cancelar . 2 será ok

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

    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 use su fragmento de código, esta edición muestra cómo activar

1passowrd y use si no, entonces con retorno para cancelar el script en condiciones 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
    
respondido por el markhunte 07.03.2015 - 13:46

Lea otras preguntas en las etiquetas