代码之家  ›  专栏  ›  技术社区  ›  Jamie

为什么我的应用程序允许我在Vista中将文件保存到Windows和System32文件夹?

  •  6
  • Jamie  · 技术社区  · 16 年前

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

    出于某种原因,即使应用程序 尚未请求UAC提升 我以管理员身份登录 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”部分。我已经删除了第二份清单,现在一切都很好。

    谢谢你的帮助

    3 回复  |  直到 16 年前
        1
  •  17
  •   Mehrdad Afshari    16 年前

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

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

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

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

        2
  •  0
  •   Dirk Vollmar    16 年前

    我以管理员身份运行,UAC已打开。

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

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

        3
  •  0
  •   indeed356    16 年前

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

    推荐文章