При работе в компьютерной сети существуют два типа учетных записей, локальные и доменные.
Создайте проект Windows Form в Microsoft Visual Studio и добавьте на главную форму два компонента:
Что бы подробнее рассмотреть принцип работы кода, проведем отладку программы на обычной учетной записи, у нее обнаружено 84 свойства (смотрите скриншот ниже), но нам необходимо из них всего одно «UserAccountControl». Если выбрать данное свойство и посмотреть возвращаемое значение, то можно увидеть, что там содержится число 512 в десятичном формате или 0x0200 в шестнадцатеричном. Данное число соответствует флагу NORMAL_ACCOUNT - Тип учетной записи, используемой по умолчанию и представляющей обычного пользователя.
Само число также является «эталоном» в данном свойстве. Для того чтобы объяснить более подробно, возьмем отключенную учетную запись и посмотрим в режиме отладки возвращаемое значение.
В данном случае, свойство «UserAccountControl» содержит число 514 в десятичном формате. Чтобы определить к какому флагу относится данное значение необходимо вычесть число 512 - «эталон» от полученного значения, в результате получится значение 2, что соответствует флагу ACCOUNTDISABLE - Отключенная учетная запись пользователя.
Если воспользоваться программой Ldp.exe которая показывает значения в шестнадцатеричном формате, результатом будет 0x0202 (0x002 + 0x0200) или в десятичном формате 514 (2 + 512).
- Локальные учетные записи создаются на данном компьютере.
- Доменные учетные записи создаются на контроллерах домена. И именно контроллеры домена проверяют параметры входа такого пользователя в систему. Чтобы пользователи домена могли иметь доступ к ресурсам локальной системы, при включении компьютера в состав домена Windows производится добавление группы пользователей домена в группу локальных пользователей, а группы администраторов домена — в группу локальных администраторов компьютера. Таким образом, пользователь, аутентифицированный контроллером домена, приобретает права пользователя локального компьютера. А администратор домена получает права локального администратора.
Создайте проект Windows Form в Microsoft Visual Studio и добавьте на главную форму два компонента:
- textBox1 – поле для ввода доменной учетной записи;
- button1 – кнопка запуска проверки.
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», смотрите пример ниже:Данное средство входит в пакет обновления 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.
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
Описание свойств флагов:В домене под управлением 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) Данной учетной записи разрешено делегирование. Данный параметр влияет на безопасность. Учетные записи с разрешенным делегированием должны использоваться крайне осмотрительно. Этот параметр разрешает службе, выполняющейся под данной учетной записью, использовать учетные данные и проходить проверку подлинности от имени этого пользователя для других удаленных серверов в сети.
Ссылка для скачивания примера: Яндекс.Диск