Windows 7 Windows7(UAC)不支持';我不允许我的程序在另一个程序拥有的数据文件中写入。如何做?

Windows 7 Windows7(UAC)不支持';我不允许我的程序在另一个程序拥有的数据文件中写入。如何做?,windows-7,vb6,windows-vista,compatibility,uac,Windows 7,Vb6,Windows Vista,Compatibility,Uac,我需要维护一个VB6软件,它基本上是从第二个程序导出数据,然后将数据导入第三个程序的数据文件中。所以,这个导入/导出工具在Windows95到XP下运行了好几年,但是,现在,我必须更新它以支持Vista和七。。。当写入第三个程序的文件时,它就失败了。现在,我刚刚在Windows7下做了测试,但我想在Vista下也会一样 下面是详细的问题: 当我的程序试图访问第三个程序的数据进行写入时,我得到了以下错误:“运行时错误'75':路径/文件访问错误”。所以,这听起来像是UAC阻塞,因为我的程序试图获得

我需要维护一个VB6软件,它基本上是从第二个程序导出数据,然后将数据导入第三个程序的数据文件中。所以,这个导入/导出工具在Windows95到XP下运行了好几年,但是,现在,我必须更新它以支持Vista和七。。。当写入第三个程序的文件时,它就失败了。现在,我刚刚在Windows7下做了测试,但我想在Vista下也会一样

下面是详细的问题:

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

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

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

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

那么,我该怎么做才能让我的程序在Windows7和Vista下像在XP下一样平稳运行,因为我知道它除了在第三方数据文件中写入之外别无选择(因为这是它的主要用途)

等待你轻松的回答

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


好的,我带着一些消息回来了。我嵌入了一个清单,它只使用VB6的清单创建者(Matt在回复中指出的那个)执行level=“requireAdministrator”

如果我以管理员身份安装(在Windows 7下)我的程序,它将毫无疑问地安装,然后程序将毫无疑问地启动,并毫无疑问地执行其工作(读取和写入任何不属于我的程序的文件)。因此,在这种情况下,非常完美

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

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

编辑:嗯,我想我明白了一件事,但需要你的确认(或不确认)。我会打电话给我的程序B。B将读取/导入程序a拥有的数据,然后写入/导出程序C拥有的数据

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

如果我重新安装作为简单用户记录的所有三个程序,它会工作(没有警告或错误)


所以,我重新表述了我的问题:既然提升可以工作(这应该允许程序获得管理员权限),为什么程序B(由用户安装)不能读取关于程序A(由管理员安装)的数据?我应该在Inno安装过程中添加一些内容,使我的程序只作为管理员安装吗(知道我对A和C程序的安装方式没有任何影响)?

您可以使用外部清单文件(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设置)。

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

这就是你遇到的问题

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

如果您使用清单,这会告诉windows您的应用程序是UAC感知的,因此不会发生文件夹重定向,但您需要具有提升的(管理员)权限才能读/写程序文件

有很多关于如何使用清单的例子。我个人的偏好是

如果您将
requestedExecutionLevel
设置为
“requireAdministrator”
,则它将读取和写入实际文件夹,但在应用程序运行时会提示您输入UAC提升


解决方案实际上是不读取和写入程序文件位置,而是使用另一个位置。请查看解决方案。

您要导入的文件在哪里?如果不同的用户需要访问它们,那么一定要适当设置权限?您可以更改路径吗