如何在VB6中为非管理员用户设置文件权限?

如何在VB6中为非管理员用户设置文件权限?,vb6,file-permissions,Vb6,File Permissions,我有一个用vb6编写的旧更新程序,它作为管理员运行。但是,由于它以管理员身份运行,因此它下载和保存的所有文件对其他用户都是只读的。甚至是公共场所的文件,如共享应用程序数据文件夹(我正在保存有问题的文件) 我很幸运在“vista兼容版”发布之前找到了这个。Vista通过将非管理员写入和未来读取重定向到sortof“虚拟”文件夹来隐藏问题。但下一次更新可能会替换该文件,非管理员程序仍将转到虚拟文件夹并使用旧文件 作为管理员用户,如何允许其他用户完全控制我在vb6中写入的文件?不一定是谁写入文件,而是

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

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


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

不一定是谁写入文件,而是他们将文件写入何处。默认情况下,“程序文件”文件夹及其子文件夹对所有标准用户都是只读的。尝试改用“所有用户”应用程序数据文件夹

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

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


最后一点注意:这不是Vista的新变化。默认情况下,程序文件文件夹对标准用户始终是只读的。XP也以同样的方式工作。只是有这么多人在XP中以管理员身份运行,你可能会侥幸逃脱。

不一定是谁写的文件,而是他们在哪里写的文件。默认情况下,“程序文件”文件夹及其子文件夹对所有标准用户都是只读的。尝试改用“所有用户”应用程序数据文件夹

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

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


最后一点注意:这不是Vista的新变化。默认情况下,程序文件文件夹对标准用户始终是只读的。XP也以同样的方式工作。只是有这么多人在XP中以管理员身份运行,你也许可以侥幸逃脱。

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

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

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

  • 为每台计算机安装设置MSI数据库:属性表,ALLUSERS设置为1的行
  • 在目录表中,找到CommonAppDataFolder的条目并获取其目录索引。使用此索引可在目录表中查询CommonAppDataFolder为父项的条目,并获取其索引(这是应用程序数据子文件夹)
  • 查看文件表以获取程序的组件索引
  • 在数据库中创建CreateFolder表(如果不存在)。通过索引向所需应用程序子目录的CreateFolder添加一行,并将其绑定到程序的组件索引
  • 创建LockPermissions表(如果不存在)。为应用程序数据子目录插入一个新的LockPermissions行,为每个人提供
    FILE\u ALL\u访问权限
  • 就这样

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

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


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

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

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

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

  • 为每台计算机安装设置MSI数据库:属性表,ALLUSERS设置为1的行
  • 在目录表中,找到CommonAppDataFolder的条目并获取其目录索引。使用此索引可在目录表中查询CommonAppDataFolder为父项的条目,并获取其索引(这是应用程序数据子文件夹)
  • 查看文件表以获取程序的组件索引