NSIS RMDir 无法删除用户在 ProgramData 中创建的文件
NSIS RMDir failing to delete user created files in ProgramData
我们有一个 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 徽标指南。
我们有一个 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 徽标指南。