Как прочитать настройки "Безопасность и конфиденциальность" с помощью командной строки или программно
Я хотел бы прочитать настройки из 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: настройки по умолчанию