設定ファイルはVirtualStoreに書き込まれますが、ProgramDataから読み取られます

設定ファイルはVirtualStoreに書き込まれますが、ProgramDataから読み取られます

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>

関連情報