Halp! Я пишу внутреннее приложение macOS для наших ИТ-специалистов для выполнения некоторых специфичных для организации задач, а также добавляю несколько ярлыков для простых, но общих задач, которые они выполняют. Одной из таких задач является переименование пользователя при миграции между доменами. Это приложение имеет доступ к привилегированному помощнику (через SMjobBless
) для выполнения большинства задач. Однако, похоже, что этот вспомогательный инструмент, несмотря на свой привилегированный контекст выполнения, не может переименовать домашний каталог пользователя.
Моя первая попытка реализовать эту конкретную задачу в помощнике состояла в том, чтобы запустить короткий сценарий оболочки через Process()
(метод, успешно используемый для десятков других задач в этом помощнике).
let script = """
set -e
mv '\(homeDirPath)' /Users/\(toUsername)
dscl . -change /Users/\(fromUsername) NFSHomeDirectory '\(homeDirPath)' '/Users/\(toUsername)'
dscl . -change /Users/\(fromUsername) RecordName \(fromUsername) \(toUsername)
"""
Я получаю следующий вывод на stderr (/Users/newname
подтверждено, что он не существует):
mv: rename /Users/oldname to /Users/newname: Operation not permitted
Попытка выполнить это как пользователь без полномочий root приводит к другой ошибке: mv: rename /Users/oldname to /Users/newname: Permission denied
Хорошо, странно. Добавьте whoami
в начало скрипта, чтобы дважды проверить пользовательский контекст: root
. Ну ... интересно. Wth, я могу сделать это просто отлично с помощью sudo
в моей сессии пользователя.
Затем я пытаюсь использовать FileManager, думая, что могут быть некоторые SIP-помехи или песочница для дочерних процессов launchdaemon (несмотря на то, что я не могу найти никаких документов, которые говорят это), но я все еще получаю ошибку - но более многословно на этот раз:
Error: “oldname” couldn’t be moved because you don’t have permission to access “Users”
.
Я пытался найти документацию для ограничения, с которым я столкнулся, но я в растерянности. Похоже, что каталог не находится под защитой SIP, и я не могу найти никаких документов для песочницы демона за пределами магазина приложений (в родительском приложении не включена функция песочницы приложения). Кто-нибудь может указать мне правильное направление?
Обновление: Защита конфиденциальности 10.14 не влияет на нее. Добавление помощника в «Полный доступ к диску» не разрешается. Возможно, я добавляю помощника неправильно: пришлось изменить цель сборки на 10.14 (что будет проблемой), затем перетащить двоичный файл помощника из пакета приложения в список. Я не могу добавить его из /Library/PrivilegedHelperTools/
- он выделен серым цветом как опция для добавления.
Обновление 2: Исправление, похоже, связано с FDA. iTerm был в списке FDA. Удаляя его, он выбрасывает Operation not permitted
, затем добавляя его обратно, разрешается. Итак, я сейчас пытаюсь понять, как правильно добавить помощника в список FDA.