トップページへ PASSJ ブログへ
トップページへ
分科会
特集!
コミュニケーション
資格
セミナー・コンファレンス
インフォメーション



Webテクノロジー ボードリーダー:小川 貢

毎月第2、第4木曜日はボードリーダーからのレポートを掲載いたします。
 
   

2004年5月13日
『どっとねっとと雑多な日々 27』

今回も仕事が佳境に入っているため、もういっぱいいっぱいな状況でこの原稿を書いています。
何の仕事をしているかというと、ひたすら Active Directory と .NET Framework の System.DirectoryServices を使って格闘しています。
この原稿の最後でちょっとした Tips を紹介したいと思います。

さて、前回 SQL Server 2000 Reporting Services について書きましたので、今回は私の BLOG に書いた少々古い記事ですが紹介したいと思います。

[SQL Server]SQL Server 2000 Reporting Services - rskeymgmt.exe/rsconfig.
exe/rsactivate.exe
http://blogs.sqlpassj.org/mitsugi/archive/2004/03/18/1172.aspx

[SQL Server]Reporting Services の Web アーカイブの問題
http://blogs.sqlpassj.org/mitsugi/archive/2004/04/13/1695.aspx

特に最初の [SQL Server]SQL Server 2000 Reporting Services - rskeymgmt.exe/rsconfig.exe/rsactivate.exe の記事はぜひ読んでください。

私も何度か遭遇したのですが、ある日突然 SQL Server 2000 Reporting Services の「レポート マネージャ」に接続できない現象が出ることがありま
すので、回避方法を知っておいて損はないと思います。

では、最後に Active Directory と .NET Framework の System.DirectoryServices を使って、ユーザのパスワードの有効期限切れをチェックする Tips を紹介いたします。

---------------------------------------------------------------------
using System;
using System.DirectoryServices;

namespace CRC.Authentication
{
  public class DirectoryService
  {
   #region 定数
   // パスワード有効期限切れマスク
   private const int ADS_UF_DONT_EXPIRE_PASSWD = 0x10000;
   #endregion

   #region コントラクタ
   public DirectorySercice()
   {
   }
   #endregion

   #region メソッド
   /// <summary>
   /// CheckPasswordExpire メソッド
   /// </summary>
   /// <param name="userId">ユーザ ID</param>
   /// <returns>
   /// 0 - 有効期限切れではない<br />
   /// -1 - 不明ユーザ<br />
   /// -2 - 有効期限切れ<br />
   /// -3 - システムエラー<br />
   /// </returns>
   private LdapAuthenticationResult CheckPasswordExpire(string userId)
   {
    // 初期戻り値のセット
    int flag = 0;

    // LDAP サーバ指定
    string ldap = "LDAP://adserver.foo.co.jp/DC=adserver,DC=foo,DC=co,DC=jp";

    // 管理者アカウントのセット
    string domainAdminUser = @"adserver\AdminUser";

    // パスワード
    string password = "xxxxxxxxxx";

    // 認証タイプ
    AuthenticationTypes authTypes = new AuthenticationTypes();
    authTypes = AuthenticationTypes.Secure | AuthenticationTypes.Delegation;

    // LDAP 検索結果オブジェクト
    SearchResult searchResult = null;

    using(DirectoryEntry directoryEntry = new DirectoryEntry(ldap, domainAdminUser, password, authTypes))
    using(DirectorySearcher directorySearcher = new DirectorySearcher(directoryEntry))
    {
     try
     {
      // LDAP 検索フィルタ
      directorySearcher.Filter = "(SAMAccountName=" + userId + ")";

      // LDAP 検索結果取得
      searchResult = directorySearcher.FindOne();

      // LDAP 検索結果がない場合
      if(searchResult == null)
      {
       // 不明ユーザ
       flag = -1;
      }
      else
      {
       // UserAccountControl プロパティ取得
       int iUserAccountControl = (int)searchResult.Properties["UserAccountControl"][0];

       // パスワード有効期限切れじゃない場合
       if(Convert.ToBoolean(ADS_UF_DONT_EXPIRE_PASSWD & iUserAccountControl) == true)
       {
        flag = 0;
       }
       else
       {
        flag = -2;
       }
      }
     }
     catch(Exception ex)
     {
      flag = -3;
     }
    }
    return flag;
   }
   #endregion
  }
}
---------------------------------------------------------------------

肝はユーザの UserAccountControl をマスク処理することでユーザのステータス状態がチェックできるということです。
これを応用すると「アカウント オプション」の値をチェックすることが可能ですので、参考にしてみてください。
※実際の Class はもっと複雑です。
  サンプルとして公開できるように機能を削っています。


 

ボードリーダーレポート トップページへ

 

 
PASSJメールニュース 著作権ついて プライバシーポリシー リンクポリシー お問い合わせ
(C) 2005 Professional Association for SQL Server Japan. All rights reserved.