2016-01-11 95 views
8

從我的mac應用程序中,我需要將文件寫入\ Library \ ColorSync \ Profiles。爲此,應用程序需要管理員權限才能讀取寫入文件夾。在應用程序中可以得到相同的結果嗎?任何幫助將不勝感激。獲得在Mac應用程序中將文件寫入 Library ColorSync Profiles 的權限

我能彈出對話框的權限與下面的代碼片段

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

我需要知道文件的寫如何才能完成。仍然文件不寫入路徑。是否需要指定任何工具名稱? SMJobless()可以嗎?請提供解決方案!

+0

您沒有提供關鍵信息。 –

+0

@ElTomato我做了一些修改。你現在可以評論嗎? – iGo

+0

您的應用程序適用於誰?如果您打算通過Mac App Store分發您的應用程序,您將不被允許提示用戶進行管理認證。 –

回答

0

另一種解決方案我在這裏發佈。我瀏覽了應用分發指南。有人提到,授權APIS不建議用於在應用商店外部分發的應用。 任何方式這個解決方案爲我工作,這是一個小黑客,我不知道。我嘗試從應用程序中運行蘋果腳本,該文件給予文件夾(chmod 777路徑)的完全特權,並在完成我的任務設置回到先前的特權集之後。

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

而不是chmod mv是更優選的。將項目保存在某個臨時位置,並將其移至/ Library /文件夾。 – iGo

1

我可以推薦2種方法。一種方法很快但不推薦。第二種方法是現代的,但需要一點編碼和閱讀文檔:

  1. 你需要寫的bash腳本,它會做你需要什麼,並與該會使用這樣的事情被授予的權限執行:STPrivilegedTask
  2. 寫特權助手工具,這將在一次以root權限第一次訪問安裝,你就可以做任何特權操作How to write privileged helper tool
+0

嗨,你能否提供一些更詳細的建議?我可以在我的項目中使用STPrivillaged任務嗎?現在可以工作嗎?如果我編寫特權輔助工具,我可以獲得我的應用程序的root權限嗎?你有什麼樣品?請告知 – iGo

+0

這取決於你需要執行什麼。 STPrivilegedTask將爲您工作,但您的代碼幾乎沒有關於棄用的警告。使用STPrivilegedTask的不利方面 - 每次您需要某些特權操作時,您都需要用戶請求密碼。我認爲它不是用戶友好的。所以我的建議 - 如果這個操作很少使用,並且您沒有時間研究幫助工具概念 - 請使用STPrivilegedTask。否則使用特權輔助工具。 – toohtik

+0

但請注意,如果您想要沒有AuthorizationExecuteWithPrivileges的管理員權限,您只需要特權輔助工具。 – toohtik

相關問題