Как прочитать настройки "Безопасность и конфиденциальность" с помощью командной строки или программно

Я хотел бы прочитать настройки из Preferences -> Security & Privacy -> General вкладка в моем приложении. В частности, меня интересует, установил ли пользователь пароль и требуется ли пароль немедленно "после запуска спящего режима или заставки" или после некоторой задержки. Безопасность и конфиденциальность Общая вкладка

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

командная строка: $ defaults -currentHost read com.apple.screensaver

код:

CFPreferencesCopyValue(CFSTR("idleTime"),
      CFSTR("com.apple.screensaver"),
      kCFPreferencesCurrentUser,
      kCFPreferencesCurrentHost);

По той же причине я попытался найти plist-файл для "Security & Privacy", но я не могу получить эти настройки из любого из plist-файлов в /Library/Preferences/ или же ~/Library/Preferences/,

Я заинтересован только в чтении значений. Итак, мой вопрос, это можно сделать? Если да, то как?

1 ответ

Решение

Если вы укажете -currentHost затем информация, возвращаемая defaults ограничен операциями с предпочтениями для хоста, на котором в данный момент находится пользователь (эти настройки хоста можно найти в ~/Library/Preferences/ByHost).

• Операции с базой данных по умолчанию обычно применяются к любому хосту, в который пользователь может войти, но могут быть ограничены для применения только к определенному хосту.

• Если хост не указан, операции предпочтений будут применяться к любому хосту, на котором пользователь может войти.

 -currentHost
  Restricts preferences operations to the host the user is currently logged in on.

 -host hostname
  Restricts preferences operations to hostname.

Таким образом, чтобы получить информацию о которой вы спрашивали:

$ defaults read com.apple.screensaver

Опуская -currentHost Вариант должен возвращаться:

{
    askForPassword = 1;
    askForPasswordDelay = 0;
}

Если вы хотите использовать CFPrefs:

#import <CoreFoundation/CoreFoundation.h>

#define EX_KEY "askForPasswordDelay"
#define EX_ID "com.apple.screensaver"

extern CFDictionaryRef _CFPreferencesCopyApplicationMap(CFStringRef userName, CFStringRef hostName);

int main(int argc, char *argv[])
{
    @autoreleasepool
    {
        CFURLRef current_url;
        CFStringRef path;
        CFMutableStringRef plist_path;
        CFPropertyListRef value;

        CFDictionaryRef app_map = _CFPreferencesCopyApplicationMap(
                                   kCFPreferencesCurrentUser,
                                   kCFPreferencesAnyHost);
        CFArrayRef urls = CFDictionaryGetValue(app_map, CFSTR(EX_ID));

        current_url = CFArrayGetValueAtIndex(urls, 0);
        path = CFURLCopyPath(current_url);

        plist_path = CFStringCreateMutable(kCFAllocatorDefault, 0);
        CFStringAppend(plist_path, path);
        CFStringAppend(plist_path, CFSTR(EX_ID));

        CFPropertyListRef prefs = CFPreferencesCopyValue(
        CFSTR(EX_KEY),
        CFSTR(EX_ID),
        CFSTR("kCFPreferencesCurrentUser"),
        CFSTR("kCFPreferencesAnyHost"));

        printf("CFPreferencesCopyValue \"%s\" of %s via ApplicationMap at path:\n", EX_KEY, EX_ID);
        CFShow(plist_path);
        CFShow(prefs);

        CFRelease(prefs);
        CFRelease(plist_path);
        CFRelease(path);
        CFRelease(app_map);
    }
}

Выход:

CFPreferencesCopyValue "askForPasswordDelay" of com.apple.screensaver via ApplicationMap at path:
/Users/Username/Library/Preferences/com.apple.screensaver
<CFNumber 0x47 [0x7fffbf0a9d80]>{value = +0.0, type = kCFNumberFloat32Type}

Man Справочные страницы OSX: настройки по умолчанию

Другие вопросы по тегам