1

У меня есть приложение, которое использует файл 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 ответ1

1

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

Согласно Microsoft (см. Https://msdn.microsoft.com/en-us/library/bb756929.aspx) EXE-файл с параллельным файлом манифеста, подобным приведенному ниже, не будет участвовать в виртуализации файловой системы, поскольку запрашивается определенный уровень выполнения, и поэтому он не будет добавлять вещи в виртуальный магазин пользователя.

Однако следует помнить, что система будет использовать 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>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .