1

我们在长期启用 UAC 的情况下运行我们开发的应用程序时遇到了严重问题。

安装后(安装程序几乎立即与 UAC 一起失败)似乎可以打开 UAC 并使应用程序工作。但是,一段时间后,它将停止工作,出现关于找不到刚刚创建的文件的奇怪错误。

只是为了弄清楚这一点:

XP作为管理员:很好  
XP 作为受限用户:很好
Vista 没有 UAC 管理员:很好
Vista无UAC限制:很好
Vista UAC 管理员:失败
Vista UAC 有限:失败

该软件在任何地方都没有权限检查。如果我正确理解文档,任何作为受限用户工作的东西都应该使用 UAC;然而事实证明并非如此。

编辑:我必须为提出比最初出现的问题更难的问题道歉。事实上,我们在文件夹虚拟化中发现了至少一个错误,并且认为还有更多错误。此时,让它运行的唯一合理希望是找到一个可以作为受限用户执行的 API 调用,该调用禁用调用进程及其产生的任何进程的文件夹虚拟化(递归)。我们不能只添加清单的原因是软件调用第三方软件实际上可能因机器而异。

4

3 回答 3

4

在 Windows Vista 上查找文件系统和注册表的虚拟化。如果您的应用程序使用文件系统和/或注册表的某些部分,您会发现您的应用程序“工作” - 也就是说,API 成功且没有错误 - 但数据并未存储在您期望的位置。特别是,许多本来可以在一台机器上的多个用户之间共享的区域现在已经越界了,数据实际上进入了特定于当前用户的一些存储中。稍后您会发现用户实际上并没有共享相同的数据。

有一种方法可以阻止这种虚拟化的发生。为您的应用程序提供一个清单文件,说明它知道 UAC,如此处所述... http://msdn.microsoft.com/en-us/library/bb756929.aspx

您在清单文件中要求的特权级别并不重要。它的存在表明您的应用程序理解 UAC,并且操作系统不会尝试聪明并虚拟化对文件系统或注册表的“特权”区域的访问。如果您没有必要的权限来访问这些东西,API 调用将简单地失败,这将使您更容易调试。

于 2008-11-04T08:44:46.437 回答
2

经过这么长时间,我找到了一个可行的解决方案。

  1. 安装在程序文件之外的其他地方。这巧妙地避开了似乎导致所有问题的文件系统虚拟化。

  2. 在应用程序的 HLKM 注册表项上禁用虚拟化。这修复了涉及系统更新的一个剩余故障。

参考资料:http://msdn.microsoft.com/en-us/library/aa965884%28VS.85%29.aspx

于 2009-09-11T21:26:40.460 回答
1

应用程序在哪里尝试写入文件?如果它试图在 Program Files 下写入它的安装位置,您可能会遇到奇怪的错误,因为在 Vista 下不允许在此处写入,并且此处创建的任何文件实际上都是在其他地方的虚拟文件夹中创建的 - 尽管对于应用程序来说,它们(通常)似乎是在它期望的地方。

您可能想尝试在 XP 兼容模式下运行该应用程序。

于 2008-11-04T04:01:12.937 回答