もし、書いてある内容から「こうすれば出来るんじゃ?」というアイデアがありましたら教えて下さい。
今回は、
「管理者権限なしでポータブル化できないか」が主なテーマです。
(注)追記アリ
これまでのエントリをご覧になった方は"「管理者権限で実行」は必須なんだ"、ということで納得していただいていましたが、その後も何とかこれを解決できないかチビチビと調べておりました。
まず、管理者権限を必要としていたポイントを整理します。
- HDD側のユーザホームに.appinventorフォルダーを作るため
- JavaWebStartを実行できるようにするための.jnlpの関連付け
この2つについて管理者権限が必要だったわけですが、これを必要ないように工夫すればよいということで考えてみたのが
- HDD側のユーザホームに書き込む場合、セキュリティ上の理由で管理者権限が必要になるのであればUSB側をユーザホームとして認識させることはできないか
- .jnlpへのファイル関連付けはassocとftypeコマンドで管理者権限の必要なレジストリ変更が必要だったが、管理者権限の必要ないレジストリ領域の変更で実現できないか
という2つの課題です。
これらを実現する方法として
- BlocksEditorを実行するJavaWebStart(JavaVM)が認識するユーザホームをUSBメモリにする
- .jnlpファイル関連付けを管理者権限不要なHKCU(HKEY_CURRENT_USERキー)領域に設定する
というものが考えられます。
1つ目のJavaWebStartが認識するユーザホームをUSBメモリにする方法ですが、javaws.exeに次の引数を渡すことで実現できます。
-J-Duser.home=<ユーザーフォームの位置>2つめのファイル関連付けですが、
HKCU\Software\Classes\.jnlp\shell\open\command
(追記)
その後、XPで動作しない原因はキーの空の値名は/veオプション必須であることが判明したのでそれを反映すると共に、変更するレジストリキーの見直しをして以下の3つを変更することにしてみました。
HKCU\Software\Classes\jnlp_auto_file\shell\open\command特に最後のUserChoiceキーに新規に設定したProgIdを入れておくことでHKCRの値よりも優先されるという情報を基にした設定になっています。
HKCU\Software\Classes\.jnlp
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.jnlp\UserChoice\ProgId
なお、ProgIdがすでに存在している場合はシステムによって設定された値として扱われるため削除や変更ができません。通常、.jnlpファイルに割り当てられるProgIdの値はjnlp_auto_fileになっていると思いますので、この値に合わせて
jnlp_auto_file\shell\open\command
の値をUSBメモリのjavaws.exeにすることで対応できるのではないかと思います。
レジストリのHKCUは管理者権限不要なので上記2点をバッチファイルで設定するようにしてやれば「管理者権限で実行」は必要無くなり、バッチファイルをダブルクリックでポータブル環境を作ることができるようになります。
この考え方に基づき作ったバッチファイルは現在のところWindows8 Enterprise評価版の管理者権限を持たないユーザ環境とWindowsXPSP3とWindows7HP(追記)の管理者権限を持つユーザの「管理者権限で実行」を使わない状況で正しく動作することを確認しました。
とはいうものの、レジストリ変更を伴うことに不安もあるかもしれません。そういう場合は予めレジストリバックアップしたり、復元ポイントを作成したりするなどして対策する他ありませんので不安な方は必ず対策してください、という注意点は必須になるかもしれません(十分に検証され、問題点が洗い出されればそういう不安も払拭できますが)。
これまでの「管理者権限で実行」していた部分はもっとシステムに近い部分のレジストリ書き換えだったので、実は今回の書き換えよりもより慎重を要するものでしたので、それに比べればユーザ権限で書き換えられる範囲のものでリスクも低くなるのではないか、と勝手に思っております(もちろん、自己責任+未保証ですがw)。
ご興味のある方はコメントいただければ幸いです。
(追記)
その後、Windows7での動作確認をしたのですがうまく動作しないケースがありました(最終的には動作しましたが)。これは、過去にJavaを導入していたことで.jnlpファイルの関連付け設定がレジストリに残っていたことが原因のようです。
となると、上記で紹介したレジストリ設定ではそのような設定(関連付けそのものは解除されているが空の設定)が残っていることによりうまく動作しないことになります。
アンインストーラでこのあたりの設定がキレイになってくれるとありがたいのですが、なかなかそうも行かないケースもあるので難しいところです。
もう少しうまい解決方法を検討してみる必要がありそうです。
0 件のコメント:
コメントを投稿