以前、移動ユーザプロファイル環境でClickOnceアプリケーションを利用する方法を考えてみましたが、
今回は展開する方法を考えてみます。
アプリケーションは、「http://100.100.100.100/test.application」より展開するものとします。
ClickOnceアプリケーションは、IEの引数としてURLを指定するとダウンロードとインストールが開始
されるのですが、検証していたXenApp7.15 LTSR CU5ではうまく動作しません。
公開アプリケーションにはIEを設定し、引数には先ほどのURLを設定しています。
Windows 2016を利用しているため、環境に左右される可能性があることは否めないのですが、謎です。
プロセスとしては起動するのですがすぐに終了してしまいます。
通常、ClickOnceアプリケーションは、dfsvc.exeから起動されるのですが、このプロセスがなぜか
起動してきませ。
ブラウザの引数としてURLを指定する以外に次の方法があります。
【案1】ダウンロードしたtest.applicationをダブルクリックして実行する
【案2】rundll32.exe経由でdfshim.dllを呼び出し、ShOpenVerbApplication APIより起動する
案1では、事前にダウンロードして実行することになるため、最新の状態を保つことが難しく
なります。頻繁に更新が発生しないようなアプリケーションでは、Windowsタスクとして
PowerShellコマンドの「Invoke-WebRequest」を実行し、定期的にファイルをダウンロードして
対応できそうですが、頻繁に更新が発生するようなアプリケーションには対応できません。
そこで考えられるのが案2です。
具体的な呼び出し方法ですが、次のようになります。
"C:\Windows\System32\rundll32.exe" "C:\Windows\System32\dfshim.dll",ShOpenVerbApplication http://100.100.100.100/test.application
公開アプリケーションとしてrundll32.exeにし、引数としてそれ以外を設定すると動きそうなのですが
dfsvc.exeが起動してこずに利用できませんでした。
ちなみに、Rudll32.exeのショートカットを作成し、引数に以降の文字列を設定すれば普通に起動してきます。
ネットでいろいろ調べてみると、「start-process dfsvc.exe」を事前に実行することで動作するような情報を
見かけたので早速試してみたのですが、何かが足りないようでClickOnceアプリケーションが起動できませんで
いろいろ試したのですが、唯一起動できたのがexplorer.exeの引数にダウンロードした.applicationファイルを
指定する方法でした。
とりあえず動けばいいので適当にPowerShellスクリプトを用意しました。
--------------------------------------------------------------------------------
if ($args.count -eq 0) {
Write-Host "引数にURLを指定してください."
exit 1
}
$AppURL = $args[0]
$AppFile = $env:TEMP+"\"+$AppURL.Substring($AppURL.LastIndexOf("/")+1)
Invoke-WebRequest $AppURL -outfile $AppFile
Start-Process explorer.exe $AppFile
--------------------------------------------------------------------------------
公開アプリケーションにスクリプトを登録し、引数にアプリケーションが公開されている
URLを指定するとClickOnceアプリケーションが起動してきました。
しかし、ここで問題が。
公開アプリケーションを終了してもセッションが残ったままです。切断やアイドルにもならず
アクティブな状態でセッションが残っています。
Process Explorerで確認すると、ClickOnceアプリケーションが利用しているdfsvc.exeのプロセスが
終了せずに残っています。
対応方法ですが、CTX139525として公開されている情報をもとにLogoffCheckSysModulesのレジストリへ
dfsvc.exeを登録するとプロセスが残っている状態でもセッションは終了されるようになるのですが、
ここでも問題が。
dfsvc.exeよりClickOnceアプリケーションが起動されるのですが、ClickOnceアプリケーションの起動を
待たずにログオフしてしまいます。CTX139525の内容からすると正しい動きのようです。
こちらの対応方法ですが、XenAppのポリシーに「ログオフチェッカーの起動までの待機」があり、この
ポリシーがデフォルトでは「0」に設定してあるので「60」等の値を設定し、ログオフチェッカーが起動
するのを遅延させます。
ClickOnceアプリケーションは、なかなか難しいですね。