我们有一个 Windows 应用程序,其中包含一个写入 ProgramData 文件夹的组件。运行卸载程序时,不会删除该组件生成的文件。使用UAC::RunElevated,我们首先将第三方组件安装到ProgramData
SetOutPath "$RENDERER_INSTALL_DIR"
LogSet On
File /r "${MAGNIFY_DIR}/secRenderer/Arelle/*"
LogSet Off
AccessControl::GrantOnFile "$RENDERER_INSTALL_DIR" "(S-1-5-32-545)" "FullAccess"
在操作期间,该组件会写入 ProgramData 中其自己的安装目录
在卸载过程中,我们尝试再次使用 UAC::RunElevated 删除上面创建的文件夹
RMDir /r $RENDERER_INSTALL_DIR
但是,通过操作该组件创建的文件不会被删除。
我们观察到这些文件归使用该组件的用户所有,而不是管理员所有,但管理员拥有完全的读取、写入和删除权限。
我们如何实现这一目标?
最佳答案
这里有两个未知数来真正回答这个问题。
为什么会涉及UAC插件?它仅对降低您的系统访问权限有用!正确使用它也很棘手,所以我建议您尝试不使用它。
此第 3 方组件是否会更改 ACL?卸载前检查 ACL。
有没有可能file system virtualization是在骗你吗?检查 VirtualStore 文件夹。
Process Monitor 是什么意思?说?您是否收到 ACCESS_DENIED 或其他错误?
不建议向所有用户授予对 ProgramData 下文件夹的完全访问权限,并且任何需要此权限的组件都不遵循 Windows Logo 准则。
关于windows - NSIS RMDir 无法删除 ProgramData 中用户创建的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40105024/