metro-desktop 間のループバックには CheckNetIsolation コマンドで設定する

metro-desktop のプロセス間通信の続き

[win8] metro アプリケーションからデスクトップアプリにプロセス間通信する | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/3379
[win8] MetroアプリからDesktopアプリへWCFで接続する | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/3387
[win8] metro-desktopのプロセス間通信をWeb API風にする | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/3395

上記なところで、metro アプリから desktop アプリへ WCF/WebAPI 通信を行う実例を示しましたが、実は metro アプリを visual studio 11 上でデバッグ実行した時しか動かなくて、パッケージを作って metro アプリをインストールした時には「ローカルコンピュータに繋がらない」という現象になりました…つーか、もともと「ループバックはつながらない」と @biac さんから聞いていたものの、「なんか動くから、ええやん」って気分で突き進んでいたのが問題。

windows 8 の metro アプリの方針として「インストール/アンインストールは安全にできる」、「実行時に他の環境を壊さない」というものがあるので、他アプリとの直接的なプロセス間通信の手段が用意されていません。当然「ループバック」(自分自身への送受信)もガードされています。
実は、ループバック自体はガードしなくてもよいのですが、今回私がやっているように、desktop アプリ側に WCF サーバーを立てて、metro アプリでクライアントを立てると安々とプロセス間通信ができてしまうんですよね。プロセス間通信自体は悪いことではないのでしょうが、desktop アプリとの複雑な連携をしてしまうと「安全な metro アプリ」の保証ができない、といったとこrでしょうか。そもそも、通常の metro アプリ自体は単体でインストールされることになるので、desktop アプリと連携を取ることはありませ。なので、WCF/WebAPI 通信をするにしても、インターネットやイントラネット上の WEB サーバーがなどが相手先になるのです。通信手段が、Http プロトコルしか用意されていないのも、そのあたりの制限だと思います(C++/CX の場合はその限りではないのですが)。

なので、

  • metro アプリ → 他コンピュータの WCF サーバーは接続可能
  • metro アプリ → 自コンピュータの WCF サーバーは接続不可

の状態が初期値になっています。

ですが、Windows Store を通さない業務アプリだったり、開発段階で1台のマシンでデバッグしたい場合にはこの制限は不便です。特にデバッグ時は、サーバーアプリとクライアントアプリ(metroアプリ)を連携させながらデバッグしたいハズです。
なので、Visual Studio 11 では、デバッグ実行時のみ、ループバックが有効になるフラグが付けられています。

*.appxmanifest ファイルをダブルクリックして、「デバッグ」のタブを開くと「ローカルネットワークのループバックを許可」にチェックが入っています。これにより、デバッグ実行をした時にループバックが有効になります。

さて、Visual Studio 11 によるデバッグ時にはこれでもいいのですが、業務アプリの場合はどうしましょうか?つーか、これじゃ使えねーよ、ってな具合なので、探しましたよ~

How to enable loopback and troubleshoot network isolation
http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx

そのものズバリの対処方法が公式に載っていました。「CheckNetIsolation.exe LoopbackExempt」というコマンドを使います。試してみると、管理者権限でない通常の DOS プロンプトでも使えるコマンドなので、desktop アプリのインストール時に一緒に実行すると良いかと。

ざっと、要点だけを抜き出すと。


CheckNetIsolation.exe LoopbackExempt -s 			リスト出力
CheckNetIsolation.exe LoopbackExempt -a -p=<SID>	SID 指定でループバックを許可
CheckNetIsolation.exe LoopbackExempt -d -p=<SID>	SID 指定でループバックを不許可
CheckNetIsolation.exe LoopbackExempt -a -n=<name>	パッケージファミリ名指定でループバックを許可
CheckNetIsolation.exe LoopbackExempt -d -n=<name>	パッケージファミリ名指定でループバックを不許可

という具合です。パッケージの作り方は、

[Metro Style] #Win8 #Metro のアプリケーション・パッケージ: biac の それさえもおそらくは幸せな日々@nifty
http://bluewatersoft.cocolog-nifty.com/blog/2012/02/metro-style-w-1.html

を参照してください。Visual Studio 11 の入っていない素な環境で試す時は、下記のように「開発者用ライセンス」も取得します。

windows consumer preview / 開発環境の入っていないPCにMetrostyle appsをデプロイする – code+code-
http://code.hatenablog.com/entry/2012/04/05/014341

# windows store を通さない場合は、enterprise edition を用意するかこの開発者ライセンスを入れないと駄目な模様なので、社内展開する場合は、ちょっと工夫がいりそうです。

CheckNetIsolation コマンドを使ってバッチなどで登録する場合、事前に「パッケージファミリ名」が必要になります。これは、*.appxmanifest ファイルの「パッケージ化」のところの「パッケージ ファミリ名」を使います。SID のほうは、インストールするまで分からないので、事前には取れません。

# 「パッケージ名」じゃなくて「パッケージファミリ名」というのが曲者ですね。

このコマンド、実行すると即、許可/不許可を反映させてくれます。metro アプリがバックグラウンドで立ち上がったままでも、コマンドを実行すると許可/不許可が即反映される訳です。

これで、プロセス間通信として、WCF/WebAPIが使えますね…というか、もともとは「プロセス間通信」をしたかっただけなので、HTTP プロトコル経由はちょっとオーバーヘッドが大きすぎる。もうちょっと内部的にデータのやり取りができないかと更に模索中です。

カテゴリー: 開発, windows 8 パーマリンク