
Tengo una aplicación que utiliza un archivo config.xml que está almacenado en C:\ProgramData\MyApp
El archivo de configuración se crea y edita usando MyConfigApp.exe y luego lo lee la aplicación real MyApp.exe.
Durante la instalación inicié sesión como Administrador y ¡todo funcionó perfecto!. Luego iniciamos sesión como usuario normal y aquí también funcionó perfecto.
Entonces necesitábamos cambiar una configuración. Esto es algo que un usuario debería poder hacer, por lo que iniciamos MyConfigApp.exe y cambiamos la configuración.
Pero el cambio nunca se leyó en MyApp.exe.
Abrí c:\ProgramData\MyApp\config.xml y los valores antiguos estaban en él.
Ahora descubrimos que el usuario no tenía ningún derecho de escritura en el directorio ProgramData. Entonces Windows creó un nuevo archivo en VirtualStore, que no se usa desde MyApp.exe
Agregamos derechos de escritura en ProgramData (y subdirectorios) y eliminamos el archivo config.xml de VirtualStore.
¡PERO cada vez que el usuario ejecuta MyConfigApp.exe creará un archivo en VirtualStore!
¿Cómo hago para que MyConfigApp.exe lea y escriba el archivo en ProgramData?
Respuesta1
Resolví esto con mi aplicación heredada creando un .manifest
archivo, que se coloca junto al exe. No hay problemas reales, solo un archivo de texto llamado MyConfigApp.exe.manifest
que contiene algo como el código XML a continuación.
Según Microsoft (verhttps://msdn.microsoft.com/en-us/library/bb756929.aspx) un EXE con un archivo de manifiesto en paralelo como el que se muestra a continuación no participará en la virtualización del sistema de archivos porque se solicita un nivel de ejecución específico y, por lo tanto, no agregará cosas al VirtualStore de un usuario.
Sin embargo, tenga en cuenta que el sistemavoluntaduse VirtualStore si ya hay archivos allí. Aquí está el código de manifiesto:
<?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>