【问题标题】:How do I set file permissions for non-admin users in VB6?如何在 VB6 中为非管理员用户设置文件权限?
【发布时间】:2009-09-02 20:36:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: vb6 file-permissions


    【解决方案1】:

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

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

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

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

    就是这样。

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

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

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

    【讨论】:

    • 我明白了,所以如果我将程序的数据文件夹设置为允许正常访问,那么问题应该解决了吗?
    • 我想就是这样。不过,我不确定是否有任何好的简短代码可以从您的 VB6 程序中执行此操作。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 相关文件位于所有用户的应用程序数据文件夹中(Vista 上的 C:\AppData)。更新程序还修改和注册程序文件,它必须以管理员身份运行。
    • 对由多个用户共享的程序的更新应该需要管理员权限。从系统管理员的角度来看,这只是常识。奇怪的是,非程序文件不能从 App Data 文件夹中为您工作。您是否检查了安全选项以查看谁拥有权利?
    • 更新程序创建/替换的任何文件对于标准用户都是只读的。但我希望普通用户对应用程序数据文件拥有完全权限,这样程序才能运行。
    • Karl Peterson 发布了SysFolders,这是一个很好的 Windows API VB6 包装器,可帮助查找这些特殊文件夹。 vb.mvps.org/samples/SysFolders
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 2013-12-28
    • 2013-09-27
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多