Javaで開発され、launch4jでパッケージ化されたヘルパーアプリケーションを呼び出すフロントエンドアプリケーション(PowerBuilderにありますが、これは重要ではありません)があります。
アプリケーションのエンドユーザーは、フロントエンドまたはバックエンドのいずれかによって一部のファイルが生成されるフロントエンドへのパスを自由に構成することができます。
Windows VistaまたはUACがアクティブ化されているWindows7で、ユーザー(管理者権限を持たない)が出力を構成しているC:\
場合、生成されたファイルはディレクトリにサイレントに仮想化されますc:\Users\user_name\AppData\Local\VirtualStore\
。
しかし、プロセスによってJavaアプリケーションFileOutputStream
が同じファイルを(を介して)作成するC:\
場合、Javaは「アクセス拒否」例外で失敗します。これは、ドライブルートにユーザーがアクセスできないという事実に一致している可能性がありますが、他のアプリケーションが仮想化されているという事実。タスクマネージャは、一方が仮想化されており、もう一方が仮想化されていないことを確認します。
両方のアプリケーションが32システムで32ビットであり、マニフェストが両方に含まれていないため、いくつかの手がかりを提供しますが、私の場合には答えを提供しない他のSO質問を見つけました。
JavaをPBアプリケーションのように動作させる方法はありますか(つまり、仮想化されます-それは顧客の要求です)?もちろん、より良い解決策は、パスにアクセスできるかどうかを確認し、アクセスできない場合はユーザーに通知することです。
編集: java.exeバイナリを見ていると、次のようなマニフェストが含まれていることに気付きました(ただし、私はそれについて詳しくありません)
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
多分それは質問の答えです:Javaは設計によって仮想化されていませんか?編集:マニフェストメカニズムが仮想化を無効にすることを理解しました。
EPILOGUE:あなたの説明とあなたの議論が顧客の要求を変えるのを助けてくれたことに感謝します。現在、一部のフォルダーに書き込むための特権の欠如を処理する方が、Windowsにエーテル内のどこかでファイルを仮想化させるよりも優れていることが認められています:o)