Код программы UserInfo – часть 2

Во второй части постараюсь описать, как происходит определение состояние учетной записи пользователя во время поиска и как с помощью CheckBox идет управление учетной записью пользователя.

Как всегда, все интересное начинается с чтения документации. Первая статья (http://support.microsoft.com/kb/305144/ru) дала общее представление об атрибуте userAccountControl и подход к написанию кода. Для работы программы нужно было “поймать” только два значения состояния учетной записи в десятичном формате:

512 = включена
514 = выключена
66048 = включена, срок действия пароля не истекает
66050 = выключена, срок действия пароля не истекает

В предыдущей части (Код программы UserInfo – часть 1) я рассказал, как собирается массив данных из Active Directory. Из этого массива нам нужен 13 элемент, который содержит значения атрибута userAccountControl (User_atrib[13]).

if (User_atrib[13].ToString() == "66048" || User_atrib[13].ToString() == "512")
{ checkBox1.Checked = false; }
else
{ checkBox1.Checked = true; }

Дальше проверяется заблокирована учетная запись или нет. Вторая статья для изучения: http://msdn.microsoft.com/en-us/library/ms677840. В результате получился следующий код:

DirectoryEntry user = new DirectoryEntry("LDAP://" + textBox14.Text, null, null, AuthenticationTypes.Secure);

Загружаем с помощью DirectoryEntry.RefreshCache значения свойства msDS-User-Account-Control-Computed в кэш свойств. Они не будут применены и сохранены в Active Directory пока не будет использован метод DirectoryEntry.CommitChanges. Во время поиска нам это и не нужно.

user.RefreshCache(new string[] { "msDS-User-Account-Control-Computed" });
int val = (int)user.Properties["msDS-User-Account-Control-Computed"].Value;
const int UF_LOCKOUT = 0x0010;
if (Convert.ToBoolean(val & UF_LOCKOUT))
{ checkBox2.Checked = true;checkBox2.Enabled = true; }
else
{ checkBox2.Checked = false; checkBox2.Enabled = false; }

На этом поиск завершен.

Дальше приведу листинг, в котором происходит включение/выключение, блокировка/разблокировка в зависимости от результатов поиска.

Включение/выключение:

{
if (textBox14.Text != String.Empty)
{
if (checkBox1.Checked == true)
{
// Disable a User Account
try
{
DirectoryEntry user = new DirectoryEntry("LDAP://" + textBox14.Text, null, null, AuthenticationTypes.Secure);
int val = (int)user.Properties["userAccountControl"].Value;
user.Properties["userAccountControl"].Value = val | 0x2;
//ADS_UF_ACCOUNTDISABLE;
user.CommitChanges();
user.Dispose();
user.Close();
MessageBox.Show("Учетная запись ВЫКЛЮЧЕНА");
}
catch (DirectoryServicesCOMException ex) { MessageBox.Show(ex.Message.Trim()); FieldDisable(); }
catch (UnauthorizedAccessException) { MessageBox.Show("Отказано в доступе к объекту\r\nУ Вас нет прав на проведение данной операции."); FieldDisable(); }
catch (Exception ex) { MessageBox.Show(ex.Message.Trim() + "\r\n" + ex.StackTrace); FieldDisable(); }
}
else
{
// Enable a User Account
try
{
DirectoryEntry user = new DirectoryEntry("LDAP://" + textBox14.Text, null, null, AuthenticationTypes.Secure);
int val = (int)user.Properties["userAccountControl"].Value;
user.Properties["userAccountControl"].Value = val & ~0x2;
//ADS_UF_NORMAL_ACCOUNT;
user.CommitChanges();
user.Dispose();
user.Close();
MessageBox.Show("Учетная запись ВКЛЮЧЕНА");
}
catch (DirectoryServicesCOMException ex) { MessageBox.Show(ex.Message.Trim()); FieldDisable(); }
catch (UnauthorizedAccessException) { MessageBox.Show("Отказано в доступе к объекту\r\nУ Вас нет прав на проведение данной операции."); FieldDisable(); }
catch (Exception ex) { MessageBox.Show(ex.Message.Trim() + "\r\n" + ex.StackTrace); FieldDisable(); }
}
}
}

Блокировка/разблокировка:

if (textBox14.Text != String.Empty)
{
if (checkBox2.Checked == false)
{
try
{
DirectoryEntry user = new DirectoryEntry("LDAP://" + textBox14.Text, null, null, AuthenticationTypes.Secure);
user.Properties["lockoutTime"].Value = 0;
user.CommitChanges();
user.Dispose();
user.Close();
checkBox2.Enabled = false;
MessageBox.Show("Учетная запись РАЗБЛОКИРОВАНА");
}
catch (DirectoryServicesCOMException ex) { MessageBox.Show(ex.Message.Trim()); FieldDisable(); }
catch (UnauthorizedAccessException) { MessageBox.Show("Отказано в доступе к объекту\r\nУ Вас нет прав на проведение данной операции."); FieldDisable(); }
catch (Exception ex) { MessageBox.Show(ex.Message.Trim() + "\r\n" + ex.StackTrace); FieldDisable(); }
}
}

На этом все интересное заканчивается. Как я уже писал ранее, я не считаю себя программистом и все, что я здесь публикую, возможно, имеет “грубый” подход к программированию (не чистый код или еще что-то). Критику выслушаю с интересом. Если кто-то предложит оптимизировать или доработать код – буду только рад. Исходник выложу по первой же просьбе Улыбка