|
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 はもっと複雑です。
サンプルとして公開できるように機能を削っています。
|