2015-07-10 17 views
10

Offenbar ist ab dem 10.7, AuthorizationExecuteWithPrivileges veraltet. Der allgemeine Kern der Informationen, die ich zu diesem Thema gesammelt habe, scheint die Verwendung der SMJobBless() Funktion, um eine Hilfsanwendung bereitgestellt zu haben.Einen Benutzer nach erhöhten Rechten fragen und die Anwendung ohne ein Apple-Entwicklerzertifikat erhöhen

Mein Verständnis davon, ist, dass dies ein Entwicklerzertifikat von Apple gekauft werden muss, um sowohl meine Anwendung als auch den Hilfsprozess zu signieren - oder das wird nicht funktionieren. Ist das richtig?

Ich habe ursprünglich AuthorizationExecuteWithPrivileges verwendet, um einen Benutzer nach erhöhten Rechten zu fragen, da sie für den Zugriff auf einen anderen laufenden Prozess benötigt werden. Ohne das kann meine App nicht als inoffizielles Plugin funktionieren. Ist der Code-Signing-Weg wirklich der einzige Weg von hier aus? Ich versuche, den Kauf eines Entwicklerzertifikats aufgrund der reinen Kosten zu vermeiden.

Hat jemand alternative Möglichkeiten gefunden, eine Anwendung mit erhöhten Rechten neu zu starten, mit Benutzerberechtigung natürlich?

Antwort

2

Ist der Code Signing Weg wirklich der einzige Weg, um von hier aus zu gehen?

Nach meinem Wissen gibt es keine sichere Alternative zu AuthorizationExecuteWithPrivileges.

Es funktioniert immer noch gut unter Yosemite. Habe El Capitan noch nicht ausprobiert.

Sie können versuchen, fail gracefully, wenn der Anruf in Zukunft weggeht.

Ich versuche zu vermeiden, ein Entwicklerzertifikat aufgrund der reinen Kosten zu kaufen.

Nun, wenn es hilft, wird das Code-Signing-Zertifikat für mehrere Jahre gültig sein.

Ich bin mir ziemlich sicher, dass ich mein Entwicklerkonto ohne Probleme verfallen lassen habe.

Also es ist im Grunde $ 99 alle fünf Jahre.

+0

Ich bin immer noch auf der Suche, ob es Optionen gibt, die keine Lizenzierung von Apple erfordern, aber danke für den Hinweis auf ein Beispiel, wie man in einem "Worst Case" -Szenario vernünftig scheitert! Interessant zu sehen, wie das dort gehandhabt wird! – Tiago

+0

@loco Sie haben das wahrscheinlich schon gesehen, aber [Sie können Applescript verwenden (https://stackoverflow.com/questions/6841937/authorizationexecutewithprivileges-is-deprecated). Wenn Sie diesen Weg gehen, stellen Sie sicher, dass Sie 'quoted form 'verwenden, um [den Pfad und die Argumente der ausführbaren Datei zu bereinigen] (https://developer.apple.com/library/mac/technotes/tn2065/_index.html#//apple_ref/doc/uid/DTS10003093-CH1-ABSCHNITT3). –

3

@CarlosP's answer mit Code den Pfad & Argumente zu entkommen:

- (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; 
    } 

} 

aktualisieren

In Yosemite, do shell script nur version von AuthorizationExecuteWithPrivileges in StandardAdditions.osax eingebettet nennt.

Es ist denkbar, dass die Option with administrator privileges für do shell script verschwindet, wenn AuthorizationExecuteWithPrivileges tut.

Persönlich würde ich einfach AuthorizationExecuteWithPrivileges direkt weiter anrufen.

do shell script hat den Vorteil von reaping the process automatisch. Das erfordert ein wenig extra work mit AuthorizationExecuteWithPrivileges.

+0

Dank @null, ich war mir nicht ganz sicher über die Möglichkeit, dies zu verwenden, um die Anwendung mit erhöhten Privilegien neu zu starten. Es ist nicht ideal, da es ein hacky applescript Ansatz ist - aber wenn es funktioniert, funktioniert es. Ich werde es ausprobieren, Daumen drücken. – Tiago

+0

@loco Sorry, den "Relaunch" -Teil Ihrer Frage komplett verpasst. Um dies zu tun, [benötigen Sie ein paar Verbesserungen] (https://developer.apple.com/library/mac/technotes/tn2065/_index.html#//apple_ref/doc/uid/DTS10003093-CH1-SECTION5) . So etwas wie 'tun Shell-Skript (commandWithArguments als Text) & '&>/dev/null &" mit Administratorrechten ". Ich vertraue darauf, dass Sie alle Auswirkungen des Startens einer GUI-Anwendung als root untersucht haben - ich habe heute zum ersten Mal damit gespielt. –