确定是否允许在macOS中启动应用

时间:2018-12-25 07:26:16

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

是否可以通过编程方式确定是否允许在macOS的“安全和隐私”设置中启动应用?

我试图以静默方式启动从Cocoa应用程序中从网络下载的.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分发。它以用户权限运行。

1 个答案:

答案 0 :(得分:0)

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

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