9

我知道 commonappdata (所有用户)可以保存系统范围的应用程序设置,但在 Vista/7 下非提升用户不能写入该目录。

是否有一个在用户之间共享并且任何非管理员用户都可以写入的文件夹?

这就是我需要这个的原因:我的应用程序由具有提升权限的 Inno Setup 安装程序安装在 PF 目录中。然后,当实际的非管理员用户运行该程序时,它会使用另一个非提升的 Inno Setup 安装程序将其设置复制到用户的 AppData 目录。卸载程序后(由具有管理员权限的系统范围的安装程序启动),我想从每个用户的 AppData 目录中卸载程序的文件。

我可以想到两个解决方案: 1. 获取 Windows 用户列表并遍历他们的 AppData 目录(似乎太复杂了) 2. 将卸载程序的路径存储在上述通用用户数据目录中。

有任何想法吗?

谢谢!

4

4 回答 4

4

Windows XP 中的“共享文档”目录

C:\Documents and Settings\All Users\Documents

或者,

%ALLUSERSPROFILE%\Documents

Vista/7中对应目录

C:\Users\Public

或者,

%PUBLIC%\Documents

但是您真正要寻找的是(legacy )的KNOWNFOLDERID值。然后SHGetFolderPath函数可以为您获取路径。FOLDERID_PublicDocumentsCSIDL_COMMON_DOCUMENTS

或者更简单的 VBScript 替代方案,但我不确定跨操作系统版本的可靠性如何:

Const CSIDL_COMMON_DOCUMENTS = &h2e 
Set oShell = CreateObject("Shell.Application")
Wscript.Echo oShell.Namespace(CSIDL_COMMON_DOCUMENTS).Self.Path

我认为NameSpace不接受那个特定的常量。因此,您可能可以先获取COMMONAPPDATA = &H23然后使用其父级。但这不是很干净或国际化:

Wscript.Echo oShell.NameSpace(&h23).ParentFolder.Self.Path & "\Documents"

但是由于您使用的是 Inno Setup,因此您应该真正使用 {commondocs} Shell 文件夹常量并让自己轻松使用。

于 2011-10-23T02:28:02.923 回答
3

用户拥有文档文件夹。如果您将某些内容放在那里,由于对用户的可见性,预计文件会被另一个程序复制、移动、删除或编辑。

我建议您在安装程序的通用应用程序数据(CSIDL_COMMON_APPDATA 或 FOLDERID_ProgramData)下创建一个文件夹,并使用允许所有人访问的安全描述符。

例如

[Dirs]
Name: "{commonappdata}\productname";Permissions:everyone-modify;
于 2011-10-23T20:20:30.747 回答
1

C:\Users\Public\ 下的内容是否符合您的需要?

于 2010-12-21T05:20:27.437 回答
0

解决方案 1 对我来说看起来很合理。因此,每个用户都可以控制自己的安装,而您可以控制中央共享安装。

对于解决方案 2,您可以在明确定义的位置创建一个允许写入的文件夹,以便您的安装程序知道它,或者使用注册表项来实现相同的目的。但请记住,这可能会造成安全漏洞,因为任何人都可能篡改其他用户的卸载路径。

于 2010-12-19T18:03:39.037 回答