Sobre la base de un gran hallazgo por user950473 he implementado su/su descubrimiento como un método; pensé en compartir el código en caso de que fuera útil.
- (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;
}
}
Ejemplo de uso:
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
}
Es muy ligeramente hacky, pero en mi humilde opinión es una solución satisfactoria.
Hola, gracias por la respuesta. Si AuthorizationExecuteWithPrivileges() ha quedado obsoleto durante mucho tiempo, ¿debería seguir funcionando? Básicamente, esto dejó de funcionar en mi aplicación desde la actualización de Lion, y supuse que era porque ahora se está marcando como obsoleta ... ¿Debería funcionar de hecho, y mi problema está en otra parte? Muchas gracias – Phill
No debe confiar en 'AuthorizationExecuteWithPrivileges()', es un agujero de seguridad horrendo. La forma de hacer lo que quiere hacer es con 'SMJobBless()'. –
@GrahamLee ¿Y qué hay de usar 'AuthorizationExecuteWithPrivileges' para el instalador? La referencia dice que "debe usar esta función solo para permitir que los instaladores se ejecuten como root y para permitir que una herramienta setuid repare su bit de setuid si se pierde" y la Guía de programación de servicios de autorización sugiere usar esta función para iniciar instaladores (aunque algo desactualizado) . ¿Hay alguna alternativa para iniciar el instalador en aplicaciones simples como la herramienta de línea de comandos? – cody