Swift macOS特权助手不';您不能访问文件系统路径吗?

Swift macOS特权助手不';您不能访问文件系统路径吗?,swift,macos,cocoa,launchd,Swift,Macos,Cocoa,Launchd,停!我正在为我们的IT员工编写一个内部macOS应用程序,以执行一些特定于组织的任务,并为他们执行的简单但常见的任务添加一些快捷方式。其中一项任务是在域之间迁移时重命名用户。此应用程序有一个特权助手(通过smjobbles)来执行大多数任务。但是,尽管有特权执行上下文,该帮助器工具似乎无法重命名用户的主目录 我在助手中实现此特定任务的第一次尝试是通过Process()运行一个简短的shell脚本(该技术成功地用于此助手中的许多其他任务) let script=”“” set-e mv'\(hom

停!我正在为我们的IT员工编写一个内部macOS应用程序,以执行一些特定于组织的任务,并为他们执行的简单但常见的任务添加一些快捷方式。其中一项任务是在域之间迁移时重命名用户。此应用程序有一个特权助手(通过
smjobbles
)来执行大多数任务。但是,尽管有特权执行上下文,该帮助器工具似乎无法重命名用户的主目录

我在助手中实现此特定任务的第一次尝试是通过
Process()
运行一个简短的shell脚本(该技术成功地用于此助手中的许多其他任务)

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:不允许操作

以非root用户身份尝试此操作会出现不同的错误:
mv:rename/Users/oldname to/Users/newname:Permission denied

好吧,奇怪。将
whoami
添加到脚本顶部,以仔细检查用户上下文:
root
。好。。。有趣。而且,在我的用户会话中,我可以通过
sudo
很好地做到这一点

然后我尝试使用FileManager,认为launchdaemon的子进程可能存在一些SIP干扰或沙盒(尽管没有找到任何说明这一点的文档),但我仍然收到一个错误-但这次更详细:

错误:“oldname”无法移动,因为您没有访问“用户”的权限。

我已经尝试过搜索文档,查找我遇到的任何限制,但我不知所措。该目录似乎不在SIP的保护之下,并且我在应用商店之外找不到任何用于守护程序沙盒的文档(父应用没有启用应用程序沙盒功能)。谁能给我指出正确的方向吗

更新:它似乎不受10.14隐私保护的影响。将帮助程序添加到“完整磁盘访问”无法解决此问题。也许我添加的助手不正确:必须将构建目标更改为10.14(这将是一个问题),然后将应用程序包中的助手二进制文件拖到列表中。我无法从
/Library/PrivilegedHelperTools/
添加它-它作为添加选项变灰


更新2:更正,它似乎与FDA有关。iTerm在FDA的名单中。删除它会导致它抛出
不允许的操作
,然后将其添加回即可解决此问题。因此,我现在正在研究如何正确地将助手添加到FDA列表中。

好的,已经证实——Mojave的隐私保护甚至适用于特权工具。解决方案是让所有人都可以执行helper二进制文件,这样就可以将其添加到完整的磁盘访问表中

希望这能帮助那些对自己所看到的东西感到困惑的人


希望苹果能为用户提供一种标准化的、更简单的方法,允许用户访问助手。

好的,这一点已经得到证实——莫哈韦的隐私保护甚至适用于特权工具。解决方案是让所有人都可以执行helper二进制文件,这样就可以将其添加到完整的磁盘访问表中

希望这能帮助那些对自己所看到的东西感到困惑的人


希望苹果能为用户提供一种标准化的、更简单的方法,让他们可以访问助手。

我相信
mv
命令会在没有警告的情况下拒绝删除目标项目。使用
-f
选项覆盖此选项。我怀疑
mv
想要提示用户在替换时回答
y
n
问题,但由于您没有运行交互式shell,因此不能。当您以普通用户的身份运行这些命令时,
mv
会导致您在替换目标之前没有更改
/Users
的权限。要调试它,请将命令写入可执行脚本文件(我非常喜欢使用
#!/bin/bash-vx
进行调试),然后通过
sudo
运行脚本,直到它工作为止。对于此任务,如果目标存在,我实际上希望
mv
失败,这就是我将其关闭的原因。不过,我确实尝试添加了
-f
强制标志,看看它是否有什么不同(它没有),但我也确信我正在测试的目标目录并不存在。好吧,这只是一个猜测,值得你为此付出每一分钱。;)但是使用
sudo
以root身份测试脚本可能有助于隔离问题。您绝对不能将
/Users
中的某个内容重命名为普通用户,因此作为普通用户尝试的任何操作都不会使您更接近解决方案。HTHI认为
mv
命令将在没有警告的情况下拒绝删除目标项目。使用
-f
选项覆盖此选项。我怀疑
mv
想要提示用户在替换时回答
y
n
问题,但由于您没有运行交互式shell,因此不能。当您以普通用户的身份运行这些命令时,
mv
会导致您在替换目标之前没有更改
/Users
的权限。要调试它,请将命令写入可执行脚本文件(我非常喜欢使用
#!/bin/bash-vx
进行调试),并通过
sudo
运行脚本,直到它工作为止。对于此任务,我实际上希望
mv
在目标存在的情况下失败,因为目标存在