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 まとめ
今回の説明は以上です。指摘点、誤りなどがありましたらご連絡ください。