UAC, requireadadministrator和文件访问
UAC, requireAdministrator and files access
我在Vista/7上有一个UAC问题。我的UAC执行级别= requireadadministrator安装并运行我的应用程序。应用程序UAC执行级别= asInvoker。安装程序第一次运行时,它以管理员身份运行。然后,应用程序创建一些文件来存储自我状态。以后——如果应用程序是由用户启动的,而不是作为管理员启动的——应用程序只能从创建的文件中读取,但不能覆盖它们。我试图在应用程序清单中禁用UAC,或者在没有清单的情况下构建应用程序,但结果仍然相同——当应用程序以管理员身份运行时创建的每个文件在应用程序作为用户运行时不能被覆盖。我尝试了一些其他的安装程序,如Inno Setup,但没有像我的问题…所以我的问题是,为什么会发生在我身上,如何解决?谢谢。
注:重要的笔记1. 实际上它不是安装程序。这是更新主应用程序可执行文件的实用工具。主应用程序检查服务器是否有更新,如果有的话——将更新下载到临时文件夹,然后以更高的权限启动实用程序(http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx),以便替换Program Files文件夹中的可执行文件。主应用程序在启动实用程序后立即终止。2. 应用程序存储在ProgramDatamyAppName文件夹中的所有文件
您是仅为当前用户安装应用程序还是为计算机上的所有用户安装应用程序?
对于每个用户安装,安装程序在用户的AppData文件夹中创建初始应用程序状态是有意义的。MSI运行每用户安装NON-elevated,所以应用程序无法修改AppData文件夹中的文件没有问题。
对于每台机器安装,将任何东西放在特定用户的AppData文件夹或用户配置文件位置下的任何地方是没有意义的。新用户可以在安装应用程序后登录机器,那里不会有任何东西。
也就是说,你有三个解决方案(实际上是两个解决方案和一个hack):- 使用每个用户安装。设置ALLUSERS=2, MSIINSTALLPERUSER=1。您的MSI将在非升高状态下运行。MSI可以自由地将任何状态文件放在AppData文件夹中。
- 使用单机安装。不要写入用户的appdata。相反,将初始状态文件写入%ALLUSERSPROFILE%。它们对应用程序是只读的。修改应用程序,在首次运行时将初始状态从%ALLUSERPROFILE%复制到当前用户配置文件。
- 在安装程序中添加自定义操作以将用户添加到acl。
(#3)是一个hack,我不推荐这样做,因为你的应用程序会因为新用户而崩溃,或者当用户在机器上重新创建他的配置文件时。
如果你的主应用不需要管理员权限,你就不应该启动它。您使用什么类型的安装程序?
MSI以当前用户权限运行,仅在对系统进行更改时才提升。安装完成后,你可以启动你的主应用程序,它将作为当前用户运行,非提升。
如果您自定义setup.exe,则可以启动非提升的安装程序。当需要安装文件时,启动另一个进程(它可以是相同的可执行文件)来安装文件并进行系统范围的更改。当这一步完成后,你可以从初始进程中重新启动主应用程序。
或者,在你当前的方法中,安装和更新程序是高架运行的,请按照桌面用户如何从高架应用程序启动程序来启动你的主应用程序非高架。
注意:ProgramData的默认权限允许每个人创建文件和文件夹,但只有创建它们的用户可以修改文件(或管理员)。为了克服这个问题,您有两个选项:
- 直接在用户配置文件中创建数据文件。每个用户都有自己的数据。
- 根据选项2中Seva的建议,从存储在ProgramData中的公共模板创建用户配置文件数据。在这种情况下,每个用户也有自己的数据。
- 或者修改ProgramData目录中应用程序数据的acl,以允许所有人修改,而不仅仅是创建文件夹和文件的用户。
- 防止临时对象文件访问 MSVC 中的磁盘
- 内存映射文件访问非常慢
- 从多个文件访问静态全局 WinForm UI 对象
- 在单元测试项目中包括 .c 文件,并从多个 cpp 文件访问它而不会出现链接问题
- 如何在Android中从本机编译的c ++二进制文件访问相机
- 如何:监视Windows中另一个进程的文件访问?
- 如何从NTFS中的$ MFT文件访问文件的每个块的文件指针
- 执行C 代码时快速频繁的文件访问
- 使用TDD时隐藏文件访问实现详细信息
- 从C文件访问C 类成员功能
- 从另一个CPP文件访问Form1的文本框,Visual C 2010
- 在所有CPP文件中使用一个Globe变量.如果CPP文件的一个类更改该值,我想从另一个类CPP文件访问它
- 如何从C 文件访问$(target_arch)
- 系统访问出界异常,尝试从flatbuffer的二进制文件访问"LengthofTable"
- 如何声明可通过多个头文件访问的对象
- 使用二进制文件访问违规读取位置
- 哪种类型的文件访问使用
- 在其他源文件中没有通用的头文件访问功能
- 文件访问不起作用
- Windows 8 应用商店应用程序C++文件访问