我知道commonappdata(所有用户)可以保存系统范围的应用程序设置,但在Vista / 7下,非提升用户无法写入该目录。
是否存在用户共享的文件夹,任何非管理员用户都可以写入该文件夹?
这就是我需要这个的原因: 我的应用程序由具有提升权限的Inno安装程序安装程序安装在PF目录中。然后,当实际的非管理员用户运行程序时,它会使用另一个非提升的Inno安装程序安装程序将其设置复制到用户的AppData目录。卸载程序后(由具有管理员权限的系统范围安装程序启动)我想从每个用户的AppData目录中卸载程序的文件。
我可以想到两个解决方案: 1.获取Windows用户列表并迭代他们的AppData目录(似乎太复杂了) 2.在上述公共用户数据目录中存储卸载程序的路径。
有什么想法吗?
谢谢!
答案 0 :(得分:4)
Windows XP中的“共享文档”目录
C:\Documents and Settings\All Users\Documents
或者,
%ALLUSERSPROFILE%\Documents
Vista / 7中的对应目录
C:\Users\Public
或者,
%PUBLIC%\Documents
但您真正想要的是FOLDERID_PublicDocuments
CSIDL_COMMON_DOCUMENTS
(遗产Const CSIDL_COMMON_DOCUMENTS = &h2e
Set oShell = CreateObject("Shell.Application")
Wscript.Echo oShell.Namespace(CSIDL_COMMON_DOCUMENTS).Self.Path
)的价值。 KNOWNFOLDERID函数可以为您提供路径。
或者更简单的VBScript替代方案,但我不确定它在操作系统版本中的可靠性如何:
COMMONAPPDATA = &H23
我认为SHGetFolderPath 不接受该特定NameSpace。因此,您可以使用Wscript.Echo oShell.NameSpace(&h23).ParentFolder.Self.Path & "\Documents"
然后使用其父级。但那不是很干净或国际化:
{{1}}
但是既然你正在使用Inno Setup,你应该真正使用{commondocs} constant并让自己轻松一点。
答案 1 :(得分:2)
用户拥有文档文件夹。由于用户的可见性,如果您在其中放置某些内容,则可以使用其他程序复制,移动,删除或编辑文件。
我建议您在安装程序中使用允许每个人访问的安全描述符在公共应用程序数据(CSIDL_COMMON_APPDATA或FOLDERID_ProgramData)下创建一个文件夹。
E.g。
[Dirs]
Name: "{commonappdata}\productname";Permissions:everyone-modify;
答案 2 :(得分:1)
C:\ Users \ Public \下的内容是否符合您的需要?
答案 3 :(得分:0)
解决方案1对我来说看起来很合理。因此,每个用户都控制他们的安装,并控制中央共享安装。
对于解决方案2,您可以在明确定义的位置创建一个允许写入的文件夹,以便安装程序知道它,或者使用注册表项来实现相同的目的。但请记住,这可能会造成安全漏洞,因为任何人都可能篡改其他用户的卸载路径。