Отключить требование пароля заставки из командной строки

Я пытаюсь включить и отключить требование пароля заставки из командной строки.

defaults read com.apple.screensaver

показывает переменную askForPassword, для которой установлено значение 0 или 1, в зависимости от того, настроил ли я требование пароля в Системных настройках или нет.

defaults write com.apple.screensaver askForPassword 1

и

defaults write com.apple.screensaver askForPassword 0

включить и отключить настройку пароля, или я так думал.

Вместо этого я обнаружил, что команды действительно устанавливают и снимают флажок в Системных настройках в разделе «Безопасность», но никак не влияют на заставку.

Если я включу пароль в Системных настройках, а затем отключу его с помощью второй команды записи по умолчанию, флажок в Системных настройках будет снят, но заставка все равно будет запрашивать пароль. Теперь только установка и снятие флажка в Системных настройках может изменить это поведение.

И если я отключу пароль в Системных настройках, а затем включу его с помощью первой команды записи по умолчанию, флажок в Системных настройках будет установлен, но скринсейвер не будет запрашивать пароль. Только снятие и установка флажка в Системных настройках впоследствии изменяет поведение.

В чем дело?

Я могу представить, что это глобальная настройка, и я должен изменить ее /Library/Preferences/com.apple.screensaverвместо пользовательского домена. Но в таком случае, почему установлен флажок «Системные настройки»?

Это немного сбивает с толку. Я наблюдал за чтением/записью файлов при переключении параметра «запрашивать пароль». Единственный файл, который я вижу измененным, это com.apple.screensaver. Я предполагаю, что сообщение отправляется какой-то службе, когда эта кнопка переключается в графическом интерфейсе, а также записывается в файл plist. Держу пари, что перезагрузка системы или выход из системы может привести к тому, что файл будет перечитан указанной службой, что внесет желаемое изменение.
Я был прав! Выход из системы и повторный вход после изменения файла plist приводит к тому, что изменения в настройках отражаются. Итак, похоже, вам нужно найти, какая служба контролирует поведение «запросить пароль», и сбросить/перезагрузить его после изменения plist.
Похоже, что Apple подрывает собственный механизм plist.
Та. Я надеюсь, что кто-то это знает и ответит здесь.
Это процесс «loginwindow», который, кажется, получает доступ к этому файлу после того, как он был написан Системными настройками. Что имеет смысл. К сожалению, завершение процесса loginwindow приведет к принудительному выходу из системы. Продолжать копать!
@macaco Можете ли вы описать метод, который вы использовали для мониторинга чтения / записи файлов, который переключает настройку «запросить пароль»?

Ответы (2)

Если вы не обязаны использовать запись по умолчанию , вы можете использовать следующую команду. Он взаимодействует с ОС так же, как если бы вы использовали Системные настройки.

ПРОВЕРЕНО НА:

  • 10.5.х
  • 10.6.х
  • 10.7.х
  • 10.8.х
  • 10.9.х

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 :–( Однако я вполне уверен, что это будет работать, поскольку plist очень похожи. Я знаю, что screensaver.plist в 10.5 отличается, и потребуется некоторая настройка. , В любом случае, еще раз спасибо. :-)
У меня есть рабочие машины с версиями 10.7, 10.5 и 10.3, но в данный момент я далеко от них всех. Я хотел бы взглянуть на это в этом контексте, но не могу до сегодняшнего вечера или завтра.
@DanielLawson Я отредактировал свой ответ, чтобы отразить тестирование 10.5.x 10.6.x 10.7.3. Команда функционировала для каждой ОС. Еще раз спасибо.
Я тестировал это на 10.7.5 на OS X Server, и это не работает. Для заставки по-прежнему требуется пароль, и флажок не снят.
У меня это работает на 10.11 (Эль-Капитан). Нашел это из этой темы ( github.com/dustinrue/ControlPlane/issues/421 )
Метод «osascript» не работает на моем High Sierra Mac. Похоже, что на файл ~/Library/Preferences/com.apple.screensaver.plist не влияет переключатель графического интерфейса на моем High Sierra Mac.

Я столкнулся с похожей проблемой и нашел решение от пользователя 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 не синхронизированы. Возврат к файлу библиотеки для связывания». При запуске происходит сбой с ошибкой сегментации.
@TJLuoma это потому, что ваша среда сборки настроена неправильно. llvm сообщит об этой ошибке для каждого файла, который вы компилируете с помощью фреймворков. Однако ошибка сегментации связана с другой проблемой. Похоже, CFMessagePortCreateRemote возвращает значение NULL для порта. Следовательно, ошибки SendRequest. Я предполагаю, что имя удаленного порта сообщений недопустимо, но я не знаю, каким оно должно быть.