0

我必须维护一个 VB6 软件,它基本上从第二个程序导出数据并将它们导入到关于第三个程序的数据文件中。所以,这个导入/导出工具在 Windows 95 到 XP 下运行了好几年,但是,现在,我必须更新它以支持 Vista 和 7……当它写到第三个程序的文件时它失败了。此时,我刚刚在 Windows 7 下进行了测试,但我想在 Vista 下也会如此。

这是详细的问题:

当我的程序尝试访问第三个程序的数据进行写入时,我收到此错误:“运行时错误'75':路径/文件访问错误”。因此,这听起来像是一个 UAC 阻塞,因为我的程序试图获得访问权限以写入他不拥有的数据文件。然后,如果我以管理员权限或与 XP 兼容性运行我的程序,它可以工作:没有错误,并且第三个程序的数据文件被很好地修改。

此时我想知道如何以编程方式解决此错误(对我的程序来说是致命的,因为它的主要工作被阻止:导出/导入数据):在安装期间(我正在使用 Inno Setup)或在运行时。

什么是正确的方法?以编程方式强制“XP兼容性”或提升我的程序以管理员权限启动?如何实现这一点以及何时(在安装期间或运行时)?清单是否可以更改此字段中的某些内容(此时从未使用过任何清单)?

此外,无论是哪种方式(XP 兼容性或管理员权限),UAC 都会在每次启动时警告用户系统更改:非常烦人:(

那么,如何让我的程序在 Windows 7 和 Vista 下像在 XP 下一样顺利运行,知道它除了写在第三方数据文件中(因为它是它的主要目的)别无选择?

等待您的光辉回复...

PS:另外(这可能很重要),我的程序本身并不知道数据文件的路径,但它是使用通用对话框选择它的用户。


好的,我回来有一些消息。我已经嵌入了一个清单,它使用 VB6 的清单创建器(马特在他的回复中指出的那个)执行 level="requireAdministrator" 。

如果我以管理员身份安装(在 Windows 7 下)我的程序,它会毫无问题地安装,然后程序会毫无问题地启动并完成其工作(读取和写入不属于我的程序的任何文件)非常顺利,没有任何问题问题。所以,在这种情况下完美!

尽管如此,如果我以简单用户身份登录,它在使用管理员密码询问权限后安装良好,然后程序毫无问题地启动,但是(这是剩下的问题)我再次陷入“路径/文件访问错误” (错误'75')当读取或写入外部文件(不属于我的程序)时。

所以,这是我的另一个问题:如何解决这个以简单用户身份记录的错误?这是否意味着提升不起作用(而在其他情况下似乎对任何步骤都有效:安装、启动、读/写)仅在这种特定情况下?说到这里,心里有点乱……

编辑:嗯,我想我已经理解了一件事,但需要你的确认(或不确认)。我将调用我的程序 B。B 将读取/导入程序 A 拥有的数据,然后写入/导出到程序 C 拥有的数据。

我的困惑是我重新安装了 B 被记录为简单用户,而不是程序 A 和 C 仍然安装被记录为管理员。因此,当 B 读取有关 A 的数据时,尽管有提升,但它失败了,因为这些 A 的数据归管理员所有(即使这些 A 的数据不在用户特定的路径中,但是,说“C:\email_data ”)。

如果我重新安装以简单用户身份记录的所有三个程序,它就可以工作(没有警告也没有错误)。

所以,我重新提出我的问题:既然提升工作(这应该允许程序获得管理员权限),为什么程序 B(由用户安装)无法读取有关程序 A(由管理员安装)的数据?我是否应该在 Inno Setup 过程中添加一些内容以仅以管理员身份安装我的程序(知道我对 A 和 C 程序的安装方式没有任何影响)?

4

2 回答 2

0

启用 UAC 后,该%Program Files%目录在 Windows 7 下受到保护(您需要提升权限才能直接写入该目录)

这是您遇到的问题。

为了让“旧版”程序更无缝地工作(即没有可见错误),Windows 7 使用文件夹重定向。这允许您的旧应用程序读取和写入程序文件目录中的内容的副本。

如果您使用清单,这会告诉 Windows 您的应用程序可识别 UAC,因此不会发生文件夹重定向,但您需要提升(管理员)权限才能读取/写入程序文件。

有大量关于如何使用清单的示例。我个人的偏好是Manifest Creator

如果您将其设置为requestedExecutionLevel"requireAdministrator"那么它将读取和写入实际文件夹,但当您的应用程序运行时,系统会提示您进行 UAC 提升。

解决方案实际上是不读写程序文件位置,而是使用另一个位置。查看此堆栈溢出问题以获取解决方案。

于 2012-06-25T16:39:32.267 回答
0

您可以使用外部清单文件 (myapp.exe.manifest) 或使用工具在 exe 和资源中包含 manfiest。

有很多可用的内容,只需谷歌它。从这里我抓取了一个示例清单:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

您需要将级别更改为“requireAdministrator”,这将在用户启动应用程序时提示用户权限(取决于他们的 UAC 设置)。

于 2012-06-25T13:16:46.130 回答