2015-07-10 20 views
10

顯然,從10.7開始,AuthorizationExecuteWithPrivileges已被棄用。我收集的信息的一般要點似乎建議使用ServiceManagement.frameworkSMJobBless()函數來部署輔助應用程序。要求用戶提升特權並在沒有Apple開發人員證書的情況下提升應用程序

雖然我的理解是,這需要從Apple購買開發人員證書來爲我的應用程序和幫助程序進行代碼簽名 - 否則這將無法工作。它是否正確?

我最初使用AuthorizationExecuteWithPrivileges來要求用戶提升權限,因爲他們需要訪問另一個正在運行的進程。沒有這一點,我的應用程序不能作爲它打算的非官方插件工作。代碼簽名方式真的是唯一的途徑嗎?我試圖避免購買開發者證書,因爲它的成本很高。

有沒有人找到任何替代方法來重新啓動具有提升權限的應用程序,當然用戶權限?

回答

2

代碼簽名的方式真的是唯一的途徑嗎?

據我所知,沒有安全的替代AuthorizationExecuteWithPrivileges

在優勝美地裏它仍然可以正常工作。還沒有嘗試過El Capitan。

如果通話在將來消失,您可以嘗試撥打fail gracefully

我試圖避免購買開發者證書,因爲它的純粹成本。

那麼,如果它有幫助,代碼簽名證書將有效幾年。

我很確定我已經讓我的開發者帳戶沒有任何問題失效。

所以它基本上是每五年99美元。

+0

我仍然在尋找是否有選項不需要Apple的授權/購買許可證,但是要感謝關於如何在「最壞情況」情況下優雅地失敗的示例!有趣的是看看那裏是如何處理的! – Tiago

+0

@loco你可能已經看到了這個,但[你可以使用Applescript](https://stackoverflow.com/questions/6841937/authorizationexecutewithprivileges-is-deprecated)。如果你走這條路線,確保你使用'quoted form'來[清理可執行文件路徑和參數](https://developer.apple.com/library/mac/technotes/tn2065/_index.html#//apple_ref/DOC/UID/DTS10003093-CH1-SECTION3)。 – 2015-07-23 02:19:32

3

@CarlosP's answer與代碼逃脫路徑&參數:

- (BOOL)runProcessAsAdministrator:(NSString*)scriptPath 
        withArguments:(NSArray*)arguments 
          output:(NSString**)output 
       errorDescription:(NSString**)errorDescription { 

    //Check path. 
    if (![scriptPath hasPrefix:@"/"]) { 
     @throw [NSException exceptionWithName: 
        NSInvalidArgumentException reason:@"Absolute path required." userInfo:nil]; 
    } 

    //Define script. 
    static NSAppleScript* appleScript = nil; 
    if (!appleScript) { 
     appleScript = [[NSAppleScript alloc] initWithSource: 
      @"on run commandWithArguments\n" 
      " activate\n" 
      " repeat with currentArgument in commandWithArguments\n" 
      "  set contents of currentArgument to quoted form of currentArgument\n" 
      " end repeat\n" 
      " set AppleScript's text item delimiters to space\n" 
      " return do shell script (commandWithArguments as text) with administrator privileges\n" 
      "end run"]; 
    } 

    //Set command. 
    NSAppleEventDescriptor* commandWithArguments = [NSAppleEventDescriptor listDescriptor]; 
    [commandWithArguments insertDescriptor: 
     [NSAppleEventDescriptor descriptorWithString:scriptPath] atIndex:0]; 

    //Set arguments. 
    for (NSString* currentArgument in arguments) { 
     [commandWithArguments insertDescriptor: 
      [NSAppleEventDescriptor descriptorWithString:currentArgument] atIndex:0]; 
    } 

    //Create target & event. 
    ProcessSerialNumber  processSerial = {0, kCurrentProcess}; 
    NSAppleEventDescriptor* scriptTarget = 
     [NSAppleEventDescriptor descriptorWithDescriptorType:typeProcessSerialNumber bytes:&processSerial length:sizeof(ProcessSerialNumber)]; 
    NSAppleEventDescriptor* scriptEvent  = 
     [NSAppleEventDescriptor appleEventWithEventClass:kCoreEventClass 
               eventID:kAEOpenApplication 
             targetDescriptor:scriptTarget 
               returnID:kAutoGenerateReturnID 
              transactionID:kAnyTransactionID]; 
    [scriptEvent setParamDescriptor:commandWithArguments forKeyword:keyDirectObject]; 

    //Run script. 
    NSDictionary*   errorInfo = [NSDictionary dictionary]; 
    NSAppleEventDescriptor* eventResult = [appleScript executeAppleEvent:scriptEvent error:&errorInfo]; 

    //Success? 
    if (!eventResult) { 
     if (errorDescription) 
      *errorDescription = [errorInfo objectForKey:NSAppleScriptErrorMessage]; 
     return NO; 
    } else { 
     if (output) 
      *output = [eventResult stringValue]; 
     return YES; 
    } 

} 

更新

在優山美地,do shell script只是調用的AuthorizationExecuteWithPrivileges一個version嵌入StandardAdditions.osax

可以想象,的with administrator privileges選項將在AuthorizationExecuteWithPrivileges時消失。

個人而言,我會直接繼續撥打AuthorizationExecuteWithPrivileges

do shell script自動具有reaping the process的優勢。這需要一些extra workAuthorizationExecuteWithPrivileges

+0

感謝@null,我並不完全確定使用這種方法重新啓動具有提升權限的應用程序的可行性。這不是理想的,因爲它是一個hacky applescript方法 - 但是如果它起作用,它就會起作用。我會嘗試一下,手指交叉。 – Tiago

+0

@loco對不起,完全錯過了你的問題的「重新啓動」部分。要做到這一點,[你需要做一些調整](https://developer.apple.com/library/mac/technotes/tn2065/_index.html#//apple_ref/doc/uid/DTS10003093-CH1-SECTION5) 。所以,像''使用管理員權限'執行shell腳本(commandWithArguments作爲文本)&「&>/dev/null&」。我相信你已經調查了以root身份啓動一個GUI應用程序的所有含義 - 我今天第一次玩這個遊戲。 – 2015-07-29 00:50:54

相關問題