この特集のトップページへ
Chapter 5:ビジネスロジック層の構築

head2.gif 5.2.2 実際に実行するユーザー
 「4.3 COM+のセキュリティ機構」でも簡単に説明したが,COM+で管理されたCOMオブジェクトは,そのCOMオブジェクトを呼び出したユーザーの権限で実行されるわけではない。コンポーネントサービス管理ツールで設定したユーザーの権限に基づいて実行される。

 COMオブジェクトを実行するユーザーは,COM+アプリケーションを作るときのウィザード画面で設定する(Fig.4-18参照)。また,コンポーネントサービス管理ツールでCOM+アプリケーションのプロパティを表示し,[ID]ページを開いて確認したり変更したりすることもできる。たとえば,コンポーネントサービス管理ツールにおけるCOM+アプリケーションのプロパティで,[ID]ページがFig.5-7のように設定されていたとする。この場合,どのようなユーザーがこのCOMコンポーネントを使ったとしても,そのCOMコンポーネントを実体化して利用しているのはBlogicというユーザーになる(Fig.5-8)。

Fig.5-7 COM+アプリケーションのアカウントの設定
fig5_07.gif
Fig.5-8 クライアントからCOMコンポーネントが利用された場合
fig5_08.gif

 よって,たとえばCOMコンポーネントが特定のリソースにアクセスする場合,Blogicというユーザーがそのリソースに対するアクセス権限を保持していない限り,その操作は基本的に失敗することになる。

One Point!「基本的に」と記したのは,DCOMの設定によるからである。DCOMの偽装レベルの設定で,[偽装する]ないし[委任する]を指定した場合には,COMコンポーネントを呼び出したユーザーの権限が付与されるので,リソースにアクセスすることができる(Table 4-4参照)

 ここまでは特に問題ないだろうが,比較的問題になりやすいのが,COM+の管理下にあるCOMオブジェクトが別のCOM+アプリケーションのなかにあるCOMコンポーネントを実体化して利用するときである。

 たとえば,AというCOM+アプリケーションに含まれているCOMオブジェクトが,BというCOM+アプリケーションに含まれているCOMコンポーネントを実体化して利用するとしよう。ここでは,COM+アプリケーションのプロパティの[ID]ページにおいて,AというCOM+アプリケーションの実行アカウントはUserA,BというCOM+アプリケーションの実行アカウントはUserBに設定されているものと仮定する。この場合,まず,クライアントがAというCOM+アプリケーションのなかにあるCOMコンポーネントを利用すると,これはUserAのアカウントで実体化され実行される。そして次に,その実体化されたCOMオブジェクトからBというCOM+アプリケーションのなかにあるCOMコンポーネントを利用するとき,UserBというアカウントで実体化され実行されることになる。このとき,BというCOM+アプリケーションに含まれるCOMコンポーネントを利用しているのは,UserAであるから,BというCOM+アプリケーションに含まれるCOMコンポーネントに対して,UserAに適切な実行権限(ロール)が割り当てられていないと,その呼び出しは失敗する(Fig.5-9)。

Fig.5-9 COMオブジェクトが別のCOM+アプリケーションのCOMコンポーネントを利用する場合
fig5_09.gif

 Fig.5-9を見るとわかるように,COM+アプリケーションに含まれているCOMコンポーネントが別のCOM+アプリケーションのCOMコンポーネントを利用する場合,実行ユーザーが次々と変わってゆくことになる。

 一般的に開発者や管理者は,ロールに対して適切な権限が設定されているかどうかだけを考えればよいが,必要であれば,はじめにCOMオブジェクトを呼び出した実際のユーザー(Fig.5-9の例であれば,Fumitaka OsawaHitoshi Yamamoto)を,COMオブジェクト側で調べることもできる。その場合には,Table 5-4に示したSecurityPropertyオブジェクトのGetOriginalCallerNameメソッドを使えばよい。


One Point!SecurityPropertyオブジェクトには,GetOriginalCallerNameメソッドとGetOriginalCreaterNameメソッドという似たようなメソッドが用意されている。前者はCOMオブジェクトを呼び出したユーザーを,後者はCOMオブジェクトを実体化したユーザーを,それぞれ返すものである。とはいえ,一般的にCOMオブジェクトを呼び出したユーザーと実体化したユーザーは同じである。しかし,後述の「COLUMN オブジェクトプーリング」で説明するオブジェクトプーリングの機能を使うと,実体化されたCOMオブジェクトがほかのユーザーによって使われることがあるため,必ずしもCOMオブジェクトを呼び出したユーザーと実体化したユーザーが一致するとは限らない。
prevpg.gif Chapter 5-1 8/23 nextpg.gif