Alternar la contraseña del protector de pantalla con un script

4

Estoy usando una aplicación bastante antigua llamada Proximity para activar Applecripts cuando mi teléfono entra y sale rango de bluetooth de mi mac. Junto con otras tareas, quiero asegurar mi computadora portátil cuando el teléfono está fuera de alcance (habilitar el protector de pantalla y la contraseña), luego deshabilitar el requisito de contraseña cuando mi teléfono vuelva a estar dentro del rango.

Antes de 10.9

Tuve este trabajo (en su mayoría) en OS 10.8 y anteriores. Cuando mi teléfono se salió del alcance, pude correr:

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 1"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

tell application "System Events"
    set ss to screen saver "Soundstream"
    start ss
end tell

El notifyScreensaver es un programa compilado en C que hace que el protector de pantalla vuelva a leer las preferencias de requisitos de contraseña (de esta publicación en el foro ).

Esto habilitaría el requisito de una contraseña y luego ejecutaría el protector de pantalla de inmediato. Este fue el comportamiento correcto para si mi computadora portátil estuviera en un entorno público. Sin embargo, cuando estaba en casa, no quería tener que ingresar la contraseña cada vez que salía de la habitación y regresaba un minuto después. Entonces agregando otra capa de complejidad:

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 1"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

set ssid to getWifiSSID()
if ssid is equal to "RouterName" then
    (* if at home, only enable password requirement without triggering screensaver *)
else
    (* if not at home, lock screen immediately *)
    tell application "System Events"
        set ss to screen saver "Soundstream"
        start ss
    end tell
end if

on getWifiSSID()
    set theWiFi to do shell script "wifi='/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | awk '/ SSID/ {print substr($0, index($0, $2))}''
echo $wifi
"
    return theWiFi
end getWifiSSID

Usando esto, cuando estoy en casa, solo necesito ingresar mi contraseña si mi teléfono está fuera del alcance Y si mi computadora ha estado inactiva durante el tiempo suficiente para activar el tiempo de espera del protector de pantalla (~ 20 minutos).

Cuando mi teléfono volviera al rango, correría:

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 0"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

Si el protector de pantalla ya se estaba ejecutando, uno todavía tendría que escribir la contraseña para desbloquear la computadora, pero la contraseña no se requeriría si el protector de pantalla se reiniciara más tarde.

Hubo un pequeño problema aquí: ocasionalmente (creo que cuando no hubo comentarios del usuario entre el momento en que se ejecutó el script fuera de rango y el script dentro del rango, y el protector de pantalla se había habilitado), la pantalla sería completamente negra en lugar de mostrar el mensaje de contraseña para desbloquear la computadora. Sin embargo, en este caso podría ingresar al campo de contraseña y escribir la contraseña a ciegas para desbloquear la computadora.

En 10.9

El cambio más significativo que he encontrado en 10.9 ocurre cuando la contraseña y el protector de pantalla están habilitados y luego la contraseña se deshabilita, sin ninguna entrada por parte del usuario. Cuando vuelvo para desbloquear la computadora, el protector de pantalla no requiere una contraseña e inmediatamente vuelve al escritorio. Sin embargo, el protector de pantalla sigue atrapado en el teclado: puedo interactuar con los programas con el mouse, pero cualquier pulsación de tecla solo provoca un sonido de alerta de advertencia ("Funk" de las alertas estándar).

Un ejemplo mínimo que causa este comportamiento es:

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 1"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

tell application "System Events"
    set ss to screen saver "Soundstream"
    start ss
end tell

delay 5

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 0"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

La forma principal que he encontrado para salir de este estado semicerrado es volver a habilitar el requisito de contraseña y volver a ejecutar el protector de pantalla, y luego ingresar la contraseña manualmente.

El comportamiento más ideal (en mi opinión) sería bloquear mi computadora tan pronto como mi teléfono se salga del alcance, luego desbloquearlo automáticamente (sin el requisito de escribir una contraseña) cuando mi teléfono vuelva a estar dentro del rango . Sin embargo, desde las versiones anteriores del sistema operativo he estado trabajando bajo el supuesto de que se requiere la entrada del usuario para desbloquear la computadora después de que se hayan activado el protector de pantalla y el requisito de contraseña. Con esta restricción, el comportamiento deseado es simplemente restaurar la funcionalidad que estaba presente antes de la versión 10.9: poder escribir la contraseña para desbloquear la computadora cuando esté nuevamente dentro del rango, pero no volver a requerir una contraseña hasta que el teléfono salga del alcance.

¿Alguna sugerencia sobre cómo lograr esto?

    
pregunta Chris C 17.11.2013 - 19:17

1 respuesta

2

A mí me pasa lo mismo en 10.9. También intenté cambiar require password to wake of security preferences y poner las pantallas en modo de suspensión en lugar de iniciar un protector de pantalla:

tell application "System Events"
    set require password to wake of security preferences to true
    --start screen saver "Random"
    do shell script "pmset displaysleepnow"
    delay 5
    set require password to wake of security preferences to false
end tell

Ninguno de los dos ayudó, sin embargo.

Puede cerrar sesión en la pantalla de cambio rápido de usuario en lugar de bloquear la pantalla:

/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend
    
respondido por el user495470 18.11.2013 - 06:32

Lea otras preguntas en las etiquetas