2013年1月13日日曜日

AppInventor Portable for Windows(仮) Part6

 さて、App InventorをUSBメモリに詰め込んで持ち歩いてしまおうというお話のPart6を書きます。

 ただし、今回書く内容はまだXP環境ではうまく動いていないので概略のみ書きたいと思います。

 もし、書いてある内容から「こうすれば出来るんじゃ?」というアイデアがありましたら教えて下さい。



今回は、
管理者権限なしでポータブル化できないか」
が主なテーマです。

(注)追記アリ



 これまでのエントリをご覧になった方は"「管理者権限で実行」は必須なんだ"、ということで納得していただいていましたが、その後も何とかこれを解決できないかチビチビと調べておりました。

 まず、管理者権限を必要としていたポイントを整理します。

  1. HDD側のユーザホームに.appinventorフォルダーを作るため
  2. JavaWebStartを実行できるようにするための.jnlpの関連付け
この2つについて管理者権限が必要だったわけですが、これを必要ないように工夫すればよいということで考えてみたのが
  1. HDD側のユーザホームに書き込む場合、セキュリティ上の理由で管理者権限が必要になるのであればUSB側をユーザホームとして認識させることはできないか
  2. .jnlpへのファイル関連付けはassocとftypeコマンドで管理者権限の必要なレジストリ変更が必要だったが、管理者権限の必要ないレジストリ領域の変更で実現できないか
という2つの課題です。


これらを実現する方法として

  1. BlocksEditorを実行するJavaWebStart(JavaVM)が認識するユーザホームをUSBメモリにする
  2. .jnlpファイル関連付けを管理者権限不要なHKCU(HKEY_CURRENT_USERキー)領域に設定する
というものが考えられます。

 1つ目のJavaWebStartが認識するユーザホームをUSBメモリにする方法ですが、javaws.exeに次の引数を渡すことで実現できます。
-J-Duser.home=<ユーザーフォームの位置>
2つめのファイル関連付けですが、この方法がまともな方法かどうかは分かりませんが
HKCU\Software\Classes\.jnlp\shell\open\command
にUSBメモリ上にあるjavaws.exeの上記引数付きをreg.exeコマンドでaddするというものです(色々試したのですがこれしかうまく行かなかったのです。他に適切な方法がありましたら教えて下さい)。

(追記)

その後、XPで動作しない原因はキーの空の値名は/veオプション必須であることが判明したのでそれを反映すると共に、変更するレジストリキーの見直しをして以下の3つを変更することにしてみました。
HKCU\Software\Classes\jnlp_auto_file\shell\open\command
HKCU\Software\Classes\.jnlp
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.jnlp\UserChoice\ProgId
特に最後のUserChoiceキーに新規に設定したProgIdを入れておくことでHKCRの値よりも優先されるという情報を基にした設定になっています。

なお、ProgIdがすでに存在している場合はシステムによって設定された値として扱われるため削除や変更ができません。通常、.jnlpファイルに割り当てられるProgIdの値はjnlp_auto_fileになっていると思いますので、この値に合わせ

jnlp_auto_file\shell\open\command

の値をUSBメモリのjavaws.exeにすることで対応できるのではないかと思います。


 レジストリのHKCUは管理者権限不要なので上記2点をバッチファイルで設定するようにしてやれば「管理者権限で実行」は必要無くなり、バッチファイルをダブルクリックでポータブル環境を作ることができるようになります。

 この考え方に基づき作ったバッチファイルは現在のところWindows8 Enterprise評価版の管理者権限を持たないユーザ環境とWindowsXPSP3とWindows7HP(追記)の管理者権限を持つユーザの「管理者権限で実行」を使わない状況で正しく動作することを確認しました。

 しかし、レジストリ変更部分がWindowsXPの環境ではうまく動作せず、解決方法が見えていないため対策を検討しているところです(手動で設定すれば動作します)。

 対策があるとすれば、コマンドラインにレジストリ設定内容を記述するのではなく、*.regファイルに入れてバッチファイル中でドライブレターなどが変化した場合の*.regファイル変更を動的に行うようにすること・・・でできる可能性がありますが、*.regファイルをバッチファイルで書き換えてしまった場合にきちんと動作するのか、など懸念事項も残っています。

 まあ、実験なのでやってみるしか無いのですが。

 とはいうものの、レジストリ変更を伴うことに不安もあるかもしれません。そういう場合は予めレジストリバックアップしたり、復元ポイントを作成したりするなどして対策する他ありませんので不安な方は必ず対策してください、という注意点は必須になるかもしれません(十分に検証され、問題点が洗い出されればそういう不安も払拭できますが)。

 これまでの「管理者権限で実行」していた部分はもっとシステムに近い部分のレジストリ書き換えだったので、実は今回の書き換えよりもより慎重を要するものでしたので、それに比べればユーザ権限で書き換えられる範囲のものでリスクも低くなるのではないか、と勝手に思っております(もちろん、自己責任+未保証ですがw)。

 ご興味のある方はコメントいただければ幸いです。

(追記)
 その後、Windows7での動作確認をしたのですがうまく動作しないケースがありました(最終的には動作しましたが)。これは、過去にJavaを導入していたことで.jnlpファイルの関連付け設定がレジストリに残っていたことが原因のようです。

 となると、上記で紹介したレジストリ設定ではそのような設定(関連付けそのものは解除されているが空の設定)が残っていることによりうまく動作しないことになります。

 アンインストーラでこのあたりの設定がキレイになってくれるとありがたいのですが、なかなかそうも行かないケースもあるので難しいところです。

 もう少しうまい解決方法を検討してみる必要がありそうです。


0 件のコメント:

コメントを投稿

おすすめ書籍