2011-01-04 10 views
6

Also muss ich Systemdateien mit NSFileManager in meiner Anwendung verschieben, und ich habe keinen Root-Zugriff. Was wäre der einfachste Weg, dieses Privileg zu erlangen? Ich habe in den BetterAuthorizationSample-Code von Apple geschaut, und ich sehe nicht aus, wie ich den NSFileManager seine Aufgabe ausführen lassen könnte, sobald er vom Benutzer genehmigt wurde. Wenn mir jemand helfen könnte, wäre das großartig!Cocoa - Erhalten von Root-Zugriff für NSFileManager

Danke,

Kevin

Antwort

3

Update: Menschen immer noch diese Antwort als Referenz verwenden zu aktualisieren, macht BLAuthentication Verwendung einer alten und hoch unrecommended Funktion aufgerufen AuthorizationExecuteWithPriviledges, die während der Arbeit, die sich gegen modernes Sicherheitsparadigma, und ist veraltet (und ist seit einer Weile). Sie können es immer noch technisch verwenden, aber wenn Sie für Mac OS X Lion entwickeln, können Sie das ServicesManagement-Framework, mit dem Sie Code mit Privilegien als Hilfsprogramm ausführen können, sehr gerne verwenden.

Für eine Referenz zum Erstellen und Starten eines privilegierten Hilfswerkzeugs, werfen Sie einen Blick auf eine meiner Fragen, Writing a Privileged Helper Tool with SMJobBless().


Es gibt keine wirkliche einfache Möglichkeit, NSFileManager zu genehmigen, so dass Sie in mit dem Standard mv und cp Tool liefen unter Administrator-Authentifizierung mit der BLAuthentication Klasse aussehen sollten. Leider ist die Website des ursprünglichen Autors nicht verfügbar, aber Sie können leicht Kopien der Klasse finden, die auf Google herumschwebt (ich kann auch eine Kopie für Sie hochladen, wenn Sie möchten).


Mit BLAuthentication, was Sie versuchen, etwas zu tun geht:

#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]; 

Der obige Code den Benutzer für das Kennwort des Administrators fordert und das Programm für den Standardzeitlimit von fünf authentifizieren Protokoll.


WARNUNG
Natürlich werden immer vorsichtig mit Systemdateien! Vermeiden Sie es, sie zu bewegen oder zu manipulieren, wenn dies möglich ist, besonders wenn Ihr Programm auf dem Computer eines anderen Computers läuft (wenn etwas schief geht, werden Sie dafür verantwortlich gemacht)!

+0

Ich schätze die Post! Könnte ich die NSFileManager-Klasse noch verwenden oder müsste ich ab jetzt den Befehl "mv" verwenden? Es wäre übrigens großartig, wenn Sie es für mich hochladen könnten! Vielen Dank!!!! – lab12

+0

Okay, so konnte ich die BLAuthentication-Klasse finden und bemerkte, dass sie aus dem Jahr 2001 stammte. Würde es noch funktionieren, wenn es ein Jahrzehnt alt wäre? Kannst du mir auch Informationen geben, wie ich den NSTask Teil implementieren würde? – lab12

+0

Kevin, um einige Dinge zu klären: a) Für normale Dateien kann man immer noch 'NSFileManager' verwenden, aber für den root-Zugriff, verwende 'BLAuthentication' wie oben gezeigt. b) Entschuldigung, mein Fehler; Sie brauchen nicht einmal 'NSTask' (Ich habe vergessen, diesen Teil meiner Antwort zusammen mit dem Code zu aktualisieren, aber jetzt ist es behoben). Verwenden Sie '-executeCommand: withArgs:' mit dem Pfad zum Befehl (@ "/ bin/cp" oder @ "/ bin/mv"), um den Verschiebe-/Kopiervorgang auszuführen.c) Ja, obwohl "BLAuthentication" * alt * ist, kompiliert es noch und läuft perfekt, sogar unter 10,6 (die Sicherheitsframeworks haben sich im Laufe der Zeit kaum verändert). –