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.
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 ...
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
Se potessi spiegare come uso 'AuthorizationRightSet()' per dare più senso alla finestra di dialogo, premetterei volentieri la taglia ;-) –
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