显然,从10.7开始,AuthorizationExecuteWithPrivileges
已被弃用。我收集到的信息的一般要点似乎建议使用ServiceManagement.framework
的{{1}}函数来部署帮助应用程序。
我对它的理解是,这需要从Apple购买开发人员证书,以便对我的应用程序和帮助程序进行编码 - 或者这不起作用。它是否正确?
我最初使用SMJobBless()
要求用户提升权限,因为他们需要访问另一个正在运行的进程。没有它,我的应用程序无法作为其意图的非官方插件。代码签名方式真的是从这里开始的唯一方式吗?我试图避免购买开发人员证书,因为它的成本非常高。
有没有人找到任何替代方法来重新启动具有提升权限的应用程序,当然还有用户权限?
答案 0 :(得分:3)
@CarlosP's answer使用代码来逃避路径&参数:
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
<强>更新强>
在优胜美地,- (BOOL)runProcessAsAdministrator:(NSString*)scriptPath
withArguments:(NSArray*)arguments
output:(NSString**)output
errorDescription:(NSString**)errorDescription {
//Check path.
if (![scriptPath hasPrefix:@"/"]) {
@throw [NSException exceptionWithName:
NSInvalidArgumentException reason:@"Absolute path required." userInfo:nil];
}
//Define script.
static NSAppleScript* appleScript = nil;
if (!appleScript) {
appleScript = [[NSAppleScript alloc] initWithSource:
@"on run commandWithArguments\n"
" activate\n"
" repeat with currentArgument in commandWithArguments\n"
" set contents of currentArgument to quoted form of currentArgument\n"
" end repeat\n"
" set AppleScript's text item delimiters to space\n"
" return do shell script (commandWithArguments as text) with administrator privileges\n"
"end run"];
}
//Set command.
NSAppleEventDescriptor* commandWithArguments = [NSAppleEventDescriptor listDescriptor];
[commandWithArguments insertDescriptor:
[NSAppleEventDescriptor descriptorWithString:scriptPath] atIndex:0];
//Set arguments.
for (NSString* currentArgument in arguments) {
[commandWithArguments insertDescriptor:
[NSAppleEventDescriptor descriptorWithString:currentArgument] atIndex:0];
}
//Create target & event.
ProcessSerialNumber processSerial = {0, kCurrentProcess};
NSAppleEventDescriptor* scriptTarget =
[NSAppleEventDescriptor descriptorWithDescriptorType:typeProcessSerialNumber bytes:&processSerial length:sizeof(ProcessSerialNumber)];
NSAppleEventDescriptor* scriptEvent =
[NSAppleEventDescriptor appleEventWithEventClass:kCoreEventClass
eventID:kAEOpenApplication
targetDescriptor:scriptTarget
returnID:kAutoGenerateReturnID
transactionID:kAnyTransactionID];
[scriptEvent setParamDescriptor:commandWithArguments forKeyword:keyDirectObject];
//Run script.
NSDictionary* errorInfo = [NSDictionary dictionary];
NSAppleEventDescriptor* eventResult = [appleScript executeAppleEvent:scriptEvent error:&errorInfo];
//Success?
if (!eventResult) {
if (errorDescription)
*errorDescription = [errorInfo objectForKey:NSAppleScriptErrorMessage];
return NO;
} else {
if (output)
*output = [eventResult stringValue];
return YES;
}
}
只会调用do shell script
中嵌入的AuthorizationExecuteWithPrivileges
StandardAdditions.osax
。
可以想象,with administrator privileges
的{{1}}选项会在do shell script
时消失。
就个人而言,我会继续直接致电AuthorizationExecuteWithPrivileges
。
AuthorizationExecuteWithPrivileges
自动拥有version的优势。这需要一点reaping the process do shell script
。
答案 1 :(得分:2)
代码签名方式真的是从这里开始的唯一途径吗?
据我所知,AuthorizationExecuteWithPrivileges
没有安全的替代方案。
在优胜美地之下仍然可以正常运作。还没有尝试过El Capitan。
如果将来呼叫消失,您可以尝试fail gracefully。
我正试图避免购买开发人员证书,因为它的费用很高。
好吧,如果它有帮助,代码签名证书将有效数年。
我很确定我的开发者帐户会在没有任何问题的情况下失效。
所以每五年基本上99美元。