如何在不要求管理员密码的情况下以root身份运行应用程序?

时间:2010-04-06 14:07:50

标签: objective-c xcode macos

我正在使用Objective-C(Snow Leopard上的Xcode 3.2)编写一个程序,该程序能够在一段时间内有选择地阻止某些站点,或者只允许某些站点(从而阻止所有其他站点)一段时间。这个程序背后的原因很简单。当我有完全的互联网访问时,我往往会分心,但我确实需要在工作时间访问互联网以访问许多与工作相关的网站。很明显,这不是一个永久性的障碍,但只有在我发现自己有点过度徘徊时才能集中注意力。

目前,我正在使用通过AppleScript调用的Unix脚本来获取管理员权限。然后它会激活一些ipfw规则并在特定持续时间后清除这些规则以恢复完全的Internet访问。简单而有效,但由于我作为标准用户运行,每次我想要“离线”时输​​入管理员密码都很麻烦。此外,这是学习使用XCode和Objective-C的绝佳机会。目前,一切都按预期工作,减去实际阻塞。我可以在列表中添加多个站点,指定是否要阻止或允许这些网站,我可以通过指定我希望保持“离线”的时间来“启动”阻止。

但是,我发现很难获得有关如何从Objective-C运行特权Unix命令的明确信息。理想情况下,我希望能够将与管理员帐户相关的信息存储到钥匙串中以便以后使用这些信息,以便我可以简单地进入“离线”模式,方便点击按钮。更理想的是,在Objective-C中可能会有一些类,我可以使用它阻止对特定用户访问某些/所有网站,而无需依赖特权Unix命令。第三种可能性是使用root权限启动此程序并减少权限直到我需要它们,但由于这是一个嵌套在OS X菜单栏中的GUI应用程序,结果相当尴尬并让它运行每个每次使用root权限都不是一件容易的事。

任何能为我提供指导或建议的人?请没有安全警告,我完全清楚我想要做的是潜在的安全威胁。

2 个答案:

答案 0 :(得分:2)

如果您想使用管理员权限执行某项操作,并且您不希望每次都进行身份验证,则听起来您需要查看setuid。

创建小命令行可执行文件以执行规则更改,然后将该工具的所有者设置为root。然后,设置setuid位。现在,您可以以用户身份运行它,它将以root身份运行。

点击此处了解更多信息: http://en.wikipedia.org/wiki/Setuid

答案 1 :(得分:2)

您必须创建一个以更高权限运行的单独进程。看看BetterAuthorizationSample如何使用launchd运行这样的帮助应用程序。