【问题标题】:How to read "Security & Privacy" settings using command line or programatically如何使用命令行或以编程方式读取“安全和隐私”设置
【发布时间】:2017-01-18 06:44:11
【问题描述】:

我想从我的应用程序中的Preferences -> Security & Privacy -> General 选项卡中读取设置。我特别感兴趣的是用户是否设置了密码,以及是否在“睡眠或屏幕保护程序开始后”或延迟一段时间后立即需要密码。

通过查看屏幕保护程序的默认设置,我能够找到屏幕保护程序何时启动。

命令行:$ defaults -currentHost read com.apple.screensaver

代码:

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

使用相同的推理,我试图找到“安全和隐私”的 plist 文件,但我无法从 /Library/Preferences/~/Library/Preferences/ 中的任何 plist 文件中检索此设置。

我只对阅读值感兴趣。所以我的问题是,这可以做到吗?如果是,怎么做?

【问题讨论】:

  • 我对你的问题有点困惑;您是否只想找到是否需要密码的值以及屏幕保护程序启动后的延迟时间?使用defaults read com.apple.screensaver 没有 -currentHost 应该返回该信息。
  • 天哪,我被这件事弄糊涂了。调用这个有和没有给出完全不同的结果,我需要这两个部分来得到我所有的答案。那么,你想写一个正确的答案让我接受吗?

标签: macos defaults


【解决方案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}

OSX Man Pages : defaults

【讨论】:

  • 我看不到任何地方(例如defaults read 或 ~/Library/Preferences/ByHost/* 文件,其中存储了哪些应用程序已被授予权限,例如相机访问权限。我需要一个 LaunchDaemon运行脚本以获得此权限,有什么想法可以在哪里查看?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多