3 回答
TA贡献1816条经验 获得超4个赞
实际上,AuthorizationExecuteWithPrivileges()已经被弃用很长一段时间了,直到最近头文件才赶上了这个事实。
您可以创建特权帮助工具作为应用程序的一部分。您可以使用ServiceManagement.framework的SMJobBless()功能有部署到系统中的辅助launchd背景:那么当你需要执行特权任务,你只要消息特权帮助做工作。
有一点隐藏的复杂性,因为应用程序和帮助程序必须先声明另一个的签名标识,然后才SMJobBless()认为它们应该一起使用,并且需要让链接器将帮助程序工具的Info.plist文件写入二进制文件。这一切都被覆盖苹果的文档和苹果已经提供了一个示例项目,太。
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权限。每次运行时都会询问密码。
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,但恕我直言是一个令人满意的解决方案。
- 3 回答
- 0 关注
- 2005 浏览
添加回答
举报