none
UAC関連だと思いますが、例えば「C:\」直下にファイルを書きこもうとした際の振る舞いの違いについて RRS feed

  • 質問

  • Windows 7を開発環境として使い、.Net Frameworkを用いたプログラミングで生じた現象の違いの理由がわからずにおります。

    1) 新たに作ったプログラムでは、「C:\」直下にファイルを書きだそうとすると、通常権限で実行時には例外が発生します。管理者権限で実行した場合には書きだせます。この動作は理解できています。

    2) 一方で、通常権限で実行している場合でも、とりあえず書き出せたように見えるプログラムもあります。実際には、「C:\Users\tonoike\AppData\Local\VirtualStore」に書きだされているのですが。

    どうも、昔作ったプログラムで、当時ビルドしたexeファイルをそのまま実行している場合には、2) になるようです。同じソリューションを今のVisual Studioに読み込んで、ビルドしなおすと上記1)の動作になります。自分が作ったものでなくても、古いソフトだと、2) の挙動になるものがあります。

    1)と2)の挙動の違いを決めるものは、exeファイルのどこかにあるのでしょうか?

    2019年12月10日 23:20

回答

  • どちらの動作になるかは、タスクマネージャーの[詳細]タブにおける、[UAC 仮想化]列の内容で確認できます。

    EXE 単位では、 アプリケーション マニフェスト における requestedExecutionLevel 要素で指定されています。この指定が無い場合、OS 側で UAC 仮想化によってファイルおよびレジストリの仮想化(VirtualStore へのリダイレクト)が行われます。

    Visual Studio 2008 以上で開発した .NET アプリなら、プロジェクト内の app.manifest で編集することができます。app.manifest での既定値は <requestedExecutionLevel level="asInvoker" uiAccess="false" /> です。

    アプリケーション マニフェストは通常、EXE 内にリソースとして埋め込まれるようになっていますが、古い EXE では、アプリケーションマニフェストが埋め込まれていないこともあります。この場合、EXE と同じフォルダに AppName.exe.manifest のファイルとして配置することでマニフェストを指定できます。

    2019年12月10日 23:36
  • app.manifest 内の requestedExecutionLevel 要素を削除すれば、古い EXE と同じ動作になるでしょう。

    その逆に VS2005 などの古い環境でマニフェストを埋め込む方法は、 KB944276 にて解説されています。

    マニフェスト設定そのものの解説はこのあたり

    2019年12月11日 1:37

すべての返信

  • どちらの動作になるかは、タスクマネージャーの[詳細]タブにおける、[UAC 仮想化]列の内容で確認できます。

    EXE 単位では、 アプリケーション マニフェスト における requestedExecutionLevel 要素で指定されています。この指定が無い場合、OS 側で UAC 仮想化によってファイルおよびレジストリの仮想化(VirtualStore へのリダイレクト)が行われます。

    Visual Studio 2008 以上で開発した .NET アプリなら、プロジェクト内の app.manifest で編集することができます。app.manifest での既定値は <requestedExecutionLevel level="asInvoker" uiAccess="false" /> です。

    アプリケーション マニフェストは通常、EXE 内にリソースとして埋め込まれるようになっていますが、古い EXE では、アプリケーションマニフェストが埋め込まれていないこともあります。この場合、EXE と同じフォルダに AppName.exe.manifest のファイルとして配置することでマニフェストを指定できます。

    2019年12月10日 23:36
  • ありがとうございます。

    ところで、参考までに・・・、

    「古いexe」、つまり、アプリケーションマニフェストが埋め込まれていない状態を、今の開発環境によるビルドで再現することはできるのでしょうか? .Net FrameworkとVisual Studioを用いる前提ですが・・・。

    あるいは、アプリケーションマニフェストの指定で、リダイレクトが行われる設定はできるのでしょうか?


    2019年12月11日 0:02
  • app.manifest 内の requestedExecutionLevel 要素を削除すれば、古い EXE と同じ動作になるでしょう。

    その逆に VS2005 などの古い環境でマニフェストを埋め込む方法は、 KB944276 にて解説されています。

    マニフェスト設定そのものの解説はこのあたり

    2019年12月11日 1:37
  • 詳細な情報、大変ありがとうございました。さっそく試してみます。
    2019年12月12日 3:58