【问题标题】:I (think) I want to use a BItWise Operator to check useraccountcontrol property!我(想)我想使用一个 BItWise 运算符来检查 useraccountcontrol 属性!
【发布时间】:2012-07-11 00:52:01
【问题描述】:

这里有一些代码:

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

在 result.Properties["useraccountcontrol"] 内将是一个项目,它将根据帐户的状态给我一个值。例如,值 66050 意味着我正在处理: 普通账户;密码不会过期的地方;它已被禁用。 Explanation here.

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

提前致谢!

【问题讨论】:

    标签: c# ldap bitwise-operators


    【解决方案1】:
    Convert.ToBoolean((int)result.Properties["useraccountcontrol"] & 0x0002)
    

    从这里的当前代码库翻译,它应该可以工作...

    【讨论】:

    • 到目前为止所有的答案都很好,但谢谢弗兰克 - 我认为你是第一个!
    【解决方案2】:
    enum AccountFlags
    {
        Script = (1<<0),
        AccountDisable = (1<<1),
        // etc...
    }
    
    if( ((int)result.Properties["useraccountcontrol"]) & AccountFlags.AccountDisable > 0 )
    {
        // Account is Disabled...
    }
    

    【讨论】:

      【解决方案3】:
      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
      }
      

      【讨论】:

        【解决方案4】:

        一般来说,tutorial for Active Directory via C# 很棒 (via)。

        基本上你想用&amp;操作符检查号码:

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

        您可以将ACCOUNTDISABLE 定义为一个常量(就像在您链接的表中一样)。或者您为这些值创建一个枚举。确保分配正确的数字并设置[Flags]-attribute
        您选择什么取决于您需要多少个值。当只处理 ACCOUNTDISABLE 而没有其他事情时,define 或 const 就可以了。

        【讨论】:

          【解决方案5】:

          根据您的需要,您可以使用 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

          【讨论】:

          • +1 查询级别的按位运算符。不是问题的确切答案,但仍然是最普遍有用的:D
          猜你喜欢
          • 1970-01-01
          • 2020-10-22
          • 1970-01-01
          • 1970-01-01
          • 2019-12-10
          • 1970-01-01
          • 2023-01-25
          • 2016-01-20
          • 2018-03-29
          相关资源
          最近更新 更多