アップデートパッチをNSISで作った件

□今回のアップデートパッチをNSISで作ったがために様々な問題が発生した。
原因はUACのことをあまりよく考えていなかったことによる。

NSISはそもそもがインストーラーであるがゆえにデフォルトで特権での実行を必要とする。
以前はWinRarの自己解凍書庫を想定していた。
ダウンロード完了次第、サイレントモードで解凍してファイルを上書きするというものだ。
…があまりのサイズの大きさのため、上書きでなく差分パッチ方式に改めざるを得なかった。

□ゲーム自体はasInvokerで通常のユーザ権限で実行する前提として、引っかかったとこが2点。
1.パッチをダウンロードし、
2.ダウンロード完了後にCreateProccessでパッチを起動する。

program filesディレクトリ内にインストールされた場合、1の時点でアウトになる。
権限がなければexeファイルを書き込むことができない。
C83はzipでの頒布だったためおそらくわざわざprogram filesディレクトリに突っ込むような奴はいないと思うが、完成版でインストーラー形式での配布を考えているので、ダウンローダー自体を別のプログラムにする必要がある。

CreateProccessはUACの権限昇格メカニズムを起動することはできない。(ゲーム開発者向けのユーザー アカウント制御)
つまりユーザ権限で起動したプログラムから管理者権限を必要とするプログラム(インストーラ形式のパッチ)を起動できない。
権限昇格のことを考えるならShellExecute関数を使うべきだった。

□どうするか考える。

Maleficia自体をrequireAdministratorとして管理者による実行が必須にしてしまう。
アップデート機能が必須なネットゲームはほぼこの形式をとっている。…が同人ゲーでやってるとこ皆無だし、毎回UACダイアログ出てくるのもなぁ。
没。

システムディレクトリにインストールしないように誘導しつつ、NSISパッチを管理者権限で実行しないようにする。
RebRankさんはこれなので業界標準的にこれが正解の可能性は高い。
…が、正直これもどうかと。

これ以上ファイル増えてごちゃごちゃさせたくないのでダウンロード+パッチ起動をconfig.exeに持たせて、UACの実行レベルrequireAdministratorでコンパイルする。
本体側はアップデートチェックだけ行って、ダウンロード+パッチ起動は管理者権限持ったconfig.exeにShellExecuteで投げる、ってのでどうかしら。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です