Файл конфигурации записан в VirtualStore, но считывается из ProgramData

Файл конфигурации записан в VirtualStore, но считывается из ProgramData

У меня есть приложение, которое использует файл config.xml, который хранится в C:\ProgramData\MyApp

Файл конфигурации создается и редактируется с помощью MyConfigApp.exe, а затем считывается самим приложением MyApp.exe.

Во время установки я вошел в систему как администратор, и все работало идеально! Затем мы вошли в систему как обычный пользователь, и здесь все тоже работало идеально.

Затем нам нужно было изменить конфигурацию. Это то, что пользователь должен иметь возможность сделать, поэтому мы запустили MyConfigApp.exe и изменили конфигурацию.

Но изменение так и не было считано в MyApp.exe.

Я открыл c:\ProgramData\MyApp\config.xml и увидел в нем старые значения.

Теперь мы обнаружили, что у пользователя нет прав на запись в каталоге ProgramData. Поэтому Windows создала новый файл в VirtualStore, который не используется из MyApp.exe

Мы добавили права записи в ProgramData (и подкаталоги) и удалили файл config.xml из VirtualStore.

НО каждый раз, когда пользователь запускает MyConfigApp.exe, он создает файл в VirtualStore!

Как заставить MyConfigApp.exe читать и записывать файл в ProgramData?

решение1

Я решил это с помощью своего устаревшего приложения, создав .manifestфайл, который размещается рядом с exe. Никаких реальных проблем, просто текстовый файл с именем , MyConfigApp.exe.manifestкоторый содержит что-то вроде XML-кода ниже.

По данным Microsoft (см.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>

Связанный контент