我有一个应用程序使用存储在 C:\ProgramData\MyApp 中的 config.xml 文件
使用 MyConfigApp.exe 创建和编辑配置文件,然后由实际应用程序 MyApp.exe 读取。
在安装过程中,我以管理员身份登录,一切运行正常!然后我们以普通用户身份登录,这里一切运行正常。
然后我们需要更改配置。这是用户应该能够做的事情,所以我们启动了 MyConfigApp.exe 并更改了配置。
但这个变化从未被读入MyApp.exe。
我打开了 c:\ProgramData\MyApp\config.xml 并且旧值就在其中。
现在我们发现用户在 ProgramData 目录中没有任何写入权限。因此 Windows 在 VirtualStore 中创建了一个新文件,但 MyApp.exe 不会使用该文件
我们在 ProgramData(和子目录)中添加了写入权限,并从 VirtualStore 中删除了 config.xml 文件。
但是每次用户运行 MyConfigApp.exe 时,它都会在 VirtualStore 中创建一个文件!
如何让MyConfigApp.exe读取和写入ProgramData中的文件?
答案1
我通过创建一个.manifest
文件(与 exe 放在一起)解决了这个问题。没有真正的问题,只是一个名为的文本文件,MyConfigApp.exe.manifest
其中包含类似下面的 XML 代码。
据微软称,(见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>