続・Infopath ボタンクリックでローカルにフォームを保存したい2

前回のトライで、コードを記述することで、ボタンクリックで Infopath のフォームをローカルに保存させることに成功したのすが、これを本番環境で実行しようとしたらセキュリティ管理者に怒られました。いくらイントラ内とはいえ、それは駄目だろうと。

いや私もね、ちょっとヤバイかな~とは思っていたのですが^^;;; スクリプトでローカルに触れるということは、つまるところウィルスの挙動と同じなんですよね。それはりっぱなセキュリティホールだと。

まあ、実際にはイントラですから、その穴を突かれている時点で、ファイアウォールが越えられていることになる訳で。その時には、もっと他に甚大な被害が出ていそうですけど。

とは言え、わずかな利便性のために高いリスクを犯す必要もありません。という訳で、せっかく辿り着いたコードですが、お蔵入りと相成りました。

しかし、後から気づいたのですが、この方法にはそもそも大きな穴がありました。

フォームにアクセスして、このダイアログが出ている時点で、普通に「保存」できてしまうんですよね。これでは「名前をつけて保存」を無効化しても意味がありません。

このダイアログも、OS 側の設定で表示させないようにすることは可能ですが…。しかし、結局のところ、リンクを右クリックして「対象をファイルに保存」されたらアウトです。

う~ん、違う角度からのアプローチを探さなければなりません。

フォームをローカルに保存されることは不可避です。それなら、いっそ発想を逆転させて、フォーム自身に「ローカルに居ること」を判断させたらどうでしょう?

OnLoad イベントで、ファイルが存在するパス情報を取得できれば、それをフラグにしてコントロールを制御できそうです。しかし、どうやったらパスが取れるのか…。半日ほど悩んでネットを徘徊しましたが、うまい方法を見つけることができず。結局、白旗をあげて、一緒に仕事をしている技術者の方に相談しました(汗)

以下が、その方が書いてくれたコードです。
[code]
function XDocument::OnLoad(eventObj)
{
var urlStr = XDocument.Solution.URI;
if(urlStr.indexOf("http://server") == 0){
XDocument.UI.Alert("Server");
}
else {
XDocument.UI.Alert("Local");
}
}
[/code]
取得した URL に http://server が含まれていたら「サーバ」と判断。さもなくば「ローカル」と判断させます。

サーバ上でひらくと…。

次に、このファイルをダウンロードしてから開くと…。

あれれ?ローカルと判断してくれません。どうも、infopath の場合、XML 内にフォームテンプレートの場所が絶対パスで記述されているため、パスを http://server と認識してしまうようです。

試しに、コードを少し書き換えて、取得したパスを表示させてみたところ

予想とおり、template.xsn を指していました。難儀な仕様だなぁ…。

残念!この案も駄目でした。また別の方法を考えます。

Infopath 正しくは XDocument.Solution.URI ではなく XDocument.URI だったらしい
続・Infopath ボタンクリックでローカルにフォームを保存したい2
続・Infopath ボタンクリックでローカルにフォームを保存したい
Infopath ボタンクリックでローカルにフォームを保存したい


Author

中村 和彦(シンプレッソ・コンサルティング株式会社 代表)が「ユーザ視点の SharePoint 情報」を発信します。元大手製造業 SharePoint 運用担当。現SharePoint コンサルタント。お仕事のお問い合わせはこちらまでお願いします。当ブログにおける発信内容は個人に帰属し所属組織の公式発信/見解ではありません。
FB : 中村 和彦
blog: Be・Better!
MS MVP SharePoint 2009/10-2011/9
MS MVP Office 365 2012/10-2014/9