.NET TIPS

ユーザーのセキュリティ権限を確認するには?(基本編)

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

 Windowsアプリケーションやコンソール・アプリケーションなどのWindows OS上で実行されるアプリケーションでは、セキュリティやアプリケーション機能の実行権限などの問題で、アプリケーションを実行するユーザーのセキュリティ権限をチェックしたい場合がある。例えば、Administrators権限を持っている(=Administratorsグループに所属している)ユーザーだけに、アプリケーションの実行を制限したいようなケースだ。

 そのような場合には、.NET Frameworkに用意されているロールベース・セキュリティ機能を活用すればよい。ロールベース・セキュリティとは、Windows OSにログオンしているユーザーのアイデンティティとそれに割り当てられたロール(権限)に基づいたセキュリティ機能のことである(ちなみに、プログラム・コードに基づいたセキュリティ機能として、コード・アクセス・セキュリティがある)。

 ロールベース・セキュリティを利用するには、Threadクラス(System.Threading名前空間)の静的プロパティであるCurrentPrincipalプロパティからWindowsPrincipalオブジェクトを取得すればよい。ただしこのプロパティの値は、IPrincipalインターフェイス(System.Security.Principal名前空間)のオブジェクトとして取得されるので、WindowsPrincipalクラス(System.Security.Principal名前空間)のオブジェクトへキャストする必要がある。

 このWindowsPrincipalオブジェクトは、現在のスレッドに対して割り当てられているプリンシパル(=アイデンティティとロールを結びつけたもの)を表し、要するにこのオブジェクトからロールベースのセキュリティ情報(例えば、ユーザー名やAdministrators権限の有無など)を取得できるのである。このセキュリティ情報を基に、適切なセキュリティ検証処理などを行えばよい。

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

using System;
using System.Threading;
using System.Security.Principal;

namespace ConsoleApplication1
{
  class Class1
  {
    [STAThread]
    static void Main(string[] args)
    {
      AppDomain.CurrentDomain.SetPrincipalPolicy(
        PrincipalPolicy.WindowsPrincipal);

      WindowsPrincipal princ =
        (WindowsPrincipal)Thread.CurrentPrincipal;

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

Module Module1

  Sub Main()
    AppDomain.CurrentDomain.SetPrincipalPolicy( _
      PrincipalPolicy.WindowsPrincipal)

    Dim princ As WindowsPrincipal = _
      CType(Thread.CurrentPrincipal, WindowsPrincipal)

    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)

 上記のソース・コードで注目していただきたいのは、アプリケーション実行の最初に呼び出している「AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)」という一文である。これは現在のアプリケーション・ドメインのオブジェクトに対してプリンシパル(=WindowsPrincipalオブジェクト)を設定しているわけである。実はデフォルトの状態ではスレッドに対するWindowsPrincipalオブジェクトのプリンシパルが作成されないので、これを事前に行わないとスレッドからプリンシパルを取得する際にエラーになってしまうのだ。

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

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

 以上がロールベース・セキュリティの情報を活用するための基本的な手法だ。現在のスレッドからプリンシパルを取得できるので、特に複数のコード個所で繰り返しセキュリティ検証を行う場合には便利である。

 難点としては、事前にアプリケーション・ドメインに対してプリンシパルを設定する必要があることだ。1回しかセキュリティ検証を行わないような場合(例えば、起動時にのみAdministrators権限のチェックをしたい場合など)には、実はもっと手軽な方法が用意されている。これについては「TIPS:ユーザーのセキュリティ権限を簡単に確認するには?(応用編)」で紹介する。End of Article

カテゴリ:クラス・ライブラリ 処理対象:セキュリティ
使用ライブラリ:Threadクラス(System.Threading名前空間)
使用ライブラリ:IPrincipalインターフェイス(System.Security.Principal名前空間)
使用ライブラリ:WindowsPrincipalクラス(System.Security.Principal名前空間)
関連TIPS:ユーザーのセキュリティ権限を簡単に確認するには?(応用編)
 
この記事と関連性の高い別の.NET TIPS
ユーザーのセキュリティ権限を簡単に確認するには?(応用編)
管理者としてほかのアプリケーションを実行するには?
[ASP.NET]ページ単位にユーザーのアクセス可否を制御するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間