.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」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間