Windows 7 Windows7(UAC)不支持';我不允许我的程序在另一个程序拥有的数据文件中写入。如何做?
我需要维护一个VB6软件,它基本上是从第二个程序导出数据,然后将数据导入第三个程序的数据文件中。所以,这个导入/导出工具在Windows95到XP下运行了好几年,但是,现在,我必须更新它以支持Vista和七。。。当写入第三个程序的文件时,它就失败了。现在,我刚刚在Windows7下做了测试,但我想在Vista下也会一样 下面是详细的问题: 当我的程序试图访问第三个程序的数据进行写入时,我得到了以下错误:“运行时错误'75':路径/文件访问错误”。所以,这听起来像是UAC阻塞,因为我的程序试图获得对一个他不拥有的数据文件的写入权限。然后,如果我使用管理员权限或XP兼容性运行我的程序,它就会工作:没有错误,并且第三个程序的数据文件得到了很好的修改 此时,我想知道如何以编程方式解决这个错误(这对我的程序来说是致命的,因为它的主要任务是:导出/导入数据):在安装期间(我使用Inno Setup)或在运行时 正确的方法是什么?以编程方式强制“XP兼容性”或提升我的程序以使用管理员权限启动?如何在何时(安装期间或运行时)实现这一点?清单是否可以更改此字段中的某些内容(此时从未使用任何清单) 此外,无论是什么方式(XP兼容性或管理权限),UAC都会在每次启动时警告用户系统更改:非常烦人:( 那么,我该怎么做才能让我的程序在Windows7和Vista下像在XP下一样平稳运行,因为我知道它除了在第三方数据文件中写入之外别无选择(因为这是它的主要用途) 等待你轻松的回答 PS:另外(这可能很重要),我的程序本身不知道数据文件的路径,但是用户使用公共对话框选择它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的清单创建者(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提升
解决方案实际上是不读取和写入程序文件位置,而是使用另一个位置。请查看解决方案。您要导入的文件在哪里?如果不同的用户需要访问它们,那么一定要适当设置权限?您可以更改路径吗