[Notes/Domino] 参照権限の無い文書のデータを取得する方法
文書のアクセス権限として、基本的には見られてはまずいんだけど、一部のデータだけ見せたい、という場合が稀にあるかと思います。非表示式などで表面的に隠すのが楽ですが、文書のプロパティから値が見えてしまう(設計を非表示にしても、一括置換ツール的なことをやれば見えてしまう)ため、厳密なセキュリティを要求される場合、この方法は採れません。
結局のところ、文書のデータを見えなくするためには読者名フィールドで制御するしかなく、文書が見られない状態でどのようにデータを取得するか、が問題となります。かなり矛盾した命題ではありますが、これを無理矢理解決する次善の策を2つご紹介します。
ビューのカテゴリを使う方法
ビューのカテゴリは、文書に参照権限の無いユーザーにも見えてしまいます(ビューのプロパティで「空のカテゴリを表示しない」にチェックが入っていない場合)。これを利用(悪用?)してみます。
- 第1列をキーの値、第2列を取得したい値でカテゴライズした隠しビューを用意します。(QueryOpen で、管理者以外は Continue に False を返す制御も入れておきます。)
- 以下のようなコードで、カテゴリの値を取得します。
Dim ss As New NotesSession Dim db As NotesDatabase Dim vw As NotesView Dim nav As NotesViewNavigator Dim entry As NotesViewEntry Set db = ss.CurrentDatabase Set vw = db.GetView("ビュー名") Set nav = vw.CreateViewNavFromCategory("キーの値") Set entry = nav.GetFirst() Msgbox entry.ColumnValues(1)
※ カテゴリに限らず、合計値を取得したい場合も、NotesViewNavigator を使用すれば取得できます。
こんなやり方で取得できるわけですが、この方法にはいくつか留意事項があります。
- 隠しビューのカテゴリに表示する値は、基本的に全員に見えてよい値であることが前提です。QueryOpen で制御しても、VBS や VBA などでプログラムを書けば、見えることには変わりありません。(ただ、敷居はかなり高くはなりますが。)
- カテゴリを使うため、長文や改行が入っているデータではおすすめできません。改行が問題になる理由についてはこちら。
- 当然のことながら、リッチテキストには対応できません。(基本的にビューに表示できないですから。テキスト化した値を別フィールドに持つならOKですが、上記の「長文」「改行を含む」に該当してしまうでしょう。)
また、この方法以前の問題として、個人ビュー/フォルダの作成を許可していると、フィールド名さえ分かってしまえば、カテゴリを作ることによって自由にデータを見ることができてしまいますから、読者名フィールドを利用した文書があるDBで個人ビュー/フォルダの作成権限を有効にするべきではありません。
エージェントを使う方法
エージェントの署名者をサーバーIDや管理者IDなどにしておき、RunOnServer にてエージェントをキックすることで、エージェントの署名者の権限でデータを取得することができます。
R5.0.2 から、RunOnServer の引数に NoteID を指定することができますので、値受け渡し用の文書を作成しておいて、その NoteID を渡せば、比較的容易にデータを取得することができるでしょう(エージェント側では、NotesAgent.ParameterDocID にて、渡された NoteID を取得できます)。
この方法では、割と自由にデータを取得できますが、エージェントを署名しなくてはいけないのと、サーバーに負荷がかかる点が問題です。多くのユーザーが同時に実行する可能性がある場合は、避けたほうが無難でしょう。
ちなみに代理実行が許可されている環境なら、代理実行にしておくと署名する手間が省けて楽ではあります。が、Domino管理者=開発者である場合以外は、代理実行を許可していること自体がセキュリティ的にちょっと問題です。代理実行はなるべくやめておいたほうがよいかもしれません。
コメント
コメントはありません
※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。