Какао - получение корневого доступа для NSFileManager - PullRequest
6 голосов
/ 05 января 2011

Мне нужно переместить системные файлы с помощью NSFileManager в моем приложении, и у меня нет прав доступа root.Какой самый простой способ получить эту привилегию?

Я изучил код BetterAuthorizationSample, предоставленный Apple, и мне не кажется, как я мог бы выполнить NSFileManager, выполнив свою задачу, после его одобрения.пользователем.

Ответы [ 2 ]

3 голосов
/ 05 января 2011

Если вашему приложению необходимо использовать привилегии root, используйте API авторизации Apple.

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

3 голосов
/ 05 января 2011

Обновление: Чтобы обновить людей, все еще использующих этот ответ для справки, BLAuthentication использует старую и крайне не рекомендуемую функцию под названием AuthorizationExecuteWithPriviledges, которая, работая, противоречит современной парадигме безопасности и устарел (и был в течение некоторого времени). Вы все еще можете использовать его, технически, но если вы разрабатываете для Mac OS X Lion, вы можете использовать инфраструктуру ServicesManagement, которая позволяет запускать код с привилегиями в качестве вспомогательного инструмента.

Для получения справки о том, как создать и запустить привилегированный вспомогательный инструмент, взгляните на один из моих вопросов: Написание привилегированного вспомогательного инструмента с помощью SMJobBless () .


Реального простого способа авторизации NSFileManager не существует, поэтому вам следует изучить использование стандартных инструментов mv и cp, работающих под аутентификацией администратора с классом BLAuthentication. К сожалению, сайт автора оригинала не работает, но вы можете легко найти копии класса, плавающие в Google (я также могу загрузить копию для вас, если хотите).


С BLAuthentication то, что вы пытаетесь сделать, выглядит примерно так:

#define MOVE @"/bin/mv"
if (![[BLAuthentication sharedInstance] isAuthenticated:MOVE]) {
    [[BLAuthentication sharedInstance] authenticate:MOVE];
}

NSArray *arguments = [NSArray arrayWithObjects:@"location1", @"location2", nil];
[[BLAuthentication sharedInstance] executeCommand:MOVE withArgs:arguments];

Приведенный выше код предложит пользователю ввести пароль администратора и аутентифицирует программу в течение пяти минут по умолчанию.


ПРЕДУПРЕЖДЕНИЕ
Конечно, всегда будьте осторожны с системными файлами! Старайтесь не перемещать и не манипулировать ими, когда это возможно, особенно если ваша программа будет запускаться на чужом компьютере (если что-то пойдет не так, вас обвинят)!

...