我有一个需要SQLite DB才能运行的应用程序。在我的NSIS脚本中,数据库被复制到用户Local / AppData文件夹。如果安装程序的用户是管理员用户,则此工作正常。
但是,如果标准用户尝试安装程序,安装程序会要求输入管理员密码(因为标准用户无法在Windows上安装程序)并且用户正在安装,现在正在切换到管理员,导致数据库安装在管理员Local / AppData文件夹而不是实际用户AppData文件夹中。
因此,实际上,当标准用户尝试运行程序时,它找不到数据库。
我不知道如何处理这种情况(最佳做法,如果有的话),并且找不到回答它的问题。
安装程序是否应将数据库放入公共场所(如AllUsers)并在首次运行时将数据库从那里复制到自己的AppData文件夹中?
allusers文件夹的问题在我看来是任何人都可以窥视它并可能删除文件。
答案 0 :(得分:5)
标准用户可以安装应用程序。在$ LocalAppdata \ Programs \ MyApp(FOLDERID_UserProgramFiles)下安装程序,并在HKCU
下写下卸载信息。 NSIS具有特殊的SHCTX
注册表根目录(由SetShellVarContext
控制),如果您希望在一个安装程序中支持这两种类型的安装模式,则可以使用它。
如果您想强制用户始终提升为管理员,那么推荐的方法确实是将数据库的模板/基本版本存储在AllUsers appdata(在Vista +中称为ProgramData)(SetShellVarContext all
+ { {1}})或Common ProgramFiles($AppData
)文件夹,让您的应用程序在首次运行时为特定用户制作副本。只有管理员才能删除这些位置的文件。大多数用户都具有读访问权限,但这并不重要,因为文件不应包含用户特定信息。
您可以在Certification requirements for Windows desktop apps或较早的Windows Logo requirements文档中找到这些建议:
10.3您的应用数据必须在计算机上的用户之间共享,应存储在ProgramData
中10.4您的应用程序的数据是特定用户专用的,不能与计算机的其他用户共享,必须存储在Users \\ AppData
中10.6您的应用必须在首次运行时写入用户数据,而不是在“每台机器”安装中安装时
安装应用程序时,没有正确的用户位置 存储数据。应用程序尝试修改默认关联 安装后在计算机级别的行为将失败。 相反,必须在每个用户级别上声明默认值,这会阻止 多个用户覆盖彼此的默认值。