구성 파일은 VirtualStore에 기록되지만 ProgramData에서 읽습니다.

구성 파일은 VirtualStore에 기록되지만 ProgramData에서 읽습니다.

C:\ProgramData\MyApp에 저장된 config.xml 파일을 사용하는 애플리케이션이 있습니다.

구성 파일은 MyConfigApp.exe를 사용하여 생성 및 편집된 다음 실제 애플리케이션 MyApp.exe에서 읽혀집니다.

설치하는 동안 관리자로 로그인했는데 모든 것이 완벽하게 작동했습니다!. 그런 다음 일반 사용자로 로그인했는데 여기서도 완벽하게 작동했습니다.

그런 다음 구성을 변경해야 했습니다. 이는 사용자가 수행할 수 있어야 하는 작업이므로 MyConfigApp.exe를 시작하고 구성을 변경했습니다.

그러나 변경 사항은 MyApp.exe로 읽혀지지 않았습니다.

c:\ProgramData\MyApp\config.xml과 그 안에 있는 이전 값을 열었습니다.

이제 우리는 사용자에게 ProgramData 디렉터리에 대한 쓰기 권한이 없다는 것을 발견했습니다. 그래서 Windows는 MyApp.exe에서 사용되지 않는 VirtualStore에 새 파일을 생성했습니다.

ProgramData(및 하위 디렉터리)에 쓰기 권한을 추가하고 VirtualStore에서 config.xml 파일을 제거했습니다.

그러나 사용자가 MyConfigApp.exe를 실행할 때마다 VirtualStore에 파일이 생성됩니다!

MyConfigApp.exe가 ProgramData에서 파일을 읽고 쓰도록 하려면 어떻게 해야 합니까?

답변1

.manifestexe와 함께 배치되는 파일을 생성하여 기존 응용 프로그램으로 이 문제를 해결했습니다 . 실제 문제는 없습니다. 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>

관련 정보