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

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

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

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

    出于某种原因,即使应用程序 未请求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标准用户帐户下运行。遗留应用程序定义为32位可执行文件,没有特定的Vista清单。如果您提供了一个Vista清单来将应用程序装饰为与Vista兼容,那么这个虚拟化设置不会影响您的应用程序(如您的写字板示例中所示)。

    MarkRussinovich对此有一篇伟大的文章: Inside Windows Vista User Account Control

        2
  •  0
  •   Dirk Vollmar    16 年前

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

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

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

        3
  •  0
  •   indeed356    16 年前

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