不推荐使用AuthorizationExecuteWithPrivileges

自从更新到OSX 10.7 Lion以来,Xcode告诉我AuthorizationExecuteWithPrivileges已弃用。

任何人都可以建议我的应用程序可以写入一个它没有权限的目录吗?


PIPIONE
浏览 2006回答 3
3回答

繁华开满天机

实际上,AuthorizationExecuteWithPrivileges()已经被弃用很长一段时间了,直到最近头文件才赶上了这个事实。您可以创建特权帮助工具作为应用程序的一部分。您可以使用ServiceManagement.framework的SMJobBless()功能有部署到系统中的辅助launchd背景:那么当你需要执行特权任务,你只要消息特权帮助做工作。有一点隐藏的复杂性,因为应用程序和帮助程序必须先声明另一个的签名标识,然后才SMJobBless()认为它们应该一起使用,并且需要让链接器将帮助程序工具的Info.plist文件写入二进制文件。这一切都被覆盖苹果的文档和苹果已经提供了一个示例项目,太。

慕无忌1623718

我知道这听起来很疯狂,但这确实有效: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权限。每次运行时都会询问密码。

慕仙森

- (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,但恕我直言是一个令人满意的解决方案。
打开App,查看更多内容
随时随地看视频慕课网APP