.NET TIPS

ユーザーのセキュリティ権限を簡単に確認するには?(応用編)

デジタルアドバンテージ 一色 政彦
2005/09/02

 「TIPS:ユーザーのセキュリティ権限を確認するには?(基本編)」では、基本的なロールベース・セキュリティの実装方法を紹介した。これを行えば、アプリケーションを使用するユーザーのセキュリティ権限(例えば、Administratorsグループに所属しているかどうか)のチェック処理などを実装できるようになる。

 ただし、この方法では事前に「AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)」というコードを呼び出さなければならない。このコードは、前掲のTIPSでも説明されているように、現在のアプリケーション・ドメインに対してプリンシパル(本稿の例では「WindowsPrincipal」)を設定するためのものだ。このコード呼び出しを行って、初めて現在のスレッドからプリンシパル(WindowsPrincipalオブジェクト)を取得できるようになる。

 実は.NET Frameworkにはもっと気軽にロールベース・セキュリティの情報を取得する方法が用意されている。本稿ではその方法を紹介する。それはプリンシパル(WindowsPrincipalオブジェクト)をスレッドに設定するのではなく、自らそれを生成する方法である。

 プリンシパルとなるWindowsPrincipalオブジェクトを生成するには、まずそのプリンシパルに結び付けるユーザーのアイデンティティ(WindowsIdentityオブジェクト)が必要になる。現在のアイデンティティを取得するには、WindowsIdentityクラス(System.Security.Principal名前空間)の静的メソッドであるGetCurrentメソッドを呼び出せばよい。その後、取得したWindowsIdentityオブジェクトをWindowsPrincipalクラスのコンストラクタ・パラメータに指定して、WindowsPrincipalオブジェクトを生成(new)すればよい。

 これを実際に実装しているのが、次のサンプル・プログラムである。このサンプル・プログラムでは、WindowsPrincipalオブジェクトを生成後、そのIdentityプロパティ(=アイデンティティ情報)やIsInRoleメソッド(=ロールへの所属の有無、権限の有無の情報)を使ってロールベース・セキュリティ情報を活用している。

using System;
using System.Security.Principal;

namespace ConsoleApplication1
{
  class Class1
  {
    [STAThread]
    static void Main(string[] args)
    {
      WindowsIdentity ident = WindowsIdentity.GetCurrent();
      WindowsPrincipal princ = new WindowsPrincipal(ident);

      Console.WriteLine("ユーザー名:{0}",
        princ.Identity.Name);
      Console.WriteLine("Administrators権限の有無:{0}",
        princ.IsInRole(WindowsBuiltInRole.Administrator));
      Console.WriteLine("Users権限の有無:{0}",
        princ.IsInRole(WindowsBuiltInRole.User));
    }
  }
}
Imports System.Security.Principal

Module Module1

  Sub Main()
    Dim ident As WindowsIdentity = WindowsIdentity.GetCurrent()
    Dim princ As New WindowsPrincipal(ident)

    Console.WriteLine("ユーザー名:{0}", _
      princ.Identity.Name)
    Console.WriteLine("Administrators権限の有無:{0}", _
      princ.IsInRole(WindowsBuiltInRole.Administrator))
    Console.WriteLine("Users権限の有無:{0}", _
      princ.IsInRole(WindowsBuiltInRole.User))
  End Sub

End Module
ロールベース・セキュリティを実装したコンソール・アプリケーションのサンプル・プログラム(上:C#、下:VB.NET)

 コードの内容はあまり難しくないので、詳細な説明は割愛する。以下が上記のサンプル・プログラムの実行結果である。

ユーザー名:D-ADVANTAGE\masa-i
Administrators権限の有無:True
Users権限の有無:True
サンプル・プログラム(コンソール・アプリケーション)の実行結果

 以上が、ロールベース・セキュリティの情報を簡単に活用する手法だ。この方法ではプリンシパルを自ら生成するので制約が少なく利用が容易だが、複数のコード個所で繰り返しセキュリティ検証を行う場合には、オブジェクト生成のオーバーヘッドがある(オブジェクトが再利用されない)ので、あまりお勧めできない。やはり起動時に1回だけロールベースのセキュリティ検証を行う場合以外では、前掲のTIPSの手法を利用することをお勧めする。End of Article

カテゴリ:クラス・ライブラリ 処理対象:セキュリティ
使用ライブラリ:WindowsIdentityクラス(System.Security.Principal名前空間)
使用ライブラリ:WindowsPrincipalクラス(System.Security.Principal名前空間)
関連TIPS:ユーザーのセキュリティ権限を確認するには?(基本編)
 
この記事と関連性の高い別の.NET TIPS
ユーザーのセキュリティ権限を確認するには?(基本編)
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

TechTargetジャパン

Insider.NET フォーラム 新着記事
  • Kinectが切り開く“夢の近未来” (2012/2/2)
     日本を含めた世界中でKinect for Windowsセンサー商用版とSDK正式版がリリース。未来のコンピューティングはどう変化するのか?
  • 3つの視点でネイティブと.NETの適材適所を考察 (2012/1/31)
     アプリ開発は「ネイティブ」と「.NET」、どちらが最良? その問いには「適材適所」と答えるしかない。では、“適所”は一体どこかを考察する
  • SQL Azure Data Sync入門 (2012/1/30)
     SQL Azure/SQL Serverデータベース間のデータ同期を簡単に実現するサービスとは? その仕組みや使用手順を解説
  • Windows Phoneアプリ市場の現状を分析する (2012/1/27)
     Windows Phone のアプリ・ストアに日々登録されている多種多様なアプリ。カテゴリ別のアプリ数は? 市場の現状を明らかにする

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH