为了账号安全,请及时绑定邮箱和手机立即绑定

不推荐使用AuthorizationExecuteWithPrivileges

不推荐使用AuthorizationExecuteWithPrivileges

PIPIONE 2019-09-02 09:21:27
自从更新到OSX 10.7 Lion以来,Xcode告诉我AuthorizationExecuteWithPrivileges已弃用。任何人都可以建议我的应用程序可以写入一个它没有权限的目录吗?
查看完整描述

3 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

实际上,AuthorizationExecuteWithPrivileges()已经被弃用很长一段时间了,直到最近头文件才赶上了这个事实。


您可以创建特权帮助工具作为应用程序的一部分。您可以使用ServiceManagement.framework的SMJobBless()功能有部署到系统中的辅助launchd背景:那么当你需要执行特权任务,你只要消息特权帮助做工作。


有一点隐藏的复杂性,因为应用程序和帮助程序必须先声明另一个的签名标识,然后才SMJobBless()认为它们应该一起使用,并且需要让链接器将帮助程序工具的Info.plist文件写入二进制文件。这一切都被覆盖苹果的文档和苹果已经提供了一个示例项目,太。



查看完整回答
反对 回复 2019-09-02
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

我知道这听起来很疯狂,但这确实有效:


NSDictionary *error = [NSDictionary new]; 

NSString *script =  @"do shell script \"whoami > /tmp/me\" with administrator privileges";  

NSAppleScript *appleScript = [[NSAppleScript alloc] initWithSource:script]; 

if ([appleScript executeAndReturnError:&error]) {

  NSLog(@"success!"); 

} else {

  NSLog(@"failure!"); 

}

我正在从Objective C执行一个Applescript。唯一的缺点是你无法获得永久的root权限。每次运行时都会询问密码。


查看完整回答
反对 回复 2019-09-02
  • 慕姐3177523
    慕姐3177523
    为啥我用OC运行do shell script "ls" with administrator privileges 就报 The administrator user name or password was incorrect. 而不是弹出输入密码的交互窗口?
  • 慕姐3177523
    慕姐3177523
    我在Command Line Tool工程中就可以运行成功,但在Cocoa App工程中就不行,提示上面说的错误信息。
?
慕仙森

TA贡献1827条经验 获得超7个赞

- (BOOL) runProcessAsAdministrator:(NSString*)scriptPath

                     withArguments:(NSArray *)arguments

                            output:(NSString **)output

                  errorDescription:(NSString **)errorDescription {


    NSString * allArgs = [arguments componentsJoinedByString:@" "];

    NSString * fullScript = [NSString stringWithFormat:@"'%@' %@", scriptPath, allArgs];


    NSDictionary *errorInfo = [NSDictionary new];

    NSString *script =  [NSString stringWithFormat:@"do shell script \"%@\" with administrator privileges", fullScript];


    NSAppleScript *appleScript = [[NSAppleScript new] initWithSource:script];

    NSAppleEventDescriptor * eventResult = [appleScript executeAndReturnError:&errorInfo];


    // Check errorInfo

    if (! eventResult)

    {

        // Describe common errors

        *errorDescription = nil;

        if ([errorInfo valueForKey:NSAppleScriptErrorNumber])

        {

            NSNumber * errorNumber = (NSNumber *)[errorInfo valueForKey:NSAppleScriptErrorNumber];

            if ([errorNumber intValue] == -128)

                *errorDescription = @"The administrator password is required to do this.";

        }


        // Set error message from provided message

        if (*errorDescription == nil)

        {

            if ([errorInfo valueForKey:NSAppleScriptErrorMessage])

                *errorDescription =  (NSString *)[errorInfo valueForKey:NSAppleScriptErrorMessage];

        }


        return NO;

    }

    else

    {

        // Set output to the AppleScript's output

        *output = [eventResult stringValue];


        return YES;

    }

}

用法示例:


    NSString * output = nil;

    NSString * processErrorDescription = nil;

    BOOL success = [self runProcessAsAdministrator:@"/usr/bin/id"

                         withArguments:[NSArray arrayWithObjects:@"-un", nil]

                         output:&output

                         errorDescription:&processErrorDescription];



    if (!success) // Process failed to run

    {

         // ...look at errorDescription 

    }

    else

    {

         // ...process output

    }

它有点hacky,但恕我直言是一个令人满意的解决方案。


查看完整回答
反对 回复 2019-09-02
  • 3 回答
  • 0 关注
  • 2005 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信