Повышение прав администратора в приложении Mac - PullRequest
6 голосов
/ 13 сентября 2009

Я делаю простое приложение, которое позволяет быстро вводить команду оболочки для запуска. Это работает отлично, однако есть проблема команд sudo. В настоящее время он обнаруживает команду sudo, а затем я пытаюсь заставить ее вызвать окно авторизации для пароля пользователя, точно так же, как вы видели бы в Installer.

Вот код, когда он обнаруживает, что это команда sudo:

SFAuthorization *authorization = [[SFAuthorization alloc] initWithFlags:kAuthorizationFlagPreAuthorize rights:NULL environment:kAuthorizationEmptyEnvironment];
if ([authorization obtainWithRight:"com.mycompany.myapplication" flags:kAuthorizationFlagPreAuthorize error:nil]){
    //authorized, now run the command using NSTask.
}else{
    //fail
}

Теперь, насколько я знаю, это совершенно и совершенно неправильно. Это как раз то, что я собрал из документации. Есть идеи?

Ответы [ 3 ]

1 голос
/ 04 октября 2009

Вы захотите использовать функцию AuthorizationExecuteWithPrivileges, например:

- (IBAction)touch: (id) sender {

  NSString * filepath = [_filepathfield stringValue];
  FILE *commpipe = NULL;
  OSStatus execstatus;


  NSLog(@"file path is %@", filepath);

  char *args[] = {[filepath cString], NULL};


  SFAuthorization * authorization = [SFAuthorization authorization];

  execstatus = AuthorizationExecuteWithPrivileges([authorization authorizationRef],
                                                  "/usr/bin/touch",
                                                  kAuthorizationFlagDefaults,
                                                  args,
                                                  &commpipe);

  if (execstatus == errAuthorizationSuccess) 
    NSlog(@"Toot! It worked");
  else
    NSLog(@"No dice");

}

Учитывая, что BSD - тонкий и раздражительный цветок, я бы рекомендовал не разрешать пользователю выполнять произвольные команды из приложения от имени пользователя root.

/ лекция

Код из вашего примера - это начало пути, если вы хотите ограничить функции своей собственной программы от своих собственных пользователей. Например, у вас может быть приложение, которое позволяет только определенным пользователям изменять данные из сохраненного файла. Таким образом, вы должны создать запись в базе данных безопасности «com.mycompany.LibraryApp.AlterData» и проверить, есть ли у пользователя эта привилегия при попытке изменить данные. Но это совсем другая тема ...

Надеюсь, это поможет, -p.

1 голос
/ 15 июня 2013

Я знаю, что это действительно старый вопрос, но для тех, кто все еще ищет ответ, здесь идет речь. (Использует AppleScript)

NSAppleScript *script = [[NSAppleScript alloc] initWithSource:@"do shell script \"[YOUR SCRIPT HERE]\" with administrator privileges"];

Конечно, замените [ВАШ СЦЕНАРИЙ ЗДЕСЬ] на ваш сценарий и обязательно избегайте строки, как какао.

NSDictionary *errorInfo;
[script executeAndReturnError:&errorInfo];

Для более подробного объяснения, пожалуйста, прокомментируйте.

1 голос
/ 13 сентября 2009

Безопасность это сложно. Я мог бы перефразировать документацию и предоставить фрагменты кода, но я, вероятно, был бы неправ. Хуже того, даже если мои высокоуровневые описания были верны, в фрагментах кода, скорее всего, будет небольшая ошибка, которая убьет безопасность.

Если вы собираетесь возиться с повышением привилегий, лучше всего прочитать документы и использовать предоставленные образцы.

https://developer.apple.com/mac/library/documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html#//apple_ref/doc/uid/TP30000995-CH204-TP1

...