11 дек. 2013 г.

Проверка состояния доменной учетной записи


При работе в компьютерной сети существуют два типа учетных записей, локальные и доменные.
  • Локальные учетные записи создаются на данном компьютере.
  • Доменные учетные записи создаются на контроллерах домена. И именно контроллеры домена проверяют параметры входа такого пользователя в систему. Чтобы пользователи домена могли иметь доступ к ресурсам локальной системы, при включении компьютера в состав домена Windows производится добавление группы пользователей домена в группу локальных пользователей, а группы администраторов домена — в группу локальных администраторов компьютера. Таким образом, пользователь, аутентифицированный контроллером домена, приобретает права пользователя локального компьютера. А администратор домена получает права локального администратора.
      Рассмотрим доменные учетные записи, а именно получение свойств учетной записи пользователя. Т.е. будем проверять такие параметры как: просрочен ли пароль пользователя, требуется ли пароль или отключена ли данная запись. Реализуем пример проверки, в каком состоянии находится учетная запись, отключена или включена.
      Создайте проект Windows Form в Microsoft Visual Studio и добавьте на главную форму два компонента:
  • textBox1 – поле для ввода доменной учетной записи;
  • button1 – кнопка запуска проверки.
      Сделайте двойной клик левой клавишей мыши по компоненту «button1» и перейдите в автоматически созданный метод «button1_Click». Добавьте приведенный ниже листинг в данный метод.
const long ADS_UF_ACCOUNTDISABLE = 0x0002;
int flags = 0;

#region Состояние карточки пользователя
System.DirectoryServices.DirectoryEntry control = new System.DirectoryServices.DirectoryEntry() 
{ Path = "LDAP:// OU=Users,OU=Кладовщики,OU=Подразделение1,DC=ООО" };

System.DirectoryServices.DirectorySearcher objADSearchercontrol = new System.DirectoryServices.DirectorySearcher(control);
control.AuthenticationType = System.DirectoryServices.AuthenticationTypes.Secure;

objADSearchercontrol.SearchRoot = control;
objADSearchercontrol.Filter = "(SAMAccountName=" + textBox1.Text.Trim() + ")";

System.DirectoryServices.SearchResult results = objADSearchercontrol.FindOne();
if (results.ToString() != "")
{
    flags = Convert.ToInt32(results.Properties["userAccountControl"][0].ToString());           
}

//Первый вариант сравнения значений
if ((flags-512) == ADS_UF_ACCOUNTDISABLE)
{
    MessageBox.Show("ВНИМАНИЕ! Учетная запись пользователя отключена!");
}

//Второй вариант сравнения значений
if (Convert.ToBoolean(flags & ADS_UF_ACCOUNTDISABLE))
{
    MessageBox.Show("ВНИМАНИЕ! Учетная запись пользователя отключена!");
}
#endregion
      Для работоспособности кода вам необходимо в переменной «Path» указать LDAP путь к каталогу пользователей в Active Directory. Всякая запись в каталоге LDAP состоит из одного или нескольких атрибутов и обладает уникальным именем (DN — англ. Distinguished Name). Уникальное имя может выглядеть, например, следующим образом: «cn=Иван Петров, ou=Сотрудники, dc=example, dc=com».
      LDAP (англ. Lightweight Directory Access Protocol — «облегчённый протокол доступа к каталогам») — относительно простой протокол, использующий TCP/IP и позволяющий производить операции аутентификации (bind), поиска (search) и сравнения (compare), а также операции добавления, изменения или удаления записей. Дополнительную информацию вы можете посмотреть по адресу: http://ru.wikipedia.org/wiki/LDAP.
      Запустите ваш проект, нажав клавишу «F5». Введите в текстовое поле имя учетной записи SAM, например если у вас есть пользователь «Иванов Иван Петров» то учетная запись SAM будет выглядеть так: ivanov_ip. Но на самом деле данное имя задает администратор домена и оно может отличаться от предложенного примера. Нажмите на единственную кнопку вашей формы, если ни ошибок, ни сообщения не последовало, значит это обычная учетная запись. Попробуйте ввести отключенную учетную запись и выполнить проверку. Если таковая имеется, вы получите сообщение вида:
      Что бы подробнее рассмотреть принцип работы кода, проведем отладку программы на обычной учетной записи, у нее обнаружено 84 свойства (смотрите скриншот ниже), но нам необходимо из них всего одно «UserAccountControl». Если выбрать данное свойство и посмотреть возвращаемое значение, то можно увидеть, что там содержится число 512 в десятичном формате или 0x0200 в шестнадцатеричном. Данное число соответствует флагу NORMAL_ACCOUNT - Тип учетной записи, используемой по умолчанию и представляющей обычного пользователя.
      Само число также является «эталоном» в данном свойстве. Для того чтобы объяснить более подробно, возьмем отключенную учетную запись и посмотрим в режиме отладки возвращаемое значение.
      В данном случае, свойство «UserAccountControl» содержит число 514 в десятичном формате. Чтобы определить к какому флагу относится данное значение необходимо вычесть число 512 - «эталон» от полученного значения, в результате получится значение 2, что соответствует флагу ACCOUNTDISABLE - Отключенная учетная запись пользователя.
      Если воспользоваться программой Ldp.exe которая показывает значения в шестнадцатеричном формате, результатом будет 0x0202 (0x002 + 0x0200) или в десятичном формате 514 (2 + 512).


      Ldp.exe — это средство, имеющее графический пользовательский интерфейс и предназначенное для администрирования службы каталогов протокола LDAP. Чтобы администрировать экземпляр служб Active Directory облегченного доступа к каталогам (AD LDS) с помощью программы Ldp.exe, необходимо подключиться к нему и выполнить привязку, а затем отобразить дерево иерархии различающегося имени экземпляра. Это позволит находить объекты в дереве и открывать их для администрирования щелчком правой кнопки мыши.
      Данное средство входит в пакет обновления KB958830 - Средства удаленного администрирования сервера для Windows 7 с пакетом обновления 1 (SP1). Данный пакет вы можете скачать по ссылке: http://www.microsoft.com/ru-ru/download/details.aspx?id=7887.
      Дополнительную информацию по Ldp.exe вы можете получить по адресу: http://technet.microsoft.com/ru-ru/library/cc754970.aspx.
Так же вы можете использовать данное средство для получения пути к каталогу Users вашего домена, в котором вы будете проверять состояние учетной записи. Данный путь необходимо указать в переменной «Path», смотрите пример ниже:
System.DirectoryServices.DirectoryEntry control = new System.DirectoryServices.DirectoryEntry() 
{ Path = "LDAP:// OU=Users,OU=Кладовщики,OU=Подразделение1,DC=ООО" };
Значения и описание флагов свойства «UserAccountControl», учетной записи пользователя, вы можете посмотреть ниже:
Флаг свойства Шестнадцатеричное значение Десятичное значение Действительное значение
SCRIPT 0x0001 1 513
ACCOUNTDISABLE 0x0002 2 514
HOMEDIR_REQUIRED 0x0008 8 520
LOCKOUT 0x0010 16 528
PASSWD_NOTREQD 0x0020 32 544
PASSWD_CANT_CHANGE 0x0040 64 576
ENCRYPTED_TEXT_PWD_ALLOWED 0x0080 128 640
TEMP_DUPLICATE_ACCOUNT 0x0100 256 768
NORMAL_ACCOUNT 0x0200 512 1024
INTERDOMAIN_TRUST_ACCOUNT 0x0800 2048 2560
WORKSTATION_TRUST_ACCOUNT 0x1000 4096 4608
SERVER_TRUST_ACCOUNT 0x2000 8192 8704
DONT_EXPIRE_PASSWORD 0x10000 65536 66048
MNS_LOGON_ACCOUNT 0x20000 131072 131584
SMARTCARD_REQUIRED 0x40000 262144 262656
TRUSTED_FOR_DELEGATION 0x80000 524288 524800
NOT_DELEGATED 0x100000 1048576 1049088
USE_DES_KEY_ONLY 0x200000 2097152 2097664
DONT_REQ_PREAUTH 0x400000 4194304 4194816
PASSWORD_EXPIRED 0x800000 8388608 8389120
TRUSTED_TO_AUTH_FOR_DELEGATION 0x1000000 16777216 16777728

Примечание.
      В домене под управлением Windows Server 2003 флаги LOCK_OUT и PASSWORD_EXPIRED заменены новым атрибутом ms-DS-User-Account-Control-Computed. Для получения дополнительных сведений о данном атрибуте посетите веб-узел: http://msdn.microsoft.com/library/en-us/adschema/adschema/a_msds_user_account_control_computed.asp
Описание свойств флагов:
  • SCRIPT - Запуск сценария входа.
  • ACCOUNTDISABLE - Учетная запись пользователя отключена.
  • HOMEDIR_REQUIRED - Требуется домашняя папка.
  • PASSWD_NOTREQD - Пароль не требуется.
  • PASSWD_CANT_CHANGE - Пользователь не может изменить пароль. Это разрешение на объекте пользователя. Для получения сведений о назначении данного разрешения программным путем посетите веб-узел:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/modifying_user_cannot_change_password_ldap_provider.asp
  • ENCRYPTED_TEXT_PASSWORD_ALLOWED - Пользователь может отправить зашифрованный пароль.
  • TEMP_DUPLICATE_ACCOUNT - Учетная запись для пользователей, чьи основные учетные записи хранятся в другом домене. Данная учетная запись обеспечивает доступ пользователя к данному домену, но не к доменам, которые доверяют ему. Данную учетную запись иногда называют локальной учетной записью пользователя.
  • NORMAL_ACCOUNT - Тип учетной записи, используемой по умолчанию и представляющей обычного пользователя.
  • INTERDOMAIN_TRUST_ACCOUNT - Разрешение доверять учетную запись домену системы, доверяющему другим доменам.
  • WORKSTATION_TRUST_ACCOUNT - Учетная запись для компьютера, использующего Microsoft Windows NT 4.0 Workstation, Microsoft Windows NT 4.0 Server, Microsoft Windows 2000 Professional или Windows 2000 Server и являющегося членом данного домена.
  • SERVER_TRUST_ACCOUNT - Учетная запись для контроллера домена, являющегося членом данного домена.
  • DONT_EXPIRE_PASSWD - Представляется пароль, срок действия которого не истекает для данной учетной записи.
  • MNS_LOGON_ACCOUNT - Учетная запись входа MNS.
  • SMARTCARD_REQUIRED - Пользователь может осуществить вход только с использованием смарт-карты.
  • TRUSTED_FOR_DELEGATION - Учетной записи службы (пользователя или компьютера), под которой выполняется служба, доверяется делегирование Kerberos. Любая подобная служба может олицетворять клиента, запрашивающего службу. Для разрешения делегирования Kerberos необходимо установить данный флаг для свойства Контроль учетных записей учетной записи службы.
  • NOT_DELEGATED - Контекст безопасности пользователя не делегируется службе, даже если учетной записи службы доверено делегирование Kerberos.
  • USE_DES_KEY_ONLY - (Windows 2000/Windows Server 2003) Участник может использовать только тип шифрования DES для ключей.
  • DONT_REQUIRE_PREAUTH - (Windows 2000/Windows Server 2003) Данная учетная запись не требует предварительной проверки Kerberos для входа.
  • PASSWORD_EXPIRED - (Windows 2000/Windows Server 2003) Срок действия пароля пользователя истек.
  • TRUSTED_TO_AUTH_FOR_DELEGATION - (Windows 2000/Windows Server 2003) Данной учетной записи разрешено делегирование. Данный параметр влияет на безопасность. Учетные записи с разрешенным делегированием должны использоваться крайне осмотрительно. Этот параметр разрешает службе, выполняющейся под данной учетной записью, использовать учетные данные и проходить проверку подлинности от имени этого пользователя для других удаленных серверов в сети.

Ссылка для скачивания примера: Яндекс.Диск