0

我有一个用 vb6 编写的旧更新程序,它以管理员身份运行。但是,因为它以管理员身份运行,所以它下载和保存的所有文件对其他用户都是只读的。甚至公共场所的文件,如共享应用程序数据文件夹(这是我保存相关文件的位置)。

我很幸运我在“vista-compatible”版本之前找到了这个。Vista 通过将非管理员写入和未来读取重定向到某种“虚拟”文件夹来隐藏问题。但是下次更新可能会替换文件,非管理员程序还是会去虚拟文件夹使用旧文件。

作为管理员用户,我如何允许其他用户完全控制我在 vb6 中编写的文件?

4

2 回答 2

2

我这样做的方式是让它成为安装程序的责任。

使用 VSI 1.1 为您的应用程序创建安装程序 MSI。在 CommonAppDataFolder 下创建一个应用程序数据文件夹。

作为构建后步骤,运行脚本以执行以下操作:

  1. 为每台机器安装设置 MSI 数据库:属性表,ALLUSERS 设置为 1 的行。
  2. 在 Directory 表中,找到 CommonAppDataFolder 的条目并获取其目录索引。使用此索引查询目录表以查找 CommonAppDataFolder 为父项的条目并获取其索引(这是您的应用程序数据子文件夹)。
  3. 查看文件表以获取程序的组件索引。
  4. 如果不存在,则在数据库中创建 CreateFolder 表。通过索引为所需的应用程序子目录添加一行到 CreateFolder,将其绑定到程序的组件索引。
  5. 如果 LockPermissions 表不存在,请创建它。为您的应用程序数据子目录插入一个新的 LockPermissions 行,将其提供FILE_ALL_ACCESS给每个人。

就是这样。

您可以这样做,或者使用 VSI 1.1,然后使用 Orca 编辑 MSI,或者可能通过使用第 3 方 MSI 创作工具,这些条目将通过其 GUI 进行设置,并且可以保存在安装程序项目中。我只使用在每个 VSI 1.1 构建后运行的小型 WSH 脚本。

AFAIK 这是根据 Windows 应用程序指南完成此类事情的推荐方法。如果您的需求更高,您可以使用多个子目录或子子目录,其中一些允许完全访问,一些是只读的,等等。

您的程序可以使用 Shell 自动化对象或通过调用 Shell32 作为标准 DLL(使用 Declare Function 或 TLB)来定位文件夹。

于 2009-09-02T22:09:06.590 回答
1

不一定是谁写文件,而是他们把文件写到哪里。默认情况下,程序文件文件夹及其子文件夹对所有标准用户都是只读的。尝试改用 All Users Application Data 文件夹。

这对 VB6 来说有点棘手,因为它在设计时根本没有考虑到 Vista。一些相关文件夹被重新命名,我无法让 vb6 为您提供您想要的确切文件夹,而不是使用“Declare Function”别名直接调用 Windows API。

所以我知道找到合适位置的最简单可靠的方法是使用%ALLUSERSPROFILE%环境变量。C:\Documents and Settings\All Users在 XP 上默认返回“ ”,C:\ProgramData在 Vista 上默认返回“”。从那里您可以查找“应用程序数据”文件夹。它不会存在,您在 Vista 上也不需要它,但如果它不存在,创建一个不会有任何损害。这为您在两个系统上提供了一致的文件夹结构,您可以从中创建一个子文件夹供您的应用程序用作工作空间。

最后一点:这不是 Vista 的新变化。默认情况下,Program Files 文件夹对标准用户始终是只读的。XP 的工作方式相同。只是有这么多人在 XP 中以管理员身份运行,您也许可以摆脱它。

于 2009-09-02T20:41:10.620 回答