2011-01-04 12 views
6

Quindi ho bisogno di spostare i file di sistema con NSFileManager nella mia applicazione e non ho l'accesso come root. Quale sarebbe la via più facile per ottenere questo privilegio? Ho esaminato il codice BetterAuthorizationSample fornito da Apple e non mi sembra che avrei potuto fare in modo che NSFileManager eseguisse il proprio compito una volta che l'utente ha ricevuto l'approvazione. Se qualcuno potesse aiutarmi sarebbe fantastico!Cocoa - Gaining Root Access per NSFileManager

Grazie,

Kevin

risposta

3

Aggiornamento: Per aggiornare persone che ancora usano questa risposta per riferimento, BLAuthentication fa uso di un vecchio, e molto unrecommended funzione chiamata AuthorizationExecuteWithPriviledges che, durante il lavoro, va contro la moderno paradigma di sicurezza, ed è deprecato (ed è stato per un po '). Sei ancora autorizzato a utilizzarlo, tecnicamente, ma se stai sviluppando per Mac OS X Lion, sei più che benvenuto nell'utilizzare il framework ServicesManagement, che ti consente di eseguire codice con privilegi come strumento di supporto.

Per informazioni su come creare e avviare uno strumento di supporto privilegiato, dare un'occhiata a una delle mie domande, Writing a Privileged Helper Tool with SMJobBless().


Non c'è un modo semplice per autorizzare vera NSFileManager, così si dovrebbe considerare di usare lo standard mv e cp strumenti eseguiti con l'autenticazione amministratore con la classe BLAuthentication. Sfortunatamente, il sito web dell'autore originale è inattivo, ma puoi trovare facilmente copie della classe che gira su Google (posso anche caricarne una copia se lo desideri).


Con BLAuthentication, ciò che si sta cercando di fare più o meno così:

#define MOVE @"/bin/mv" 
if (![[BLAuthentication sharedInstance] isAuthenticated:MOVE]) { 
    [[BLAuthentication sharedInstance] authenticate:MOVE]; 
} 

NSArray *arguments = [NSArray arrayWithObjects:@"location1", @"location2", nil]; 
[[BLAuthentication sharedInstance] executeCommand:MOVE withArgs:arguments]; 

Il codice qui sopra richiederà all'utente la password dell'amministratore e autenticare il programma per il limite di tempo predefinito di cinque minuti.


ATTENZIONE
naturalmente, essere sempre attenti con i file di sistema! Evita di spostarli o manipolarli quando possibile, specialmente se il tuo programma verrà eseguito sul computer di qualcun altro (se qualcosa va storto, verrai accusato)!

+0

Apprezzo molto il post! Quindi sarei ancora in grado di utilizzare la classe NSFileManager o dovrei usare il comando "mv" da ora in poi? A proposito, sarebbe bello se tu potessi caricarlo per me! Grazie!!!! – lab12

+0

Ok, sono stato in grado di trovare la classe BLAuthentication e ho notato che era del 2001. Funzionerebbe ancora se ha 10 anni? Inoltre, puoi fornire qualsiasi informazione su come implementare la parte NSTask? – lab12

+0

Kevin, per chiarire alcune cose: a) Per i file normali, puoi comunque usare 'NSFileManager', ma per l'accesso root, usa' BLAuthentication' come mostrato sopra. b) Scusa, errore mio; non hai nemmeno bisogno di 'NSTask' (ho dimenticato di aggiornare quella parte della mia risposta insieme al codice, ma ora è stato risolto). Basta usare '-executeCommand: withArgs:' con il percorso del comando (@ "/ bin/cp" o @ "/ bin/mv") per eseguire l'operazione di spostamento/copia.c) Sì, anche se 'BLAuthentication' è * vecchio *, è ancora compilato e funziona perfettamente bene, anche al di sotto di 10.6 (le strutture di sicurezza sono appena cambiate nel tempo). –

Problemi correlati