配置文件写入 VirtualStore 但从 ProgramData 读取

配置文件写入 VirtualStore 但从 ProgramData 读取

我有一个应用程序使用存储在 C:\ProgramData\MyApp 中的 config.xml 文件

使用 MyConfigApp.exe 创建和编辑配置文件,然后由实际应用程序 MyApp.exe 读取。

在安装过程中,我以管理员身份登录,一切运行正常!然后我们以普通用户身份登录,这里一切运行正常。

然后我们需要更改配置。这是用户应该能够做的事情,所以我们启动了 MyConfigApp.exe 并更改了配置。

但这个变化从未被读入MyApp.exe。

我打开了 c:\ProgramData\MyApp\config.xml 并且旧值就在其中。

现在我们发现用户在 ProgramData 目录中没有任何写入权限。因此 Windows 在 VirtualStore 中创建了一个新文件,但 MyApp.exe 不会使用该文件

我们在 ProgramData(和子目录)中添加了写入权限,并从 VirtualStore 中删除了 config.xml 文件。

但是每次用户运行 MyConfigApp.exe 时,它​​都会在 VirtualStore 中创建一个文件!

如何让MyConfigApp.exe读取和写入ProgramData中的文件?

答案1

我通过创建一个.manifest文件(与 exe 放在一起)解决了这个问题。没有真正的问题,只是一个名为的文本文件,MyConfigApp.exe.manifest其中包含类似下面的 XML 代码。

据微软称,(见https://msdn.microsoft.com/en-us/library/bb756929.aspx) 具有如下所示的并行清单文件的 EXE 将不会参与文件系统虚拟化,因为请求特定的执行级别,因此不会将内容添加到用户的 VirtualStore。

但是,请注意系统将要如果文件已经存在,则使用 VirtualStore。以下是清单代码:

<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    version="**your version number, make sure the numbers match the EXE**"
    processorArchitecture="X86"
    name="MyConfigApp"
    type="win32"
    />
  <description>SOLIDCast</description>
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
       <application>
           <!-- Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
           <!-- Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
           <!-- Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
           <!-- Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
       </application>
    </compatibility>
<!-- Identify the application security requirements: Vista and above -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
      <security>
        <requestedPrivileges>
          <requestedExecutionLevel
            level="asInvoker"
            uiAccess="false"
            />
        </requestedPrivileges>
      </security>
  </trustInfo>

相关内容