2012-11-29 9 views
9

Guardando attraverso Mele BetterAuthorizationSample ed ulteriori derivati ​​(http://www.stevestreeting.com/2011/11/25/escalating-privileges-on-mac-os-x-securely-and-without-using-deprecated-methods/) Sto cercando di fare una piccola modifica per l'applicazione e di ottenere una migliore comprensione di tutto il quadro ServiceManagement Security & .. Quindi ho proceduto a aggiungi un pulsante che rimuove il Lavoro installato attraverso l'inverso di SMJobBless - SMJobRemove(). Semplicemente, tuttavia, la chiamata AuthorizationCreate() visualizza una finestra di dialogo che indica e richiede l'autorizzazione per installare un helper e non rimuoverlo.dialogo Autorizzazione Modifica mostrato da AuthorizationCreate()

Questa è la finestra di dialogo che ottengo (utilizzando kSMRightModifySystemDaemons). Come puoi vedere, dice che la mia app tenta di aggiungere un nuovo strumento di supporto. Che confonderà i miei utenti perché l'app tenta effettivamente di rimuovere lo strumento helper installato.

enter image description here

Sto cercando di trovare conoscenza su come questa finestra viene modificata in modo da riflettere la mia azione attuale (rimozione di processo), Ci sono anche diverse altre applicazioni che sembrano personalizzare completamente la finestra di dialogo - che mostrano il proprio personalizzato etichetta e pulsanti ..

BOOL doRemoveSystemTool(NSString* label, NSError** error) 
{ 
BOOL result = NO; 

AuthorizationItem authItem  = { kSMRightModifySystemDaemons, 0, NULL, 0 }; 
AuthorizationRights authRights = { 1, &authItem }; 
AuthorizationFlags flags  = kAuthorizationFlagDefaults    | 
kAuthorizationFlagInteractionAllowed | 
kAuthorizationFlagPreAuthorize   | 
kAuthorizationFlagExtendRights; 

AuthorizationRef authRef = NULL; 
//Obtain authorization 
OSStatus status = AuthorizationCreate(&authRights, kAuthorizationEmptyEnvironment, flags, &authRef); 
if (status != errAuthorizationSuccess) 
{ 
    NSLog(@"Failed to create AuthorizationRef, return code %ld", (long)status); 
} else 
{ 
    //We have authorization so proceed with removing the Job via SMJobRemove 
    result = SMJobRemove(kSMDomainSystemLaunchd, (CFStringRef)label, authRef, YES, (CFErrorRef *)error); 
} 
AuthorizationFree(authRef, kAuthorizationFlagDefaults); 
return result; 
} 

ho sperimentato con l'authItem cambiando kSMRightModifySystemDaemons da kSMRightBlessPrivilegedHelper ma tutto questo fatto è stato cambiare il dialogo per visualizzare 'Add' invece di 'Installa'

Apprezzerei molto l'assistenza qui ...

+1

La soluzione è utilizzare AuthorizationRightSet() per creare un nuovo set di destra in cui l'ultimo parametro (localeTableName) specifica il prompt predefinito, Ancora incerto su come esattamente ottenere il testo del pulsante predefinito, ma almeno il l'etichetta può essere facilmente modificata – DavidMIRV

+0

Se potessi spiegare come uso 'AuthorizationRightSet()' per dare più senso alla finestra di dialogo, premetterei volentieri la taglia ;-) –

+0

Apple ha un esempio qui: https://developer.apple.com /library/mac/technotes/tn2095/_index.html#//apple_ref/doc/uid/DTS10003110-CH1-SECTION7. Aggiunta del diritto a livello di codice "Quando si chiama AuthorizationRightSet con un descriptionKey non NULL, itera su ogni localizzazione nel bundle.Per ogni localizzazione, cerca il file di tabella di localizzazione appropriato e quindi cerca la chiave di descrizione in quella tabella. aggiunge la stringa risultante al dizionario del prompt predefinito nella specifica corretta. " – markhunte

risposta

0

Non l'ho usato prima ma ho trovato la tua domanda interessante quindi ho fatto un po 'di lettura della documentazione di Apple e sulla base di questo mi chiedo se impostare l'ambiente con un kAuthorizationEnvironmentPrompt farebbe quello che vuoi?

From AuthorizationTags.h: 
    The name of the AuthorizationItem that should be passed into the environment 
when specifying a invocation specific additional text. The value should be a 
localized UTF8 string. 

devi creare un AuthorizationItem con questo e poi un AuthorizationItemSet contenente tale, e quindi passare il set nella AuthorizationCreate chiamata per il parametro environment:.

Lo proverei.

L'altra idea che avevo leggere la documentazione era quello di avere uno strumento a riga di comando che fa la rimozione e autorizzare l'esecuzione dello strumento da riga di comando ("SomethingSomethingHelper"), che potrebbe essere meno confusione per l'utente (in modo da utilizzare AuthorizationExecuteWithPrivileges o kAuthorizationRightExecute o qualsiasi altra cosa).

+1

AuthorizationExecuteWithPrivileges = deprecato –

+0

questo è un suggerimento ma nessuna risposta IMO –

+0

@ Daij-Djan Non credo nelle risposte di alimentazione del cucchiaio. Dare una direzione sufficiente per far avanzare qualcuno da solo e impareranno di più. Credo che questo possa dare la risposta, non ho avuto il tempo di scrivere l'app di test. – Dad

Problemi correlati