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