スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

別プロセスで実行時に外部exeを叩いたらセキュリティ警告でハマった話

ほっぽの遠征帰投時のサウンド再生でハマりました。

どういう仕組かというと、
・サウンド再生部分を別プロセスとして起動する必要があった(理由は後述)
・別プロセスとして起動するなら、exeを別にしてファイルやオプションをコマンドライン引数で渡して本体からProcess.Startで叩いちゃえばいいだろう

確かにこれは「開発しているPC」だと正常に動作するんですが、zipで配布したときにProcess.Startのたびにセキュリティの警告が表示されて、ユーザー側がダイアログ地獄になってしまう…というどうしようもない現象が起きてしまいます。しかも、このセキュリティの警告はいったんオンライン上にあげてダウンロードしないと発生しないんで、開発者側が普通にローカルでビルドしたファイルで検証してると見逃してしまうという厄介なもの。

まずは別プロセスとして実行しなきゃいけない理由は、
・ゲーム本体の消音にCore Audio APIを使用している
・Core Audio APIはプロセス単位でミュートや音量の設定を行う
・通知音を本体と同じプロセスで鳴らすと、本体がミュートされているときに通知音が鳴らない
というわけです。

じゃあセキュリティの警告を表示させないにはどうしたらよいかというと、ぱっと考えて2つありました。
1.別プロセスとして叩くexeを管理者権限でProcess.Startする
参考:http://dobon.net/vb/dotnet/system/runelevated.html
→確かにセキュリティの警告ダイアログは消えるけど、今度はUACのダイアログが表示されてしまう。これを消すのはセキュリティの警告より厄介?だし、本来の管理者権限の使い方ではない。

というわけで2番目を採用しました。
2.別プロセスのexeを本体のリソースに埋め込んで、バイナリからテンポラリファイルに書き込んでProcess.Startする
参考:http://oshiete.goo.ne.jp/qa/7378084.html
→セキュリティの警告は本体の起動時のみ表示されるので、警告表示が本来の意図のもとに行われている。管理者権限も必要ない。埋め込んで自己解凍→ローカルファイルとして見せて警告回避してるのはセキュリティ的にどうなの?っていう懸念はあるけど、埋め込みがウイルスだったら本体起動する時点で対策ソフトが気づいてくれるはず?

ただしこの方法は2つ注意点があります。
a:別プロセスのexeにdll等のライブラリがある場合、このexeにマージする必要がある
・ILMergeを使いました
参考:http://qiita.com/krsak/items/75a257cc0866a7e8e4aa
・ただし、このままだとエラーを起こしてマージできないので、/targetplatformのオプションをつけます(ビルドイベントでなくてもコマンドラインからの同様のオプション付与でOK)
参考:http://someprog.blog.fc2.com/blog-entry-5.html
b:バイナリからテンポラリに書き込んだのち、別プロセスが終了後にテンポラリを消す場合(多くの場合そう?)、WaitForExitで終了を待ってからDeleteしないといけない。ここで、WaitForExitは終了までスレッド単位でブロックするので、Proces.StartからDeleteまでの操作を別スレッドとして処理しないと、別プロセスが起動している間本体の操作不可能になる。
これは少し気をつければOK

特にaがややこしいく、別プロセスをアップデートする際の手間がかなり大きくなってしまいます。もう少しいい方法はないもんなんでしょうかね?
スポンサーサイト
プロフィール

こしあん

Author:こしあん
(:3[____]
【TwitterID : koshian2】
【ほしい物リスト】http://goo.gl/bDtvG2

Twitter
カウンター
天気予報

-天気予報コム- -FC2-
カテゴリ
月別アーカイブ
最新記事
最新トラックバック
検索フォーム
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。