Active Directoy LDAP - блокировка учетной записи пользователя - PullRequest
3 голосов
/ 04 мая 2010

Какой способ блокировки учетной записи Active Directory является предпочтительным?

int val = (int)directoryentry.Properties["userAccountControl"].Value;
directoryentry.Properties["userAccountControl"].Value = val | 0x0010;

против

directoryentry.InvokeSet("IsAccountLocked", true); 

Есть ли лучший способ?

Ответы [ 2 ]

1 голос
/ 05 мая 2010

Вы на .NET 3.5 (или можете обновиться до него) ??

Если это так, проверьте новое пространство имен System.DirectoryServices.AccountManagement и все, что он может предложить! Отличным вступлением является статья MSDN Управление принципами безопасности каталогов в .NET Framework 3.5 .

В вашем случае вам нужно как-то ухватиться за UserPrincipal, например,

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");
UserPrincipal me = UserPrincipal.Current;

и тогда у вас есть доступ к множеству действительно простых в использовании свойств и методов - например ::

bool isLockedOut = me.IsAccountLockedOut();

и вы можете разблокировать заблокированную учетную запись, используя:

me.UnlockAccount();

НАМНОГО проще, чем обычные старые System.DirectoryServices вещи!

1 голос
/ 04 мая 2010

На самом деле вам нужно выполнить побитовую операцию, чтобы установить правильный бит на соответствующее значение. По ссылке ниже вы столкнетесь с флагами контроля учетных записей. Таким образом, вам нужно только выполнить соответствующую логическую операцию со свойством, чтобы заблокировать или разблокировать учетную запись.

Следующая ссылка вас заинтересует, наверное.

Как (почти) все в AD

Позже я добавлю пример кода C #.

Вот код, предложенный:

public class AdUser {
    private int _userAccountControl
    public bool IsLocked {
        get {
            return _userAccountControl & UserAccountControls.Lock
        } set {
            if(value)
                _userAccountControl = _userAccountControl | UserAccountControls.Lock
            else
                // Must reverse all the bits in the filter when performing an And operation
                _userAccountControl = _userAccountControl & ~UserAccountControls.Lock
        }
    }
    public enum UserAccountControls {
        Lock = 0x10
    }
}

Пожалуйста, рассмотрите возможность внесения некоторых изменений в этот код, поскольку я его не тестировал. Но ваш код должен быть похож на что-то похожее на блокировку и разблокировку учетной записи пользователя. Рано или поздно вам придется использовать DirectoryEntry.Properties [], чтобы установить для него значение в вашем классе объектов.

РЕДАКТИРОВАТЬ

Какой способ блокировки учетной записи Active Directory является предпочтительным?

   int val = (int)directoryentry.Properties["userAccountControl"].Value;  
   directoryentry.Properties["userAccountControl"].Value = val | 0x0010;

против

   directoryentry.InvokeSet("IsAccountLocked", true); 

Отвечая на ваш вопрос, который я поставил в своей редакции, я бы сказал, что это самый простой способ, по крайней мере, я знаю. Насколько я понимаю, я предпочитаю оборачивать эти функции, как я это делал в моем примере кода, поэтому другим программистам не нужно заботиться о побитовых операциях и так далее. Для них они манипулируют объектами.

Что касается лучшего пути между этими двумя, я думаю, это в основном вопрос предпочтений. Если вы легко справляетесь с логическими операциями, обычно они предпочтительнее. Для сравнения, с вторым выбором проще играть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...