El archivo de configuración se escribe en VirtualStore pero se lee desde ProgramData

1

Tengo una aplicación que usa un archivo config.xml que se almacena en C: \ ProgramData \ MyApp

El archivo de configuración se crea y edita utilizando MyConfigApp.exe y luego lo lee la aplicación real MyApp.exe.

Durante la instalación, inicié sesión como administrador y todo funcionó a la perfección. Luego iniciamos sesión como usuario normal y funcionó perfectamente aquí también.

Entonces necesitábamos cambiar una configuración. Esto es algo que un usuario debería poder hacer, así que comenzamos 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 anteriores estaban en él.

Ahora descubrimos que el usuario no tenía derechos 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?

Andis59
fuente
Una carpeta dentro de VirtualStore es exactamente donde debe ir este archivo. Su conclusión de que el usuario que no tiene acceso de escritura a ProgramData fue claramente erróneo si el programa aún no carga la configuración. Esto parece más una pregunta SO ya que, la única forma en que podría responderla es ver su código.
Ramhound

Respuestas:

1

Resolví esto con mi aplicación heredada creando un .manifestarchivo, que se coloca junto al exe. No hay problemas reales, solo un archivo de texto llamado MyConfigApp.exe.manifestque contiene algo como el código XML a continuación.

Según Microsoft, (consulte https://msdn.microsoft.com/en-us/library/bb756929.aspx ) un EXE con un archivo de manifiesto lado a lado como el siguiente 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 a VirtualStore de un usuario.

Sin embargo, tenga en cuenta que el sistema va a utilizar VirtualStore si hay archivos que ya existen. Aquí está el código 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>
Rob Perkins
fuente