从命令行禁用屏幕保护程序密码要求


11

我正在尝试从命令行启用和禁用屏幕保护程序密码要求。

defaults read com.apple.screensaver

显示的变量AskForPassword设置为0或1,具体取决于我是否在系统偏好设置中配置了密码要求。

defaults write com.apple.screensaver askForPassword 1

defaults write com.apple.screensaver askForPassword 0

启用和禁用密码设置,或者我想。

相反,我发现这些命令确实选中并取消选中“安全性”下“系统偏好设置”中的复选框,但根本不影响屏幕保护程序。

如果我在“系统偏好设置”中启用了密码,然后使用第二个默认的write命令将其禁用,则“系统偏好设置”中的复选框未选中,但是屏幕保护程序仍会要求输入密码。现在仅选中和取消选中“系统偏好设置”中的复选框即可更改此行为。

而且,如果我在“系统偏好设置”中禁用了密码,然后使用第一个默认写入命令启用了该密码,则会选中“系统偏好设置”中的复选框,但屏幕保护程序不会要求输入密码。只有取消选中并选中“系统偏好设置”中的复选框后,行为才会更改。

这是怎么回事?

我可以想象这是一个全局设置,应该修改/Library/Preferences/com.apple.screensaver而不是用户域。但是在那种情况下,为什么对“系统偏好设置”复选框有影响?


这有点令人困惑。在切换“询问密码”设置时,我已经看过文件读/写。我可以看到的唯一被修改的文件是com.apple.screensaver。我猜想在GUI中切换此按钮以及写入plist文件时,消息会发送到某些服务。我敢打赌,重启系统或注销/登录可能会导致文件被所述服务重新读取,从而进行所需的更改。
Macaco 2012年

1
我是正确的!更改plist文件后注销然后重新登录,将反映设置的更改。因此,看起来您需要查找哪个服务正在控制“询问密码”行为,并在修改plist之后重置/重新加载它。
Macaco 2012年

看起来苹果公司正在破坏自己的plist机制。
Andrew J. Brehm

助教。我希望有人会知道并在这里回答。
Andrew J. Brehm

1
由“系统偏好设置”编写该文件后,似乎是“ loginwindow”过程正在访问该文件。有道理。不幸的是,杀死loginwindow进程将强制您注销。继续挖!
Macaco 2012年

Answers:


7

如果您不被迫使用默认值写,则可以使用以下命令。它与操作系统的交互作用就好像您要利用系统偏好设置一样。

测试于:

  • 10.5.x
  • 10.6.x
  • 10.7.x
  • 10.8.x
  • 10.9.x

sudo osascript -e 'tell application "System Events" to set require password to wake of security preferences to false'

注意:如果命令是在已获得root特权的脚本中运行,则不需要sudo

osascript -e 'tell application "System Events" to set require password to wake of security preferences to false'

真好!命令行AppleScript通常是解决此类问题的好方法。
丹尼尔

@DanielLawson谢谢,您当前正在使用10.7吗?我通常喜欢发布测试了我的命令的操作系统,不幸的是,今天早上我被一台旧的Snow Leopard机器困住了,直到今天晚些时候才可以使用10.7机器。我不希望它在10.6.x上运行,而在10.7:1上失败:-(但是,我很确定这会起作用,因为塑料垫非常相似。我知道10.5的screensaver.plist是不同的,需要进行一些调整。无论如何,再次感谢。:–)
E1Suave

1
我已经在OS X Server的10.7.5上对此进行了测试,但无法正常工作。屏幕保护程序仍然需要密码,并且未取消选中首选项。

1
这对我来说适用于10.11(El Capitan)。从此线程(github.com/dustinrue/ControlPlane/issues/421)找到它
GTF

1
我的High Sierra Mac上无法使用“ osascript”方法。〜/ Library / Preferences / com.apple.screensaver.plist文件似乎不受High Sierra Mac上的GUI开关的影响。
肯特

3

我遇到了类似的问题,并在此论坛帖子上找到了Guillaume用户的解决方案。基本上,您需要强制屏幕保护程序重新读取密码要求首选项,您可以使用C程序执行此操作:

#include <CoreFoundation/CoreFoundation.h>

int main(int argc, char ** argv)
{
    CFMessagePortRef port = CFMessagePortCreateRemote(NULL, CFSTR("com.apple.loginwindow.notify"));
    CFMessagePortSendRequest(port, 500, 0, 0, 0, 0, 0);
    CFRelease(port);
    return 0;
}

并使用以下代码进行编译:

cc -o /tmp/anywhereyouwantit/notif notif.c -framework CoreFoundation

然后,在您致电后立即调用此程序 defaults write


更新:在High Sierra(10.13.6)上编译,但报告此错误:“ ld:警告:基于文本的存根文件/System/Library/Frameworks//CoreFoundation.framework/CoreFoundation.tbd和库文件/ System / Library /Frameworks//CoreFoundation.framework/CoreFoundation不同步。回退到库文件进行链接。” 运行时失败,出现分段错误。
TJ Luoma
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.