O arquivo de configuração é gravado no VirtualStore, mas lido em ProgramData

O arquivo de configuração é gravado no VirtualStore, mas lido em ProgramData

Eu tenho um aplicativo que usa um arquivo config.xml armazenado em C:\ProgramData\MyApp

O arquivo de configuração é criado e editado usando MyConfigApp.exe e depois lido pelo aplicativo real MyApp.exe.

Durante a instalação eu estava logado como Administrador e tudo funcionou perfeitamente! Então fizemos login como usuário normal e funcionou perfeitamente aqui também.

Então precisávamos alterar uma configuração. Isso é algo que um usuário deve ser capaz de fazer, então iniciamos MyConfigApp.exe e alteramos a configuração.

Mas a alteração nunca foi lida no MyApp.exe.

Abri c:\ProgramData\MyApp\config.xml e os valores antigos estavam nele.

Agora descobrimos que o usuário não tinha direitos de gravação no diretório ProgramData. Então o Windows criou um novo arquivo no VirtualStore, que não é usado no MyApp.exe

Adicionamos direitos de gravação em ProgramData (e subdiretórios) e removemos o arquivo config.xml do VirtualStore.

MAS toda vez que o usuário executar MyConfigApp.exe ele criará um arquivo no VirtualStore!

Como faço para que MyConfigApp.exe leia e grave o arquivo em ProgramData?

Responder1

Resolvi isso com meu aplicativo legado criando um .manifestarquivo, que é colocado ao lado do exe. Sem problemas reais, apenas um arquivo de texto chamado MyConfigApp.exe.manifestque contém algo como o código XML abaixo.

De acordo com a Microsoft, (vejahttps://msdn.microsoft.com/en-us/library/bb756929.aspx) um EXE com um arquivo de manifesto lado a lado como o mostrado abaixo não participará da virtualização do sistema de arquivos porque um nível de execução específico é solicitado e, portanto, não adicionará itens ao VirtualStore de um usuário.

No entanto, esteja ciente de que o sistemavaiuse o VirtualStore se já houver arquivos lá. Aqui está o código do manifesto:

<?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>

informação relacionada