2012-07-28 5 views
6

Ho letto la documentazione e l'esempio SMJobBless e varie discussioni su Internet. La mia app ora installa un helper con privilegi usando SMJobBless(), ma l'helper non viene eseguito affatto.È possibile utilizzare SMJobSubmit() per eseguire un helper privilegiato installato da SMJobBless?

L'intero scopo dell'helper è caricare un kext, un componente importante della mia app, ogni volta che si avvia l'applicazione. Ho visto esempi che dimostrano che il tentativo di connettersi con l'helper attraverso XPC lancerà l'aiutante, ma vorrei mantenere il mio aiutante semplice e stupido.

Il documento API mostra che esiste una funzione SMJobSubmit(). Cosa fa esattamente? Posso usarlo per avviare l'helper privilegiato installato in precedenza da SMJobBless()?

Sono confuso da tutti i termini intorno a launchd e allo Service Management Framework - ad esempio, l'opzione plist "RunAtLoad" controlla "se il lavoro viene avviato una volta al momento del caricamento del lavoro". Che cosa sono esattamente "caricare" e "lanciare" e in che modo sono correlati a "benedica/installa" e "invia"?

risposta

9

SMJobBless aggiungerà il lavoro al sistema di launchd. Vedere il codice di esempio SMJobBless per farlo.

http://developer.apple.com/library/mac/#samplecode/SMJobBless/Introduction/Intro.html

Tuttavia, l'intero scopo di launchd è quello di controllare come e quando i lavori vengono lanciati, e per impostazione predefinita (nel codice di esempio), non v'è alcuna specificazione di realtà quando dovrebbe essere avviato il lavoro, quindi il lavoro non verrà mai lanciato.

Nathan de Vries ha scritto un ottimo articolo e codice di esempio per l'utilizzo di SBJobBless e la comunicazione con il lavoro privilegiato tramite XPC. Un aspetto del lato dell'importazione è, naturalmente, che l'atto di provare a comunicare con il servizio launchd farà sì che launchd avvii effettivamente il tuo servizio, quindi questo risolverebbe il tuo problema.

http://atnan.com/blog/2012/02/29/modern-privileged-helper-tools-using-smjobbless-plus-xpc/

E per rispondere specificamente alla tua domanda, SMJobSubmit può eseguire un aiutante privilegiata. Mi ci è voluto molto tempo per capire, ma la differenza tra i due è che SMJobSubmit ti permetterà di eseguire un eseguibile con privilegi usando launchd, mentre SMJobBless aggiungerà un LaunchDaemon in modo permanente. L'eseguibile installato di SMJobBless rimarrà benedetto, mentre SMJobSubmit richiederà di essere nuovamente autenticati ogni volta.

Si noti che in entrambi i casi è necessario SMJobRimuovere quello precedente per garantire che venga utilizzata una nuova versione.

Quindi, vorrei che tu abbia bisogno di uno:

  • SMJobRemove, SMJobSubmit ogni volta che si avvia l'applicazione, spingendo l'utente per l'autenticazione ogni volta. Usa la proprietà RunAtLoad nel dizionario che hai creato per far eseguire immediatamente l'helper.

O

  • codice Usa Nathan, XPC collegare, le chiede il suo numero di versione, se non l'aggiornamento, l'hanno rinunciato, poi SMJobRemove, SMJobBless una nuova versione, quindi XPC collegarsi e chiedere a installa il tuo kext. In questo modo l'utente deve solo autenticarsi per qualsiasi nuova versione.
+1

Il post di questo post su questo argomento include codice di esempio e ulteriori informazioni su SMJobSubmit: http://www.stairways.com/blog/2012-08-06-smjobsubmit –

+0

Come sembra sapere qualcosa, potrebbe date un'occhiata a http://stackoverflow.com/questions/11557026/smjobremove-sotteeds-but-plist-and-helper-tool-not-deleted? – Joe