UserAccountControl を制御するサンプルとして、ユーザの有効化、無効化を行うサンプルを掲載します。MSDNのユーザー アカウントの有効化と無効化のサンプルでは、activeds.tlb または activeds.dll から tlbimp.exe を使用して作成した RCW を使用してユーザを有効化、無効化を行うサンプルが掲載されています。本サンプルでは Windows SDK に付属するIAds.h 内の列挙型 enum ADS_USER_FLAG を.NET 用の列挙型に定義しなおすことで、System.DirectoryServices 名前空間のクラスを使用して有効化、無効化を行います。
確認環境
- 動作環境: Windows 2003 AD環境
- 開発環境: Visual Studio 2008 Professional
- .NET 2.0 以上
1. ユーザの有効化と無効化を実現する
Visual Studio 2008 を起動し、空のソリューションを新規作成します。作成したソリューションにプロジェクトを作成します。プロジェクトテンプレートはコンソールアプリケーションを選択します。
作成したプロジェクトに、参照の追加で、System.DirectoryServices.dll を追加して準備は完了です。
1.1 ADS_USER_FLAG の列挙型を定義
IAds.hの ADS_USER_FLAG を.NET 用の列挙型に定義します。Active Directory 環境では次のフラグは無視されるので注意してください。
- ADS_UF_LOCKOUT
- ADS_UF_PASSWD_CANT_CHANGE
- ADS_UF_DONT_EXPIRE_PASSWD
[Flags] enum AdsUserFlag { ADS_UF_SCRIPT = 0x1, ADS_UF_ACCOUNTDISABLE = 0x2, ADS_UF_HOMEDIR_REQUIRED = 0x8, ADS_UF_LOCKOUT = 0x10, ADS_UF_PASSWD_NOTREQD = 0x20, ADS_UF_PASSWD_CANT_CHANGE = 0x40, ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = 0x80, ADS_UF_TEMP_DUPLICATE_ACCOUNT = 0x100, ADS_UF_NORMAL_ACCOUNT = 0x200, ADS_UF_INTERDOMAIN_TRUST_ACCOUNT = 0x800, ADS_UF_WORKSTATION_TRUST_ACCOUNT = 0x1000, ADS_UF_SERVER_TRUST_ACCOUNT = 0x2000, ADS_UF_DONT_EXPIRE_PASSWD = 0x10000, ADS_UF_MNS_LOGON_ACCOUNT = 0x20000, ADS_UF_SMARTCARD_REQUIRED = 0x40000, ADS_UF_TRUSTED_FOR_DELEGATION = 0x80000, ADS_UF_NOT_DELEGATED = 0x100000, ADS_UF_USE_DES_KEY_ONLY = 0x200000, ADS_UF_DONT_REQUIRE_PREAUTH = 0x400000, ADS_UF_PASSWORD_EXPIRED = 0x800000, ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION = 0x1000000 }
各フラグの属性はスクリプトセンターのページで日本語で解説されていますので、掲載します。
ローカル ユーザーのパスワードが変更されないようにするにはどうすればよいでしょうか。
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/dec04/hey1202.mspx
1.2 ユーザの無効化処理
ユーザの無効化を行うメソッドを掲載します。1.1 で作成したAdsUserFlagを使用してADS_UF_ACCOUNTDISABLEを設定しています。
/// <summary> /// ユーザを無効化する /// </summary> public static void DeactivateUser() { using (DirectoryEntry user = GetDirectoryEntry("CN=crmuser03,OU=CrmUsers,DC=crm1,DC=local")) { AdsUserFlag adsUserFlg = (AdsUserFlag)user.Properties["userAccountControl"].Value; user.Properties["userAccountControl"].Value = adsUserFlg | AdsUserFlag.ADS_UF_ACCOUNTDISABLE; user.CommitChanges(); } } private static DirectoryEntry GetDirectoryEntry(string path) { path = "LDAP://" + path; return new DirectoryEntry(path, null, null, AuthenticationTypes.Secure); }
1.3 ユーザの有効化処理
続いて、ユーザの有効化処理です。1.1 で作成したAdsUserFlagを使用してADS_UF_ACCOUNTDISABLE をクリアしています。
/// <summary> /// ユーザを有効化する /// </summary> public static void ActivateUser() { using (DirectoryEntry user = GetDirectoryEntry("CN=crmuser03,OU=CrmUsers,DC=crm1,DC=local")) { AdsUserFlag adsUserFlg = (AdsUserFlag)user.Properties["userAccountControl"].Value; user.Properties["userAccountControl"].Value = adsUserFlg & ~AdsUserFlag.ADS_UF_ACCOUNTDISABLE; user.CommitChanges(); } }
2 まとめ
今回の説明は以上です。指摘点、誤りなどがありましたらご連絡ください。
さんのコメント: さんのコメント: