2009-09-13 15 views
6

Estoy haciendo una aplicación simple que le permite ingresar rápidamente un comando de shell para ejecutar. Funciona perfectamente, sin embargo, existe el problema de los comandos sudo. Actualmente, detecta un comando sudo, y luego intento que aparezca una ventana de autorización para la contraseña del usuario, exactamente como lo vería en Installer.Elevar a los derechos de administrador en la aplicación Mac

Aquí está el código una vez que se detecta es un comando sudo:

SFAuthorization *authorization = [[SFAuthorization alloc] initWithFlags:kAuthorizationFlagPreAuthorize rights:NULL environment:kAuthorizationEmptyEnvironment]; 
if ([authorization obtainWithRight:"com.mycompany.myapplication" flags:kAuthorizationFlagPreAuthorize error:nil]){ 
    //authorized, now run the command using NSTask. 
}else{ 
    //fail 
} 

Ahora, por lo que yo sé, esto es total y completamente equivocada. Esto es justo lo que reconstruí a partir de la documentación. ¿Algunas ideas?

Respuesta

1

La seguridad es difícil. Podría parafrasear la documentación y proporcionar fragmentos de código, pero probablemente estaría equivocado. Peor aún, incluso si mis descripciones de alto nivel fueran correctas, lo más probable es que haya un pequeño error en los fragmentos de código que mataría la seguridad.

Si se va a meter con la escalada de privilegios, el mejor enfoque es leer los documentos y usar las muestras proporcionadas.

https://developer.apple.com/mac/library/documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html#//apple_ref/doc/uid/TP30000995-CH204-TP1

1

Usted querrá utilizar la función AuthorizationExecuteWithPrivileges, así:

- (IBAction)touch: (id) sender { 

    NSString * filepath = [_filepathfield stringValue]; 
    FILE *commpipe = NULL; 
    OSStatus execstatus; 


    NSLog(@"file path is %@", filepath); 

    char *args[] = {[filepath cString], NULL}; 


    SFAuthorization * authorization = [SFAuthorization authorization]; 

    execstatus = AuthorizationExecuteWithPrivileges([authorization authorizationRef], 
                "/usr/bin/touch", 
                kAuthorizationFlagDefaults, 
                args, 
                &commpipe); 

    if (execstatus == errAuthorizationSuccess) 
    NSlog(@"Toot! It worked"); 
    else 
    NSLog(@"No dice"); 

} 

Dado que BSD es una flor delicada y de mal humor te recomiendo no dejar que un usuario ejecutar comandos arbitrarios de la aplicación como root

/conferencia

El código de su ejemplo es el comienzo del camino a seguir si desea limitar las funciones de su propio programa de ella sus propios usuarios. Por ejemplo, es posible que tenga una aplicación que solo permita que ciertos usuarios modifiquen los datos de un archivo guardado. Entonces crearía una entrada en la base de datos de seguridad 'com.mycompany.LibraryApp.AlterData' y verificará si el usuario tiene ese privilegio cuando intenten cambiar los datos. Pero ese es un tema completamente diferente ...

Espero que ayude, -p.

+0

Pero esto no ejecutará NSTask. ¿Alguna idea sobre cómo ejecutar NSTask usando privilegios? –

1

Sé que es una pregunta muy antigua, pero para aquellos que todavía están buscando una respuesta, aquí va. (Se utiliza AppleScript)

NSAppleScript *script = [[NSAppleScript alloc] initWithSource:@"do shell script \"[YOUR SCRIPT HERE]\" with administrator privileges"]; 

de, por supuesto, sustituya [TU GUIÓN AQUÍ] con su guión, y asegúrese de escapar de la cadena, el camino de cacao.

NSDictionary *errorInfo; 
[script executeAndReturnError:&errorInfo]; 

Para una explicación más detallada, por favor comente.

Cuestiones relacionadas