2009-09-02 33 views
0

我有一个以vb6编写的旧版更新程序,它以admin身份运行。但是,因为它以管理员身份运行,所以它下载并保存的所有文件都是只读给其他用户的。即使文件在公共场所,如共享应用程序数据文件夹(这是我保存有问题的文件)。如何在VB6中为非管理员用户设置文件权限?

我很幸运,我在'vista兼容'发布之前发现了这个。 Vista通过将非管理员写入和将来的读取重定向到一个“虚拟”文件夹来隐藏问题。但是下一次更新可能会替换该文件,而非管理程序仍然会转到该虚拟文件夹并使用旧文件。

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

回答

2

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

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

作为生成后步骤运行一个脚本来执行以下操作:

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

就是这样。

您可以这样做,或使用VSI 1.1,然后使用Orca编辑MSI,或者可能使用第三方MSI编写工具,这些条目可通过其GUI设置,并可保存在Installer项目中。我只是使用我在每个VSI 1.1版本之后运行的小型WSH脚本。

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

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

+0

我看到了,所以如果我设置我的程序的数据文件夹以允许正常访问,那么问题应该解决? – 2009-09-02 22:37:27

+0

就是这样,我会想。我不确定是否有任何漂亮的简短代码可以在你的VB6程序中实现。 – Bob77 2009-09-03 00:38:25

1

这不一定是谁写的文件,但他们写的地方。程序文件夹和它的子文件夹在默认情况下对所有标准用户是只读的。尝试使用“所有用户应用程序数据”文件夹。

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

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

最后一点:这不是Vista的新变化。程序文件文件夹默认情况下一直只对标准用户是只读的。 XP的工作方式相同。只有很多人在XP中以管理员身份运行,所以你可能会摆脱它。

+0

相关文件位于所有用户的应用程序数据文件夹中(vista上的C:\ AppData)。更新程序还修改和注册程序文件,它必须以管理员身份运行。 – 2009-09-02 21:10:21

+0

更新多个用户共享的程序_应该要求管理员权限。从系统管理员的角度来看,这只是常识。非常奇怪的是,非程序文件不适用于App Data文件夹。您是否检查过安全选项以查看谁有权限? – 2009-09-02 21:13:25

+0

对于标准用户,任何由更新程序创建/替换的文件都是只读的。但我希望普通用户对应用程序数据文件拥有完全权限,以便程序可以正常工作。 – 2009-09-02 21:17:56

相关问题