Штат любой организации постоянно обновляется, одни сотрудники поступают на работу, другие увольняются. И, как известно, далеко не всегда человек бывает доволен тем, что покидает компанию. Если у такого недовольного экс-работника есть ключи от офиса, руководитель наверняка поменяет замок. Если у бывшего пользователя имеется учетная запись, необходимо сделать так, чтобы он не смог ею воспользоваться — особенно если с данной учетной записью связаны привилегии, которые в принципе дают ее владельцу возможность причинить вред. В этой статье речь пойдет о том, как с помощью программных средств включать и отключать учетные записи пользователей и устанавливать пароли учетных записей. Кроме того, я расскажу о программе, с помощью которой можно разрешить пользователям менять пароли даже тогда, когда доступ к диалоговому окну Windows Security из соображений безопасности закрыт.
Включение и отключение учетных записей
Даже если сотрудник отсутствует временно, лучше на этот период перевести его учетную запись в режим бездействия, чтобы злоумышленники не могли воспользоваться данной учетной записью для атаки на систему. Однако удалять бездействующую учетную запись не стоит, поскольку в таком случае придется восстанавливать все связанные с ней настройки безопасности, когда пользователь вернется. Любой опытный администратор знает, что учетную запись следует отключать на то время, пока она не используется, и удалять ее только тогда, когда есть полная уверенность, что эта учетная запись больше не понадобится.
Чтобы упростить процесс блокирования учетной записи, когда пользователь отсутствует, и включения учетной записи, когда он возвращается, можно задействовать программу из листинга 1. Сценарий прост: сначала выполняется подключение к выбранной учетной записи, затем изменяется параметр AccountDisabled. Также можно отключить учетную запись, редактируя управляющий флаг, связанный с учетной записью, но предлагаемый мною метод, во-первых, проще, а во-вторых, одинаково эффективен для наших целей. Если необходимо, чтобы эта же программа выполняла двойную обязанность (т. е. отключение и включение учетных записей), требуется сделать параметр AccountDisabled аргументом программы. Небольшая подпрограмма Help подсказывает пользователю, какое значение следует ввести, чтобы получить желаемый результат. Поскольку программа использует пространство имен WinNT, она будет работать и с доменами SAM, и с доменами Active Directory (AD). Обновив содержимое оснастки Active Directory Users and Computers консоли Microsoft Management Console (MMC) на контроллере домена (DC), вы увидите, что учетная запись с определенным именем теперь отключена или включена, в зависимости от указаний.
Смена пароля учетной записи
Иногда отключение учетной записи не подходит, например, невозможно отключить учетную запись администратора, используемую несколькими сотрудниками, только потому, что один человек уходит. В таком случае требуется изменить пароль учетной записи.
Active Directory Service Interfaces (ADSI) поддерживает два метода изменения паролей: ChangePassword и SetPassword. При использовании ChangePassword необходимо, чтобы сотрудник, осуществляющий смену пароля, знал текущий пароль. Едва ли ChangePassword — инструмент для администраторов, поскольку администраторы не должны знать паролей пользователей. Однако ChangePassword действительно удобен, когда администратор закрывает доступ к диалоговому окну Windows Security, используя Group Policy или другие средства, но хочет разрешить пользователям менять свои пароли. SetPassword как раз просто заменяет существующий пароль новым.
Программа, позволяющая зарегистрированному пользователю менять пароль, должна делать следующее:
- распознавать имя пользователя;
- запрашивать текущий пароль пользователя;
- предлагать пользователю ввести новый пароль;
- предлагать пользователю подтвердить новый пароль;
- сравнить два пароля и не принять их, если они не совпадают;
- изменить пароль и записать новый пароль в базу данных безопасности;
- сделать запись о том, что пароль был изменен.
О том, как реализовать эти действия в виде кода, рассказывалось в предыдущих статьях, поэтому здесь я сосредоточу свое внимание только на том, как эти части собраны вместе в программе в листинге 2.
Во-первых, надо идентифицировать зарегистрировавшегося пользователя. Напомню, что свойство UserName объекта WshNetwork возвращает имя пользователя. Поэтому для того, чтобы получить имя пользователя, нужно создать объект WshNetwork (WScript.Network), связать этот объект с переменной (oNet), а затем задействовать свойство UserName для извлечения имени пользователя, как показано в метке A листинга 2.
Теперь, когда у нас есть имя текущего пользователя, можно применить функцию InputBox и запросить у пользователя текущий и новый пароли. Проще всего создать для этих целей небольшую подпрограмму. Подпрограмма CheckPwd хранит в глобальных переменных sPword1, sPword2 и sPword3 текущий и новый пароли. Подпрограмма запрашивает у пользователя текущий пароль (sPword1), новый пароль (sPword2) и еще раз новый пароль (sPword3) для подтверждения. Если новый пароль и пароль-подтверждение не совпадают, подпрограмма сообщает об этом пользователю и выводит запрос заново. Сравнение sPword2 и sPword3 чувствительно к регистру, поэтому FROG и frog — не одно и то же.
Как объяснялось ранее, функция InputBox языка VBScript всегда отображает кнопки OK и Cancel и зависит от трех аргументов:
InputBox (prompt, title, default)
где prompt — это текст окна сообщения, title — текст заголовка, а default — значение по умолчанию. Поскольку эти аргументы разделяются запятыми, использовать запятые внутри текста окна сообщения и заголовка нельзя. Вместо запятых можно применять символ конкатенации (&), как в подпрограмме CheckPwd.
Функция InputBox имеет один недостаток: она не поддерживает маскировку вводимых символов. Так, если пользователь вводит в диалоговом окне слово swordfish, соответствующее паролю, то он увидит на экране swordfish, а не ряд из звездочек (*********). Если программа по изменению пароля выполняется в Windows 2000 и более ранних версиях, с этим ограничением придется смириться, но если программа выполняется в Windows Server 2003 или Windows XP, существует еще одна возможность. Эти версии Windows содержат компонент scriptpw.dll, который маскирует вводимые пользователем символы. Компонент scriptpw несовершенен — при вводе нет точного соответствия количества введенных символов и заменяющих их звездочек, но это более безопасно, чем открытый набор паролей в окне ввода.
Подпрограмма HidePwd содержит код, использующий Scriptpw. Код HidePwd подобен коду CheckPwd, за исключением того, что HidePwd выдает приглашение вводить символы в командной строке, а не в диалоговом окне и HidePwd скрывает вводимые пользователем символы. Строка ответа командного процессора после каждого запроса пароля заканчивается переходом на новую строку, иначе весь выводимый текст содержался бы в одной строке.
Для того чтобы не потребовалось иметь две версии программы по изменению пароля, Userpword.vbs определяет операционную систему и только затем выполняет соответствующую подпрограмму ввода паролей. Объект, представляющий компьютер, имеет свойство OperatingSystemVersion, которое можно запросить. Точное совпадение не требуется. Необходимо только знать, не меньше ли номер версии, чем 5.1, т. е. номер версии XP. Программа уже использовала объект WshNetwork для получения имени компьютера, поэтому код в листинге 2 под меткой B проверяет версию операционной системы на локальном компьютере.
Какую бы подпрограмму ввода паролей ни использовала программа, она сохраняет новый пароль в sPword2, а старый пароль — в sPword1, а затем передает их в код под меткой C, который и меняет пароль. Если пользователь не предоставит правильный старый пароль, работа программы завершится с весьма красноречивым сообщением об ошибке: The specified network password is not correct.
Назначение паролей учетным записям
Если текущего пароля учетной записи нет, то для назначения пароля применяется несколько иной подход. Программа должна сделать следующее:
- принять полученные имя пользователя и домена;
- найти имя пользователя в базе данных безопасности;
- выдать приглашение для ввода нового пароля;
- назначить новый пароль;
- потребовать от пользователя изменить пароль при следующей регистрации (чтобы администратор не знал его);
- сделать запись о том, что пароль был изменен.
Большая часть программы Adminpword.vbs для назначения пароля, показанной в листинге 3, состоит из кода, уже написанного для двух первых программ. Из Disableuser.vbs программа Adminpword.vbs берет код, принимающий имя пользователя и домена и подключающийся к соответствующей учетной записи. Из Userpword.vbs программа Adminpword.vbs берет подпрограммы, которые выдают приглашение ввести новый пароль. Подпрограммы в Adminpword.vbs немного изменены, поскольку текущий пароль не нужен. Можно было бы в явном виде указать пароль по умолчанию в Adminpword.vbs, но делать этого не следует. Если в явном виде записать пароль в Adminpword.vbs, он будет храниться как простой текст. Довольно просто реализуется в виде кода оставшаяся часть задачи по назначению нового пароля, а именно требование сменить пароль при следующей регистрации и запись о том, что пароль был изменен.
Поскольку назначается новый пароль, метод ChangePassword заменяется на метод SetPassword и вводится только новый пароль, как показано в метке A листинга 3. Свойство PasswordExpired определяет, должен ли пользователь сменить пароль при следующей регистрации. Когда значение этого параметра равно 0, пароль действителен, когда 1 — срок действия пароля истек. Следовательно, чтобы добиться смены пароля, необходимо присвоить этому параметру значение 1. Поскольку oUser представляет пользовательскую учетную запись, код в метке B листинга 3 вынуждает сменить пароль.
Отключение учетной записи или изменение пароля должно завершаться соответствующей записью в журнале событий. Напомню, что в предыдущей статье о редактировании реестра говорилось, что для записи в Event Log нужно подключиться к объекту WshShell и использовать метод LogEvent с типом события и поясняющим текстом в качестве аргументов. В нашем случае тип события — уведомление, так что это событие типа 4. Дата и время автоматически записываются вместе с событием, поэтому в программу их можно не вносить. Чтобы об изменении пароля была сделана запись, следует в конец основной программы ввести код, показанный в метке C листинга 3.
Функции отключения неиспользуемых учетных записей и изменения паролей очень важны, и соответствующие им программы должны быть максимально простыми и эффективными. Но процедура изменения пароля через графический интерфейс Windows 2000, к примеру, состоит из шести шагов. Применяя программу, описанную в данной статье, администраторы смогут без труда включать и отключать пользовательские учетные записи, предоставлять пользователям возможность менять свои пароли, не имея доступа к диалоговому окну Windows Security, и устанавливать новые пароли для важных учетных записей.
Криста Андерсон — независимый автор и консультант журнала Windows NT Magazine. С ней можно связаться по адресу: candersn@adelphia.net