3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.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;

 

///

/// コンストラクタ 既定の接続をする

///

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;

}

}

///

/// ActiveDirectoryから情報を取得し、Userオブジェクトリストを作成

///

///

public List 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 lstUser = new List();

 

/*

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)はどうやら普通には参照できないようです。

この点に関しては、後日書きます。