Come posso automatizzare incollare la password in SecurityAgent?

3

Su OS X 10.8.x avevo un servizio di Automator configurato per incollare una password dagli appunti nella finestra della password che si apre per montare un disco crittografato.

Non desidero memorizzare la password nel mio portachiavi, ed è lungo e noioso da digitare.

Non ho mai ottenuto il applescript all'interno del servizio Automator abbastanza bene. Avrebbe generato un errore, ma ha comunque completato il lavoro (cioè la password è stata incollata). Dall'aggiornamento a Yosemite sembra che lo script nel servizio Automator non funzioni affatto. L'errore generato indica che la "finestra 1" non esiste.

Ecco cosa ho avuto:

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

Non ricordo da dove ho preso questo, ma alcuni potrebbero provenire da qui

Conosco pochissimo su AppleScript, e apprezzerei un po 'di aiuto nel mettere a punto (o riscrivere completamente) questo script in modo che faccia quanto segue:

  1. Controlla che ci siano dati negli appunti
  2. Verifica che la finestra di SecurityAgent sia attiva (o in qualche modo assicuri che possa essere interagita con essa, per evitare di generare un errore)
  3. Incolla il contenuto degli appunti
  4. Fa clic sul pulsante "Unlock"

Non so se sia possibile, ma sarebbe utile se portasse anche 1Password in primo piano e attivasse "Copia password" (che è un'opzione di menu nel menu "Elementi"). Tuttavia, posso fare in modo che le azioni di Automator eseguano questo compito. Ma sarebbe bello vedere (per imparare) come ottenerlo con AppleScript.

    
posta inspirednz 07.03.2015 - 00:41
fonte

4 risposte

1

Grazie ai contributi di markhunte e tetsujin, ho trovato la seguente soluzione. Con tutto considerato, i requisiti esatti si sono evoluti in seguito:

  1. Assicurarsi che sia effettivamente presente una finestra di dialogo di SecurityAgent in modo che lo script non venga eseguito altrimenti.
  2. Riposiziona la finestra di dialogo di SecurityAgent perché può facilmente entrare nella sua posizione predefinita.
  3. Visualizza un messaggio che rimarrà su 1Password, ma non viene generato tramite 1password, istruendo l'utente a selezionare l'elemento corretto in 1Password
  4. Copia automaticamente la password per l'elemento 1Password corrente
  5. Ritarda lo script abbastanza a lungo affinché la password finisca effettivamente negli appunti, prima che lo script tenti di incollarla.
  6. Incollare gli Appunti in SecurityAgent e inviarlo.

Ho trovato la seguente soluzione:

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

Ho reso l'intero script condizionale alla presenza di SecurityAgent, perché questo script verrà assegnato a una scorciatoia da tastiera e, se tale combinazione di tasti viene inavvertitamente selezionata dall'utente, preferisco che non siano infastiditi da uno script imprevisto processo.

Se ci sono modi in cui potrei affinare o migliorare questa soluzione, si prega di avvisare. Sono molto felice di imparare di più su AppleScript.

AGGIORNAMENTI FINALI: ha dovuto apportare una modifica finale. Sono stati visualizzati i numeri dei pulsanti per CANCEL e OK per passare dall'istanza di SecurityAgent per la creazione di un'immagine disco / disco crittografata e per l'apertura di un'immagine disco / disco crittografata. Quindi ho dovuto modificare l'istruzione IF THEN proprio vicino alla fine per gestire ogni scenario.

    
risposta data 08.03.2015 - 03:21
fonte
0

Non ho nulla da testare, quindi questa è una supposizione pura.

Forse l'app non è in primo piano in quel punto, quindi questo potrebbe aiutare

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*)

Non sono sicuro che sia necessario Eventi di sistema per svolgere questa attività o se si possa semplicemente dirigere l'output su SecurityAgent stesso.

BTW, ci sono praticamente sempre dati negli appunti, quindi testare per quello non sarebbe di grande aiuto - senza notare la password reale nello script [insicuro, ovviamente] non c'è modo può vedere per testare se corrisponde ai dati corretti.

    
risposta data 07.03.2015 - 11:50
fonte
0

Per interrompere l'errore che stai ottenendo devi eliminare la parte "di gruppo" del comando clic.

(Testato creando un dmg crittografato)

Non ne hai bisogno e questo è il motivo per cui ottieni l'errore.

I pulsanti sono 1 e 2.

1 sarà cancel . 2 sarà ok

Quindi dovrai cambiare anche il pulsante che stai chiamando.

    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

Aggiornamento:

In risposta alle domande dell'OP nei commenti e usa il loro snippet di codice questa modifica mostra come attivare

1passowrd e utilizza se non poi con un return per annullare lo script in condizioni che una finestra non esiste.

    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
    
risposta data 07.03.2015 - 13:46
fonte
0

Questo script ha funzionato per me:

link

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
    
risposta data 16.01.2019 - 02:28
fonte

Leggi altre domande sui tag