Я (думаю) я хочу использовать оператор BItWise для проверки свойства useraccountcontrol! - PullRequest
4 голосов
/ 16 марта 2010

Вот код:

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

Внутри result.Properties ["useraccountcontrol"] будет элемент, который даст мне значение в зависимости от состояния учетной записи. Например, значение 66050 означает, что я имею дело с: Нормальный аккаунт; где пароль не истекает, который был отключен. Объяснение здесь .

Какой самый краткий способ узнать, содержит ли мое значение флаг AccountDisable (2)

Заранее спасибо!

Ответы [ 5 ]

6 голосов
/ 16 марта 2010
Convert.ToBoolean((int)result.Properties["useraccountcontrol"] & 0x0002)

В переводе с текущей кодовой базы здесь должно работать ...

4 голосов
/ 16 марта 2010
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 голосов
/ 16 марта 2010
enum AccountFlags
{
    Script = (1<<0),
    AccountDisable = (1<<1),
    // etc...
}

if( ((int)result.Properties["useraccountcontrol"]) & AccountFlags.AccountDisable > 0 )
{
    // Account is Disabled...
}
2 голосов
/ 16 марта 2010

Вот отличное руководство для Active Directory через C # в целом ( через ).

Обычно вы хотите проверить номер с оператором &:

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

Вы можете определить ACCOUNTDISABLE как const (как в таблице, которую вы связали). Или вы создаете перечисление для значений. Обязательно назначьте правильные номера и установите [Flags] -атрибут .
То, что вы выбрали, зависит от того, сколько ценностей вам нужно. Когда речь идет только о ACCOUNTDISABLE и ничего больше, подойдет определение или const.

1 голос
/ 10 июля 2012

В зависимости от ваших потребностей, вы можете использовать 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

...