【问题标题】:Determine if an app is allowed to launch in macOS确定是否允许在 macOS 中启动应用程序
【发布时间】:2018-12-25 07:26:15
【问题描述】:

有没有办法以编程方式确定是否允许在 macOS 的安全和隐私设置中启动应用程序?

我正在尝试以静默方式启动从 Cocoa 应用程序中从 Web 下载的 .app,但如果用户不允许来自 Mac App Store 外部的应用程序,我的应用程序将无法启动,并显示一个对话框,推荐用户更改其设置。我想知道应用程序是否会成功启动,如果不会,请自行打开安全和隐私设置,以便用户更改它们。

基本上,我正在寻找函数 AppIsAllowedToLaunch:

if (AppIsAllowedToLaunch(appURL)) {
  // open the app at appURL
} else {
  // open Security & Privacy settings, inform the user that they should change settings
}

我尝试了什么:

  • 无论应用程序是否成功启动,open(2) 始终返回零退出代码
  • [NSWorkspace.sharedWorkpace launchApplicationAtURL:options:configuration:error] 返回一个 NSRunningApplication 的实例。这个对象不仅不允许我检查应用程序是否已成功启动,而且还要求我尝试启动应用程序以查看会发生什么,而不是事先执行检查,即我需要什么
  • 开源 open(2) 替代方案大多已过时,并且不反映允许用户阻止非 Mac App Store 应用程序启动的安全和设置更改。不幸的是,原来的 open(2) 不是开源的。
  • 如果根据安全和隐私设置不允许应用程序启动,spctl -a /path/to/app.app 将正确返回 3。但如果应用程序需要 root 权限才能运行(而我正在启动的应用程序需要),它也会返回 3,所以我不能使用这种方法。

必须有一些系统框架(可能是LaunchServicesSecurity)或系统数据库(类似于/var/db/SystemPolicyConfiguration/KextPolicy),以检查应用程序是否可以成功启动。

我的应用没有经过沙盒处理,也没有通过 Mac App Store 分发。它以用户权限运行。

【问题讨论】:

  • "spctl -a /path/to/app.app 如果根据安全和隐私设置不允许启动应用程序,则将正确返回 3。但如果应用程序需要 root 权限才能运行(并且应用程序 I' m 启动确实),所以我不能使用这种方法” - 假设这是正确的并且没有其他方法为什么不首先下载一个不需要 root 权限才能运行的小应用程序并使用这种方法来确定它是否可以运行和因此区分这两个 3 案例?

标签: macos security cocoa osx-gatekeeper launch-services


【解决方案1】:

尝试使用spctl --assess --raw app.app

--raw 除了提供退出代码外,还提供 XML 输出。我找不到这些值的文档,但它们可能包含您需要的信息。

【讨论】:

  • 不幸的是,我从命令获得的输出对于我的目标来说不够丰富。无论是否只允许 Mac App Store 应用程序,输出都没有区别。
猜你喜欢
  • 2019-12-28
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2011-12-05
  • 2013-01-22
  • 1970-01-01
相关资源
最近更新 更多