4

ここにいくつかのコードがあります:

        DirectorySearcher searcher = new DirectorySearcher();
        searcher.Filter =  "(&(objectClass=user)(sAMAccountName=" + lstUsers.SelectedItem.Text + "))";
        SearchResult result = searcher.FindOne();

result.Properties ["useraccountcontrol"]内には、アカウントの状態に応じて値を与えるアイテムがあります。たとえば、66050の値は、私が扱っていることを意味します。通常のアカウント。パスワードの有効期限が切れていない場合。これは無効になっています。 ここでの説明

私の値にAccountDisableフラグ(2)が「含まれている」かどうかを確認する最も簡潔な方法は何ですか?

前もって感謝します!

4

5 に答える 5

6
Convert.ToBoolean((int)result.Properties["useraccountcontrol"] & 0x0002)

ここの現在のコードベースから翻訳されたもので、動作するはずです...

于 2010-03-16T16:35:39.797 に答える
4
UserAccountControlFlags userAccFlags = (UserAccountControlFlags) 66050;

// Much more readable    
if(userAccFlags.Has(UserAccountControlFlags.AccountDisabled))
{
   // Do your stuff here
}

そして、ここに拡張メソッドがあります:

public static bool Has<T>(this System.Enum type, T value) where T : struct 
{
    return ((int)(object)type & (int)(object)value) > 0;
}

C# Onlineから参照される列挙型定義

[Flags]
public enum UserAccountControlFlags
{ 
  Script                             = 0x1,
  AccountDisabled                    = 0x2,
  HomeDirectoryRequired              = 0x8,
  AccountLockedOut                   = 0x10,
  PasswordNotRequired                = 0x20,
  PasswordCannotChange               = 0x40,
  EncryptedTextPasswordAllowed       = 0x80,
  TempDuplicateAccount               = 0x100,
  NormalAccount                      = 0x200,
  InterDomainTrustAccount            = 0x800,
  WorkstationTrustAccount            = 0x1000,
  ServerTrustAccount                 = 0x2000,
  PasswordDoesNotExpire              = 0x10000,
  MnsLogonAccount                    = 0x20000,
  SmartCardRequired                  = 0x40000,
  TrustedForDelegation               = 0x80000,
  AccountNotDelegated                = 0x100000,
  UseDesKeyOnly                      = 0x200000,
  DontRequirePreauth                 = 0x400000,
  PasswordExpired                    = 0x800000,
  TrustedToAuthenticateForDelegation = 0x1000000,
  NoAuthDataRequired                 = 0x2000000
}
于 2010-03-16T17:38:44.903 に答える
4
enum AccountFlags
{
    Script = (1<<0),
    AccountDisable = (1<<1),
    // etc...
}

if( ((int)result.Properties["useraccountcontrol"]) & AccountFlags.AccountDisable > 0 )
{
    // Account is Disabled...
}
于 2010-03-16T16:32:50.383 に答える
2

これは、一般的にC#を介したActive Directoryの優れたチュートリアルです(経由)。

&基本的に、オペレーターで番号を確認したい:

if( ( result & ACCOUNTDISABLE ) == ACCOUNTDISABLE )
{ .... }

ACCOUNTDISABLEconst として定義できます(リンクした表のように)。または、値の列挙型を作成します。正しい番号を割り当てて[Flags]-attributeを設定してください。
何を選択するかは、必要な値の数によって異なります。ACCOUNTDISABLE のみを処理し、他には何も処理しない場合は、define または const で十分です。

于 2010-03-16T16:37:41.417 に答える
1

必要に応じて、ActiveDirectory を使用して、有効/無効のステータスでアカウントをフィルター処理できる場合があります。

searcher.Filter =  "(&(objectClass=user)(UserAccountControl:1.2.840.113556.1.4.803:=2))";

また:

searcher.Filter =  "(&(objectClass=user)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))";

関連する MS KB 記事: http://support.microsoft.com/kb/269181

そして別の記事: http://www.windowsserverfaq.org/?url=/faq/ADQueries/LDAP-Queries.asp

于 2012-07-10T16:52:01.867 に答える