首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lazarus :用SMJobBless()编写特权助手工具

Lazarus :用SMJobBless()编写特权助手工具
EN

Stack Overflow用户
提问于 2015-01-26 11:19:56
回答 2查看 567关注 0票数 1

过去,我在Lazarus中创建了一个应用程序,它执行"dd“将映像写入驱动器。为此,显然需要更高的权利。

在最初的版本中,我使用了AuthorizationExecuteWithPrivileges() (链接),尽管它并不是专门用于这个目的的,但它确实工作得非常好,而且非常一致。但是,自OSX10.7以来,这个函数已经贬值,因为它可能是一个安全问题,重定向的命令行语句也不能正常工作(将zip的输出重定向为dd的输入)。

在下一个版本中,我使用了Lazarus (执行外部程序)中描述的方法,它基本上启动了与我的程序通信的TProcess。使用sudo -S dd ...,询问并输入用户密码,以确保他/她拥有适当的访问权限。显然,这是一种肮脏的黑客方法,它表明,某些用户在这方面存在问题。

在做了大量阅读之后,苹果似乎更喜欢用一个名为SMJobBless()的辅助工具来完成这个任务。不幸的是,当涉及到Objective时,我并不是很有经验,所呈现的代码充其量似乎是极小的,而且也没有很好的文档。

我想知道是否有人有经验或可以帮助“移植”这个方法到拉撒路帕斯卡。我完全赞成把它做好。当然,替代方法也是最受欢迎的!

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-19 12:13:21

因为它花了我大量的工作,并认为这将是有益于其他人,这里我的最后工作解决方案。https://www.tweaking4all.com/software-development/lazarus-development/macos-smjobbless-elevated-privileges-lazarus-pascal/

你会发现有一个例子项目和大量的信息。

再现这一过程的步骤相当广泛,因此这里简短地回顾一下:

我一直使用CFMessages向Helper工具发送消息,因为我没有绑定NSXPCConnection。

Helper工具必须基于Lazarus模板“程序”或“简单程序”,不能基于任何TApplication类,也不能创建任何踏板。对于Helper工具,需要创建一个info.plist和一个launchd.plist,两者都必须嵌入到二进制文件中。

主(测试)应用程序可以是任何Lazarus应用程序,但也需要一个适当的Info.plist,这表明Helper工具允许以提升的权限启动。

Helper工具和应用程序包都需要使用有效的application进行签名。

需要设置一些缺失的绑定:

代码语言:javascript
复制
const  kSMRightBlessPrivilegedHelper = 'com.apple.ServiceManagement.blesshelper';
function SMJobBless(domain:CFStringRef; executableLabel:CFStringRef; auth:AuthorizationRef; outError:CFErrorRef): boolean; external name '_SMJobBless'; mwpascal; 
var kSMDomainSystemLaunchd: CFStringRef; external name '_kSMDomainSystemLaunchd';

需要包括适当的框架:

代码语言:javascript
复制
{$linkframework ServiceManagement}
{$linkframework Security}
{$linkframework Foundation}
{$linkframework CoreFoundation}
{$calling mwpascal}

让我们不要忘记设置回调函数来处理传入的消息。

我希望这对某人是有用的:-)

票数 0
EN

Stack Overflow用户

发布于 2015-01-26 11:52:09

不幸的是,在目标C方面,我的经验并不丰富。

不要让这妨碍了你使用苹果提供的例子。如果仔细查看SMJobBlisAppController.m中的代码,您将看到,除了一行Objective代码之外,其余的代码都是C代码。

目标-C行注册助手应用程序:-

代码语言:javascript
复制
if (![self blessHelperWithLabel:@"com.apple.bsd.SMJobBlessHelper" error:&error])

您将使用自己的URI,而不是com.apple.bsd.SMJobBlessHelper。

所有其他相关行都是普通的C函数。如果把这件事搞砸了,你就会有:-

代码语言:javascript
复制
// Obtain rights 
AuthorizationCopyRights(self->_authRef, &authRights, kAuthorizationEmptyEnvironment, flags, NULL)


//Start the helper
SMJobBless(kSMDomainSystemLaunchd, (CFStringRef)label, self->_authRef, &cfError);

我没有检查错误代码,但我希望这说明了您需要处理的代码是多么的少,所需的目标-C知识非常少。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28149105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档