2016-01-11 14 views
8

Dalla mia applicazione mac, ho bisogno di scrivere un file in \ Libreria \ ColorSync \ Profili. Per questo, l'app ha bisogno del privilegio di amministratore per leggere la scrittura nella cartella. È possibile ottenere lo stesso con l'applicazione? Qualsiasi aiuto sarà apprezzato.Ottenere il privilegio di scrivere un file in Libreria ColorSync Profili in un'applicazione mac

sono in grado di pop-up nella finestra di autorizzazione con il seguente frammento di codice

NSSavePanel *tvarNSSavePanelObj = [NSSavePanel savePanel]; 
[tvarNSSavePanelObj setDirectoryURL:[NSURL URLWithString:@"/Library/ColorSync/Profiles"]]; 

__block NSString *filePathexn = nil; 

[tvarNSSavePanelObj beginSheetModalForWindow:[NSApplication sharedApplication].mainWindow completionHandler:^(NSInteger tvarInt) { 
    if(tvarInt == NSModalResponseOK){ 
     NSURL* tvarUrl = [tvarNSSavePanelObj URL]; 
     NSLog(@"doSaveAs filename = %@",[tvarUrl path]); 
     NSString *filePath = [tvarUrl path]; 
     filePathexn = [filePath stringByAppendingPathExtension:@"rtf"]; 
     OSStatus status; 
     if(![[NSFileManager defaultManager]isWritableFileAtPath:filePath]){ 
      NSLog(@"Not Writable at path"); 
      AuthorizationRef authRef; 
      AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0}; 
      AuthorizationRights rights = {1, &right}; 
      status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagPreAuthorize, &authRef); 
      AuthorizationFlags authFlags = kAuthorizationFlagDefaults | kAuthorizationFlagExtendRights | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize; 
      status = AuthorizationCopyRights(authRef, &rights, kAuthorizationEmptyEnvironment, authFlags, NULL); 
     } 
     BOOL status1 = [[NSFileManager defaultManager]createFileAtPath:filePathexn contents:nil attributes:nil]; 

    } else if(tvarInt == NSModalResponseCancel) { 
     return; 
    } else { 
     NSLog(@"doSave As tvarInt not equal 1 or zero = %3ld",(long)tvarInt); 
     return; 
    } 
}]; 

ho bisogno di sapere come la scrittura di file potrebbe essere fatto. Il file fermo non viene scritto nel percorso. È necessario specificare il nome di uno strumento? Sarà possibile con SMJobless()? Si prega di avvisare una soluzione !!

+0

Non si forniscono informazioni cruciali. –

+0

@ElTomato Ho apportato alcune modifiche. Potresti commentare ora? – iGo

+0

A chi è destinata l'applicazione? Se si intende distribuire la propria applicazione tramite Mac App Store, non sarà consentito all'utente di richiedere l'autenticazione amministrativa. –

risposta

0

Un'altra soluzione che sto postando qui. Ho consultato la guida alla distribuzione di app. Si dice che l'APIS di autorizzazione non è raccomandato per un'app distribuita all'esterno dell'app store. In ogni modo questa soluzione funziona per me, è un piccolo trucco, non lo so. Provo a eseguire l'Apple script form dall'applicazione, che dà pieno privilegio alla cartella (chmod 777 path) e dopo aver terminato il mio compito torna al precedente set di privilegi.

- (void)runapplescript{ 
NSDictionary* errorDict; 
NSAppleEventDescriptor* returnDescriptor = NULL; 
NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource: 
           @"do shell script \"chmod 777 /Library/ColorSync/Profiles\" with administrator privileges"]; 
returnDescriptor = [scriptObject executeAndReturnError: &errorDict]; 

} 
+0

Invece di chmod mv è più preferito. Salva l'elemento in una posizione temporanea e spostalo nella cartella/Libreria /. – iGo

1

Posso suggerire 2 approcci. Un approccio è veloce ma deprecato. Secondo approccio è moderno ma ha bisogno di un po 'di codifica e lettura documentazione:

  1. Hai bisogno di scrivere script bash che farà ciò che è necessario ed eseguirlo con privilegi che verranno concessi utilizzando qualcosa di simile: STPrivilegedTask
  2. Scrivi uno strumento di supporto privilegiato che verrà installato una volta al primo accesso con privilegi di root e potrai eseguire qualsiasi operazione privilegiata How to write privileged helper tool
+0

Ciao, potresti consigliarti con qualche altro dettaglio? Posso utilizzare Attività STPrivillaged nel mio progetto, Funzionerà ora? Se scrivo uno strumento Helper privilegiato posso ottenere i privilegi di root per la mia applicazione? Qualche esempio che hai? Si prega di avvisare – iGo

+0

Dipende da ciò che è necessario implementare. STPrivilegedTask funzionerà per te, ma il tuo codice avrà pochi avvisi sulla deprecazione. Il lato negativo dell'utilizzo di STPrivilegedTask - è ogni volta quando è necessario qualche operazione privilegiata che è necessario richiedere la password dell'utente. Penso che non sia facile da usare. Quindi il mio suggerimento: se questa operazione viene utilizzata raramente e non si ha tempo per il concetto di strumento di ricerca helper, utilizzare STPrivilegedTask. Altrimenti usa lo strumento Aiutante privilegiato. – toohtik

+0

Tuttavia, se si desidera privilegi di amministratore senza AuthorizationExecuteWithPrivileges, è necessario solo uno strumento di supporto privilegiato. – toohtik