Windows 7(UAC)不允许我的程序写下另一个程序拥有的内部数据文件。怎么做?

问题描述 投票:0回答:2

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

这是问题的详细信息:

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

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

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

此外,无论如何(XP兼容性或管理员权限),UAC警告用户每次启动时系统更改:非常烦人:(

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

等待你点燃的回复......

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


好的,我带回了一些新闻。我使用Manifest Creator for VB6(Matt在他的回复中指出的那个)嵌入了一个清单,它只是level =“requireAdministrator”。

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

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

所以,这是我的另外一个问题:如何解决这个错误被记录为简单用户?这是否意味着升级没有起作用(虽然它似乎在其他情况下适用于任何步骤:安装,启动,读/写)仅在这种特定情况下?我心里有点迷惑......

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

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

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

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

windows-7 vb6 windows-vista compatibility uac
2个回答
0
投票

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

有大量内容可供使用,只需谷歌即可。从here我抓住了一个示例清单:

<?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设置)。


0
投票

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

这是您遇到的问题。

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

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

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

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

解决方案实际上是不读取和写入程序文件位置,而是使用其他位置。看看this stack overflow question的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.