Umschalten des Bildschirmschoner-Passworts mit Skript

Ich verwende eine ziemlich alte Anwendung namens Proximity , um Applescripts auszulösen, wenn mein Telefon in die Bluetooth-Reichweite meines Mac ein- und ausgeht. Neben anderen Aufgaben möchte ich meinen Laptop sichern, wenn sich das Telefon außerhalb der Reichweite befindet (Bildschirmschoner und Kennwort aktivieren), und dann die Kennwortanforderung deaktivieren, wenn mein Telefon wieder in Reichweite kommt.

Vor dem 10.9

Ich hatte dies (meistens) in OS 10.8 und früher. Wenn mein Telefon außer Reichweite war, konnte ich Folgendes ausführen:

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

Das notifyScreensaverist ein kompiliertes C-Programm, das den Bildschirmschoner dazu bringt, die Einstellungen für die Kennwortanforderung erneut zu lesen (aus diesem Forumsbeitrag ).

Dies würde die Anforderung eines Kennworts aktivieren und dann sofort den Bildschirmschoner ausführen. Dies war das richtige Verhalten, wenn sich mein Laptop in einer öffentlichen Umgebung befand. Wenn ich jedoch zu Hause war, wollte ich nicht jedes Mal das Passwort eingeben müssen, wenn ich das Zimmer verließ und eine Minute später zurückkam. Fügen Sie also eine weitere Ebene der Komplexität hinzu:

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

Wenn ich damit zu Hause bin, muss ich mein Passwort nur dann eingeben, wenn mein Telefon außer Reichweite ist UND wenn mein Computer lange genug im Leerlauf war, um das Bildschirmschoner-Timeout auszulösen (~ 20 Minuten).

Wenn mein Telefon wieder in Reichweite kam, würde ich Folgendes ausführen:

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

Wenn der Bildschirmschoner bereits lief, müsste man immer noch das Passwort eingeben, um den Computer zu entsperren, aber das Passwort wäre nicht erforderlich, wenn der Bildschirmschoner später erneut gestartet würde.

Hier gab es einen kleinen Fehler: Gelegentlich (ich glaube, wenn keine Benutzereingabe zwischen dem Ausführen des Out-of-Range-Skripts und dem In-Range-Skript erfolgte und der Bildschirmschoner aktiviert wurde) wurde der Bildschirm einfach angezeigt vollständig schwarz sein, anstatt die Passwortabfrage zum Entsperren des Computers anzuzeigen. In diesem Fall könnte ich jedoch in das Passwortfeld tippen und das Passwort blind eingeben, um den Computer zu entsperren.

Am 10.9

Die bedeutendste Änderung, auf die ich in 10.9 gestoßen bin, tritt auf, wenn das Passwort und der Bildschirmschoner aktiviert sind und dann das Passwort deaktiviert wird, ohne dass dazwischen eine Benutzereingabe erfolgt. Wenn ich dann zurückkomme, um den Computer zu entsperren, verlangt der Bildschirmschoner kein Passwort und springt sofort zurück auf den Desktop. Die Tastatur ist jedoch immer noch vom Bildschirmschoner gefangen: Ich kann mit der Maus mit Programmen interagieren, aber alle Tastenanschläge verursachen nur einen Warnton ("Funk" von den Standardwarnungen).

Ein minimales Beispiel, das dieses Verhalten verursacht, ist:

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"

Die Hauptmethode, die ich gefunden habe, um aus diesem halb gesperrten Zustand herauszukommen, besteht darin, die Kennwortanforderung erneut zu aktivieren und den Bildschirmschoner erneut auszuführen und dann das Kennwort manuell einzugeben.

Das idealste Verhalten (meiner Meinung nach) wäre, meinen Computer zu sperren, sobald sich mein Telefon außerhalb der Reichweite befindet, und ihn dann automatisch zu entsperren (ohne dass ein Passwort eingegeben werden muss), wenn mein Telefon wieder in Reichweite kommt. Seit früheren Betriebssystemversionen gehe ich jedoch davon aus, dass Benutzereingaben erforderlich sind, um den Computer zu entsperren, nachdem der Bildschirmschoner und die Kennwortanforderung aktiviert wurden. Mit dieser Einschränkung besteht das gewünschte Verhalten lediglich darin, die Funktionalität wiederherzustellen, die vor 10.9 vorhanden war – in der Lage zu sein, das Passwort einzugeben, um den Computer zu entsperren, wenn er wieder in Reichweite ist, aber kein Passwort erneut zu verlangen, bis das Telefon die Reichweite verlässt.

Irgendwelche Vorschläge, wie man dies bewerkstelligen kann?

Je nachdem, wie neu Ihr Telefon und Ihr Mac sind, könnte dies auch eine Option sein: Zum Entsperren klopfen
Leider sieht es so aus, als wäre mein Mac nur eine Generation zu alt, als dass Bluetooth Low Energy (und damit Knock) funktionieren könnte. Sieht aber sehr interessant aus; Ich werde seine Entwicklung im Auge behalten.

Antworten (1)

Das gleiche passiert mir in 10.9. Ich habe auch versucht, require password to wake of security preferencesAnzeigen zu ändern und in den Ruhezustand zu versetzen, anstatt einen Bildschirmschoner zu starten:

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

Geholfen hat aber keiner von beiden.

Sie können sich jedoch beim Bildschirm zum schnellen Benutzerwechsel abmelden, anstatt den Bildschirm zu sperren:

/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend
Das pmset displaysleepnowist nützlich, aus irgendeinem Grund war ich darauf in der Vergangenheit nicht gestoßen. Ein schneller Benutzerwechsel allein würde es mir leider nicht erlauben, den Rechner verzögert zu sperren, zB wenn ich zu Hause für eine Minute aus dem Zimmer gehe.