
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 .manifest
arquivo, que é colocado ao lado do exe. Sem problemas reais, apenas um arquivo de texto chamado MyConfigApp.exe.manifest
que 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>