2

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)

4

3 に答える 3

3

多分それは質問の答えです: Java は設計上仮想化されていませんか?

見つけたマニフェストからわかるように、JavaはUACに対応していると考えるより良い方法だと思います。Java は UAC に対応しているため、Windows は Java が何をしているかを認識していると判断します。マニフェストは管理者権限を要求せず、標準ユーザーによって実行されるため、Windows は保護されたディレクトリ (C:\) への書き込みを適切に禁止し、アクセス拒否エラーが発生します。

http://msdn.microsoft.com/en-us/library/windows/desktop/bb756960.aspxの警告に注意してください

仮想化は、Windows Vista で標準ユーザーとして実行されるアプリケーションの互換性の問題を改善するために実装されています。開発者は、以降のバージョンの Windows に存在する仮想化に依存してはなりません。

あなたの顧客が本当に仮想化が良いことだと思っているなら、Java にロボトミーを与え、そのマニフェストを削除する何らかの方法を見つける必要があります。次に Windows は、Java が何をしているかを認識していないと判断し、仮想化をオンに戻します。または、Java コードで仮想化を自分で実装し、ルート ドライブ、プログラム ファイルなどへのアクセスを検出し、それらを c:\Users\user_name\AppData\Local\VirtualStore\ パスに置き換えます。

exeをハッキングせずに、UAC対応アプリケーションの仮想化をオンに戻す方法があるかもしれませんが、私はそれを見つけることができませんでした.

最終的な代替手段は、新しい Java ランナーを生成する exe4j のようなものかもしれません。exe4j を使用すると、結果の実行可能ファイルが UAC に対応するかどうかを構成できると思います。あなたの場合、UAC を認識しない (マニフェストなし) exe を作成する必要があります。次に、java.exe の代わりに新しい exe を使用します。http://www.ej-technologies.com/products/exe4j/overview.htmlを参照してください。

于 2012-09-25T16:29:34.063 に答える
2

これを処理するより良い方法は、power basic アプリで仮想化を無効にすることです。

これを行うには、マニフェストにセクションを追加して、プロセスがビスタ対応であることを示します。詳細については、MSDNを参照してください。

于 2012-09-25T15:32:14.383 に答える
2

<requestedPrivileges>のアプリケーション マニフェストに 要素が見つかりましたjava.exe。これにより、Java UAC が認識されます。Javaは明示的に標準ユーザーの権限を要求するため、仮想化はオフになっています。

すでに述べたように、仮想化は古いアプリケーションを可能な限りシームレスに機能させるために存在します。したがって、PowerBuilder フロントエンド アプリケーションに適切なマニフェストを追加して、Windows で仮想化を無効にすることをお勧めします。

もう 1 つの提案はAccess Denied、Java でエラーを処理し、代わりに仮想化された場所を試すことです。しかし、これは実際の修正ではなく回避策です。仮想化に頼るべきではありません


両方の部分が同じ側にない限り、パスにアクセスできるかどうかを確認するのは難しいです。1 つが仮想化されていて、もう 1 つが仮想化されていない場合、現在見ているのと同じ問題に直面します。つまり、指定されたフォルダーにファイルを作成できるかどうかのチェックを PB に実装すると、システムが呼び出しを仮想化するため、成功します。同時に、バックエンドは失敗します。

于 2012-09-26T06:50:25.960 に答える