我(想)我想使用BItWise运算符来检查useraccountcontrol属性!

时间:2010-03-16 16:26:37

标签: c# ldap bitwise-operators

以下是一些代码:

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

在result.Properties [“useraccountcontrol”]中将是一个项目,它将根据帐户的状态给我一个值。例如,值66050表示我正在处理: 一个正常的帐户;密码未过期的地方;已被禁用的密码。 Explanation here

查明我的值是否“包含”AccountDisable标志(即2)的最简洁方法是什么

提前致谢!

5 个答案:

答案 0 :(得分:5)

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

从这里的当前代码库翻译,它应该有用......

答案 1 :(得分:4)

enum AccountFlags
{
    Script = (1<<0),
    AccountDisable = (1<<1),
    // etc...
}

if( ((int)result.Properties["useraccountcontrol"]) & AccountFlags.AccountDisable > 0 )
{
    // Account is Disabled...
}

答案 2 :(得分: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
}

答案 3 :(得分:2)

一般情况下tutorial for Active Directory via C#非常棒(via)。

您基本上想要使用&运算符检查号码:

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

您可以将ACCOUNTDISABLE定义为const(就像您链接的表中一样)。或者您为值创建枚举。确保分配正确的数字并设置[Flags]-attribute 您选择的内容取决于您需要多少值。当只处理ACCOUNTDISABLE而没有其他任何东西时,定义或const都可以。

答案 4 :(得分: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知识库文章:http://support.microsoft.com/kb/269181

另一篇文章:http://www.windowsserverfaq.org/?url=/faq/ADQueries/LDAP-Queries.asp