人気ブログランキング | 話題のタグを見る
(.Net,ADSI)UserAccountControlフラグからアカウント有効無効等を調べる方法
ユーザのアカウント有効無効かを調べたいときは、Userオブジェクトの UserAccountControlフラグを見ればいいようです。
このフラグはビットフラグとなっており、「Active Directory ユーザーとコンピュータ」の「アカウントオプション」の各項目の値を保持してるようです。

各ビットの意味はMSサポート:UserAccountControl フラグを使用してユーザー アカウント プロパティを操作する方法に載ってます。

後は、論理演算で目的のフラグをとってやるだけで構いません。

下記のようなコードでアカウント情報を取得できます。(C#)
なお、コード内のUserクラスは(.Net,ADSI)User 情報を格納するクラスを参照してください。
class ActiveDirectory
{
//各ユーザアカウントオプションのビット定義
//各ユーザアカウントオプションのビット定義
private const int cSCRIPT = 0x0001;
private const int cACCOUNTDISABLE = 0x0002;
private const int cHOMEDIR_REQUIRED = 0x0008;
private const int cLOCKOUT = 0x0010;
private const int cPASSWD_NOTREQD = 0x0020;
private const int cPASSWD_CANT_CHANGE = 0x0040;
private const int cENCRYPTED_TEXT_PWD_ALLOWED = 0x0080;
private const int cTEMP_DUPLICATE_ACCOUNT = 0x0100;
private const int cNORMAL_ACCOUNT = 0x0200;
private const int cINTERDOMAIN_TRUST_ACCOUNT = 0x0800;
private const int cWORKSTATION_TRUST_ACCOUNT = 0x1000;
private const int cSERVER_TRUST_ACCOUNT = 0x2000;
private const int cDONT_EXPIRE_PASSWORD = 0x10000;
private const int cMNS_LOGON_ACCOUNT = 0x20000;
private const int cSMARTCARD_REQUIRED = 0x40000;
private const int cTRUSTED_FOR_DELEGATION = 0x80000;
private const int cNOT_DELEGATED = 0x100000;
private const int cUSE_DES_KEY_ONLY = 0x200000;
private const int cDONT_REQ_PREAUTH = 0x400000;
private const int cPASSWORD_EXPIRED = 0x800000;
private const int cTRUSTED_TO_AUTH_FOR_DELEGATION = 0x1000000;

//既定接続の接続するLDAP名 
private const string cPath = @"LDAP://dc01/DC=hogedomain,DC=jp";
//既定接続のユーザ名
private const string cUser = @"cn=administrator,DC=hogedomain,DC=jp";
//パスワード
private const string cPasswd = @"hogehoge";

//ディレクトリの情報取得
DirectoryEntry mDrctEntry;
 
/// <summary>
/// コンストラクタ 既定の接続をする
/// </summary>
public ActiveDirectory()
{
mDrctEntry = new DirectoryEntry(cPath, cUser, cPasswd);

//ログインできた確認
try{
Object obj = mDrctEntry.NativeObject;
} catch (Exception ex){
//ログイン失敗
Utility.DispMessageBox(Utility.StrType.LoginErr);
Console.WriteLine(ex.Message);
return;
}
}

/// <summary>
/// ActiveDirectoryから情報を取得し、Userオブジェクトリストを作成
/// </summary>
/// <returns></returns>
public List<User> GetUserAllList()
{
// LDAP検索オブジェクトを作成
DirectorySearcher drSearch = new DirectorySearcher(mDrctEntry);

// アカウントフィルターを設定 Userオブジェクトだけ取得するように
drSearch.Filter = "(ObjectCategory=user)";

// 検索する
SearchResultCollection scn = drSearch.FindAll();
if (scn == null)
{
//なかった時
Utility.DispMessageBox(Utility.StrType.NotFoundUser);
return null;
}

List<User> lstUser = new List<User>();
 
/*
drSearch.PropertiesToLoad.Add("cn");
//sAMAccountName
drSearch.PropertiesToLoad.Add("sAMAccountName");
//説明
drSearch.PropertiesToLoad.Add("description");
//所属グループ
drSearch.PropertiesToLoad.Add("memberOf");
drSearch.PropertiesToLoad.Add("createTimeStamp");
drSearch.PropertiesToLoad.Add("modifyTimeStamp");
drSearch.PropertiesToLoad.Add("createTimeStamp");
*/


//Userオブジェクト新規生成
foreach (SearchResult sResult in scn)
{
User usr = new User();
if (sResult.Properties["userAccountControl"].Count > 0)
{
usr.dmUserAccountControl = (int)sResult.Properties["userAccountControl"][0];
 
//アカウントコントロールオプションのビット値を展開
usr.Disable = (usr.dmUserAccountControl & cACCOUNTDISABLE) > 0 ? true : false;
usr.Script = (usr.dmUserAccountControl & cSCRIPT) > 0 ? true : false;
usr.HomeDirReauired = (usr.dmUserAccountControl & cHOMEDIR_REQUIRED) > 0 ? true : false;
usr.LockOut = (usr.dmUserAccountControl & cLOCKOUT) > 0 ? true : false;
usr.PasswdNotReqd = (usr.dmUserAccountControl & cPASSWD_NOTREQD) > 0 ? true : false;
usr.PasswdCantChange = (usr.dmUserAccountControl & cPASSWD_CANT_CHANGE) > 0 ? true : false;
usr.EncPasswdAllowed = (usr.dmUserAccountControl & cENCRYPTED_TEXT_PWD_ALLOWED) > 0 ? true : false;
usr.TempDuplicateAccount = (usr.dmUserAccountControl & cTEMP_DUPLICATE_ACCOUNT) > 0 ? true : false;
usr.NormalAccount = (usr.dmUserAccountControl & cNORMAL_ACCOUNT) > 0 ? true : false;
usr.InterdomainTrustAccount = (usr.dmUserAccountControl & cINTERDOMAIN_TRUST_ACCOUNT) > 0 ? true : false;
usr.WorkstTrustAccount = (usr.dmUserAccountControl & cWORKSTATION_TRUST_ACCOUNT) > 0 ? true : false;
usr.ServerTrustAccount = (usr.dmUserAccountControl & cSERVER_TRUST_ACCOUNT) > 0 ? true : false;
usr.DontExpirePasswd = (usr.dmUserAccountControl & cDONT_EXPIRE_PASSWORD) > 0 ? true : false;
usr.MnsLogon = (usr.dmUserAccountControl & cMNS_LOGON_ACCOUNT) > 0 ? true : false;
usr.SmartCardRequired = (usr.dmUserAccountControl & cSMARTCARD_REQUIRED) > 0 ? true : false;
usr.TrustedForDelegation = (usr.dmUserAccountControl & cTRUSTED_FOR_DELEGATION) > 0 ? true : false;
usr.NotDelegated = (usr.dmUserAccountControl & cNOT_DELEGATED) > 0 ? true : false;
usr.UseDesKeyOnly = (usr.dmUserAccountControl & cUSE_DES_KEY_ONLY) > 0 ? true : false;
usr.DontReqPreauth = (usr.dmUserAccountControl & cDONT_REQ_PREAUTH) > 0 ? true : false;
usr.PasswdExpired = (usr.dmUserAccountControl & cPASSWORD_EXPIRED) > 0 ? true : false;
usr.TrustedToAuthForDelegation = (usr.dmUserAccountControl & cTRUSTED_TO_AUTH_FOR_DELEGATION) > 0 ? true : false;
}
lstUser.Add(usr);
}
return lstUser;
}
}


ActiveDirectory UserAccountControlのフラグと意味は(.Net,ADSI)ActiveDirectory UserAccountControlのフラグの意味にまとめました。。

参考:
猫目的日々:[C#]無効ユーザの判定・ビット演算[ActiveDirectory]


注意点として、ユーザーがパスワードを変更できるかどうかのフラグ(PASSWD_CANT_CHANGE 0x0040)はどうやら普通には参照できないようです。
この点に関しては、後日書きます。
by jehoshaphat | 2010-04-12 23:20 | .Net開発


<< (.Net,ADSI)Acti... (.Net,ADSI)Acti... >>