2008-12-16 74 views
5

我有一个用Delphi 7编写的应用程序,它不需要管理员权限来运行。为什么我的应用程序允许我将文件保存到Vista中的Windows和System32文件夹中?

出于某种原因,我可以从应用程序内将文件保存到c:\ windows和c:\ windows \ system32,即使应用程序未请求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'部分。我已经删除了第二张清单,现在一切正常。

感谢所有帮助

回答

16

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

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

此文件和注册表虚拟化功能设计,让旧应用程序在Windows Vista标准用户帐户运行。传统应用程序被定义为没有特定Vista清单的32位可执行文件。如果提供商Vista的表现来装饰您的应用程序兼容Vista,这个虚拟化的设置将不会影响您的应用程序(如您的写字板为例)

标记Russinovich对这个伟大的文章:Inside Windows Vista User Account Control

0

我正在与UAC管理员打开。

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

如果后者的情况比您的应用程序有权写入C:\ Windows。

+0

我以管理员身份登录。我没有使用'作为管理员运行'选项。将更新以澄清 – Jamie 2008-12-16 10:06:41

0

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