2014年11月7日金曜日

ThinAppではジャンクションが機能しない

WindowsXPでしか動作しないアプリをThinAppを使ってWindows7や8に移行したい、と
お考えの方はまだきっといると思います。

むか~しに一度本現象を確認していたのですが、最近とあるアプリでも問題となりそうな
ケースに遭遇しましたので、紹介しておきます。

ThinApp(仮想ファイルシステム)ではジャンクションが機能しな

ジャンクションとは、例えばXP時代に存在したパス(C:\Documents and Settings)を新しい
パス(C:\Users)に自動で読み替えてくれるOS標準搭載の互換性を補う機能です。

この機能によって、WindowsXP向けに作られたアプリが"C:\Documents and Settings"に
アクセスしようとした場合、Windows7では意識せず、"C:\Users"で処理が行われるという
スグレモノです。

ジャンクションは「dir /a/p」コマンドで確認が出来ます。

そんなスグレモノのジャンクションですが、ThinAppでは正常に動作しないのでご注意を。。

実際の動きと無理やり動作させる方法をご紹介しますので、ご興味のある方はどうぞ。


まず、以下のフォルダ、ファイル、ジャンクションを[物理ファイルシステム]に構成。

[物理ファイルシステム]
C:\
 ┣src\
 ┃┗ hoge.txt
 ┗dst\ ⇒ [C:\src]へのジャンクション

この場合、「C:\src」「C:\dst」いすれのパスでも「hoge.txt」が参照可能です。

次に、仮想アプリからの動作を確認するために、[仮想ファイルシステム]に、以下のフォルダ、
ファイルを構成し、コマンドプロンプトが使えるようにパッケージングします。

[仮想ファイルシステム]
%drive_C%
 ┗src\
  ┗ test.txt


仮想化したコマンドプロンプトから各フォルダを参照すると、「C:\src」には、物理ファイルシステムに存在する「hoge.txt」、仮想ファイルシステムに存在する「test.txt」の両方が表示されます。

ジャンクションである「C:\dst」を参照した場合、「C:\src」にリンクされて同様に両方のテキストファイルが参照されると思いきや、物理ファイルシステムの「hoge.txt」しか表示されません。

推測ですが、仮想アプリケーションからファイルの参照が行われた場合、まずは仮想ファイルシステムが参照され、「C:\dst」が「C:\src」のジャンクションであることは認識されず、あくまで「C:\dst」にはファイルは存在しないという結果が返されます。

その後、物理ファイルシステムの参照が行われ、はじめて「C:\dst」が「C:\src」のジャンクションであることを認識し、「C:\src\hoge.txt」が参照されるものの、再度仮想ファイルシステム内の「%drive_C%\src」を参照してくれる訳ではなさそうです。

この現象がどんなアプリに影響するかですが、かなりピンポイントなのでご安心を。(笑

1. ジャンクションにアプリのデータが格納される。
2. アプリがジャンクションに対して明示的なパスでアクセスする。

アプリからのアクセスが明示的なパスではなく、%ALLUSERPROFILE%などの"環境変数"を使っているような場合は問題ありません。
なぜなら、ジャンクションにアクセスする以前に、環境変数によって動作しているOSにとって
しかるべきパスに読み替えられるからです。

私の経験では、某グループウェアの古いクライアントソフトはIDファイルを上記ジャンクション配下に格納し、iniファイルに書かれたフルパスでアクセスしており、本問題に該当しました。

皆さんがパッケージ化されるアプリはおそらく大丈夫だと思いますが、頭の片隅にでも。

さいごに、その対処法を紹介しておきます。

ジャンクションを仮想ファイルシステム内に実体として配置すればOKです。

[仮想ファイルシステム(対処後)]
%drive_C%
 ┣src\
 ┃┗ test.txt
 ┗dst\
  ┗ test.txt

これで、「C:\src」「C:\dst」いずれのパスからも「test.txt」にアクセス可能になります。
※但し、両者は実体が異なるので、ファイルを書き換えるアプリの場合はご注意を。
 アクセス方法によりますが、今回の場合だと、「C:\dst\test.txt」が書き換わります。

0 件のコメント:

コメントを投稿