【问题标题】:C++ Show OSX Permission DialogC++ 显示 OSX 权限对话框
【发布时间】:2013-08-23 14:07:17
【问题描述】:

我正在使用需要 root 权限的 Qt C++ 在 OSX 上编写应用程序。 我相信我可以通过显示一个提示用户名和密码的对话框来获得这些所需的权限,就像在 XAMPP 中这样:

如何做到这一点?我必须手动构建表单然后使用setuid,还是 SDK 上已经有内置功能?

【问题讨论】:

  • 我不了解 OSX,但在 Linux/Unix 上,我们通常使用 su/sudo 或等效的图形桌面命令(gksu/gksudo/kdesu/kdesudo 等)来启动 单独可执行。 OSX 上必须有等效的命令。但是,我强烈建议反对使用setuid 位,因为它不需要密码来获得root 权限,这很容易导致严重的安全问题。

标签: c++ macos qt permissions


【解决方案1】:

最初,Apple 提供了一个功能“AuthorizationExecuteWithPrivileges”,允许应用程序以 root 权限启动另一个应用程序。出于安全原因,此功能已被弃用。

这里的对话框有点误导。 Apple 提供authorization services,它在各种不同情况下启动对话框,但通常来自调用函数 AuthorizationCopyRights 的应用程序,在授权数据库(/etc/authorization 中的文件)中设置规则并使用 AuthorizationCreate 创建授权引用.

OSX 上的安全性分为安全守护进程、安全代理和应用程序。应用程序可以使用此系统限制功能,或请求授权用户输入凭据,以便启动特权应用程序,这是您需要做的。

请务必注意,该对话框并非由应用程序呈现,而是由安全客户端呈现,安全客户端仅负责安全 GUI。守护进程实际处理授权。

Apple 的提升方法是让所有应用程序以标准用户权限运行,如果需要特权任务,则必须将其分解为一个单独的应用程序,该应用程序注册为使用 launchd 运行并被赋予提升的权限。 Apple 提供的示例是SMJobBless

虽然示例的调用代码是用 Objective-C 编写的,但重要的函数只是 SMJobBlessAppController.m 文件中的 C 函数,最值得注意的是创建授权引用的 AuthorizationCreate 和代码文件底部的 Objective-C 函数 blessHelperWithLabel:error:

在 SMJobBless 上以this help document 开头,其中详细介绍了该过程。

最后,如果您使用 Qt,您需要为所需的函数调用包含 Apple 的安全框架。为此,只需将以下内容添加到您的 .pro 文件中:-

QMAKE_LFLAGS += -F /System/Library/Frameworks/Security.framework/
LIBS += -framework Security

【讨论】:

  • 这些似乎是正确的答案,我尝试将方法块 blessHelperWithLabel:error: 移植到我的 Qt 项目中,一切看起来都很好,但是当我不评论 result = (bool) SMJobBless(kSMDomainSystemLaunchd, label, authRef, &cfError); 行时,我不断收到错误消息error: symbol(s) not found for architecture x86_64。我已经为 Security 和 Core Foundation 添加了 QMAKE_LFLAGS,但是这个错误仍然存​​在。先生,您知道为什么会发生此错误吗?
  • “错误:未找到体系结构 x86_64 的符号”是“问题”窗口中无法链接到符号时出现的错误。什么是找不到的符号,输出到“编译输出”窗口?
  • 你解决了@yunhasnawa 吗?如果你这样做了,你能分享你的 qt 块吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 2015-10-30
  • 1970-01-01
  • 2016-06-21
  • 2021-03-06
  • 2016-10-22
  • 1970-01-01
相关资源
最近更新 更多