【问题标题】:How to elevate privileges to use CFPreferencesSetValue for "any user" -- macos 10.10 - 10.12如何提升权限以将 CFPreferencesSetValue 用于“任何用户”——macos 10.10 - 10.12
【发布时间】:2016-11-15 23:28:07
【问题描述】:

在 /Applications 中安装我们的软件后,我希望我们的最终用户能够看到他们在“关于”框中输入的序列号。由于该软件已为所有用户激活,我想我需要将该信息写入一个常见的首选项文件位置。但是 Apple 的文档说 CFPreferencesAppSynchronize 不能用于 kCFPreferencesAnyUser:

“请注意,如果您有 根权限”

所以当然下面的代码不起作用(尽管 CFPreferencesAppSynchronize 返回 true):

void WritePrefTest(void)
{
    // Write it out
    CFStringRef textKey = CFSTR("myTextKey");
    CFStringRef applicationID = CFSTR("com.foo.bar");
    CFStringRef textValue = CFSTR("text that should be written");

    CFPreferencesSetValue(textKey, textValue, applicationID, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);

    Boolean wasSuccessful = CFPreferencesAppSynchronize(kCFPreferencesAnyUser);
    assert(wasSuccessful); 

    // read it back in

    CFStringRef prefText = (CFStringRef)CFPreferencesCopyAppValue(textKey, applicationID);
    NSLog(@"The text from com.foo.bar == %@", (__bridge NSString *)prefText);
}

由于序列号的激活和输入发生在安装程序之外,我应该 1) 请求提升权限(以前从未这样做过),2) 在其他文件夹(/Library/Application Support)中创建一个 plist - 假设我可以在那里写 - 或者 3) 将它写到其他一些 macos 接受的文件夹中?

【问题讨论】:

    标签: xcode macos cocoa installation


    【解决方案1】:

    啊哈!

    虽然 CFPreferencesAppSynchronize() 不会使用 kCFPreferencesAnyUser 参数在 /Library/Preferences 中创建新文件,但它会写入现有文件,如果该文件的权限已设置为允许管理员用户写入(并且该用户是登录)。由于我们的安装需要管理员权限,所以当用户运行 Apple Installer 时,Apple Installer 的提升权限可以在 /Library/Preferences 中创建该文件并赋予它管理员写入权限,以便稍后在产品激活期间用户的序列号可以添加供所有用户访问。

    请注意,此 plist 文件不是包含用户特定首选项的 plist,我们也不希望运行已安装应用程序的最终用户写入该文件(如果他们不是管理员用户,则会失败) .

    所以这让我们解决了这个问题(尽管我确信更有经验的开发人员可能会有一些想法要补充)。

    【讨论】:

      猜你喜欢
      • 2018-03-09
      • 1970-01-01
      • 2016-09-12
      • 2011-08-31
      • 2019-03-23
      • 1970-01-01
      • 2011-11-13
      • 2011-04-05
      • 2015-04-27
      相关资源
      最近更新 更多