6

我有一个用 Delphi 7 编写的应用程序,它不需要管理员权限即可运行。

出于某种原因,即使应用程序没有请求 UAC 提升,我也能够从应用程序中将文件保存到 c:\windows 和 c:\windows\system32 。我以管理员身份登录并打开了 UAC,并且我没有更改任何默认 UAC 设置。这些文件实际上也显示在 Windows 资源管理器下。我没有使用“以管理员身份运行”选项。

如果我尝试在同一配置文件下使用写字板做同样的事情,我会收到预期的错误。

有什么想法吗?

如果有帮助,应用程序正在使用 Ole 结构化存储来保存并包含以下清单。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity type="win32" name="DelphiApplication" version="1.0.0.0" processorArchitecture="*"/>
<dependency>
<dependentAssembly>
  <assemblyIdentity
    type="win32"
    name="Microsoft.Windows.Common-Controls"
    version="6.0.0.0"
    publicKeyToken="6595b64144ccf1df"
    language="*"
    processorArchitecture="*"/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
            <security>
                    <requestedPrivileges>
                            <requestedExecutionLevel
                                   level="asInvoker"
                                   uiAccess="false"/>
                    </requestedPrivileges>
            </security>
    </trustInfo>
</assembly>

编辑:要清楚我的应用程序默认情况下不会将任何内容保存到这些位置。我通过标准文件保存对话框选择这些位置。

更新

尽管包含上述清单,但我发现了为什么我的应用程序被视为遗留应用程序。事实证明,还包括了第二个清单,它没有“trustInfo”部分。我已经删除了第二个清单,现在一切都很好。

感谢所有的帮助

4

3 回答 3

17

这是 UAC 的一项功能,可以使旧应用程序与 Vista 兼容。它将任何写入请求重定向到用户没有本地文件夹权限的系统文件夹。

它们存储在当前用户配置文件下的“AppData\Local\VirtualStore”文件夹下。有一个组策略设置可以禁用此功能:“将文件和注册表写入失败虚拟化到每个用户的位置”

此文件和注册表虚拟化功能旨在允许旧应用程序在 Windows Vista 标准用户帐户下运行。旧版应用程序被定义为没有特定 Vista 清单的 32 位可执行文件。如果您提供 Vista 清单以将您的应用程序装饰为与 Vista 兼容,则此虚拟化设置不会影响您的应用程序(如在您的写字板示例中)

Mark Russinovich 有一篇很棒的文章:Inside Windows Vista User Account Control

于 2008-12-16T10:05:10.090 回答
0

我在打开 UAC 的情况下以管理员身份运行。

您的意思是您以管理员身份登录还是您的意思是您使用“以管理员身份运行”选项(即使用提升的令牌)运行您的 Delphi 应用程序?

如果是后者,那么您的应用程序将有权写入 C:\Windows。

于 2008-12-16T10:04:02.730 回答
0

除非您禁用了 UAC,否则这些文件最终将位于您的用户目录下的虚拟位置。

于 2008-12-16T10:05:16.253 回答