1

我有一个 CLI 工具,它创建一个授权,然后使用它执行授权的命令。我需要连续多次调用这个 CLI 工具。

第一次调用该工具时,如何重新使用授权?这是我的授权码:

AuthorizationRef authorizationRef;
status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authorizationRef);
AuthorizationExecuteWithPrivileges(authorizationRef, "/bin/rm", kAuthorizationFlagDefaults, NULL  , NULL);
4

2 回答 2

3

用于AuthorizationMakeExternalForm创建授权令牌的可序列化版本。您可以在有限的时间内存储它,以便在您的应用程序之间使用。反序列化它AuthorizationCreateFromExternalForm。有关详细信息,请参阅授权服务编程指南。一个被埋没的关键细节是常数kAuthorizationExternalFormLength。您需要知道要序列化的对象有多大(它是 32 字节,但使用常量)。

此令牌非常敏感,因此您必须非常小心存储它的方式。通常最好创建一个您的应用程序可以与之通信的单独的特权帮助工具。有关如何在 10.8+ 中使用 XPC 执行此操作的示例代码,请参阅EvenBetterAuthorizationSample 。(如果您需要 10.8 之前的版本,曾经有一个名为 BetterAuthorizationSample 的示例代码可以追溯到 10.6。Apple 已将其删除,但您可以通过 google 找到副本)。

特权帮助工具的设置更复杂,但更安全。您使用 launchd 启动它,然后向它传递一个身份验证令牌(使用AuthorizationMakeExternalForm)。Launchd 将自动保持运行(并因此进行身份验证),直到它空闲一段时间。然后launchd会自动杀死它。这消除了将身份验证令牌写入文件的所有安全问题。

于 2013-11-05T22:19:10.063 回答
2

请注意, AuthorizationExecuteWithPrivileges 已经被弃用了一段时间。

正如@RobNapier 在他的综合回答中所建议的那样,您应该创建一个在launchd 中注册的帮助应用程序,这将为帮助程序提供所需的高度。

EvenBetterAuthorizationSample 是您应该瞄准的目标,但如果您是第一次接触它,它会非常复杂,尤其是当它在应用程序及其助手之间使用 XPC 通信时。

SMJobBless是一个更简单的示例,可以帮助您入门并理解创建单独的帮助应用程序的概念。

于 2013-11-06T10:06:41.510 回答