
Ich habe eine Anwendung, die eine config.xml-Datei verwendet, die in C:\ProgramData\MyApp gespeichert ist
Die Konfigurationsdatei wird mit MyConfigApp.exe erstellt und bearbeitet und dann von der eigentlichen Anwendung MyApp.exe gelesen.
Bei der Installation war ich als Administrator angemeldet und alles hat einwandfrei funktioniert! Anschließend haben wir uns als normaler Benutzer angemeldet und auch hier hat es einwandfrei funktioniert.
Dann mussten wir eine Konfiguration ändern. Das sollte ein Benutzer tun können, also starteten wir MyConfigApp.exe und änderten die Konfiguration.
Die Änderung wurde jedoch nie in MyApp.exe eingelesen.
Ich habe c:\ProgramData\MyApp\config.xml geöffnet und die alten Werte waren darin.
Nun haben wir festgestellt, dass der Benutzer keine Schreibrechte im ProgramData-Verzeichnis hat. Daher hat Windows eine neue Datei im VirtualStore erstellt, die von MyApp.exe nicht verwendet wird.
Wir haben Schreibrechte in ProgramData (und Unterverzeichnissen) hinzugefügt und die Datei config.xml aus VirtualStore entfernt.
ABER jedes Mal, wenn der Benutzer MyConfigApp.exe ausführt, wird eine Datei im VirtualStore erstellt!
Wie bringe ich MyConfigApp.exe dazu, die Datei in ProgramData zu lesen und zu schreiben?
Antwort1
Ich habe dies bei meiner Legacy-Anwendung gelöst, indem ich eine .manifest
Datei erstellt habe, die neben der EXE-Datei platziert wird. Keine wirklichen Probleme, nur eine Textdatei namens, MyConfigApp.exe.manifest
die so etwas wie den folgenden XML-Code enthält.
Laut Microsoft (siehehttps://msdn.microsoft.com/en-us/library/bb756929.aspx) eine EXE mit einer nebeneinander angeordneten Manifestdatei wie der folgenden nimmt nicht an der Dateisystemvirtualisierung teil, da eine bestimmte Ausführungsebene angefordert wird, und fügt daher dem VirtualStore eines Benutzers keine Dinge hinzu.
Beachten Sie jedoch, dass das SystemWilleVerwenden Sie VirtualStore, wenn dort bereits Dateien vorhanden sind. Hier ist der Manifestcode:
<?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>