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 まとめ

今回の説明は以上です。指摘点、誤りなどがありましたらご連絡ください。