AD User Tool — настольная утилита на Python и Tkinter для первичного оформления доменной учётной записи сотрудника. Программа принимает кадровые и контактные данные, формирует логин и начальный пароль, создаёт объект пользователя в Active Directory через LDAPS, назначает атрибуты и группы, а затем выпускает PowerShell-сценарий для домашнего каталога и персональный документ Microsoft Word.
Important
Репозиторий содержит демонстрационный шаблон с вымышленными адресами, доменами, DN, группами и реквизитами организации. В текущем виде приложение нельзя использовать в рабочем домене: перед первым запуском необходимо настроить все значения, перечисленные в руководстве по конфигурации, и выполнить проверку в изолированной тестовой OU.
Проект сокращает количество ручных действий при заведении нового сотрудника и помогает одинаково заполнять атрибуты Active Directory. Он рассчитан на администратора Windows-домена, который запускает приложение с рабочей станции, имеющей сетевой доступ к контроллеру домена и файловому серверу.
Утилита не является полноценной системой управления жизненным циклом учётных записей. Она выполняет один сценарий создания пользователя, не согласовывает заявку, не проверяет уникальность логина, не ведёт журнал операций и не откатывает уже выполненные изменения при частичном сбое.
| Возможность | Реализация |
|---|---|
| Графический интерфейс | Одно окно Tkinter с девятью полями и кнопкой создания |
| Формирование логина | Первая буква имени и фамилия, затем транслитерация по схеме iuliia.GOST_779_ALT и удаление неалфавитно-цифровых символов |
| Начальный пароль | 9 символов в фиксированном порядке: заглавная буква, строчная буква, шесть цифр и один знак #, ! или @ |
| Подключение к AD | LDAP over SSL, TCP 636, аутентификация NTLM |
| Создание пользователя | Заполнение имени, UPN, почты, должности, подразделения, телефонов, кабинета, описания и реквизитов организации |
| Настройка учётной записи | Сброс пароля, разблокировка, включение обычной учётной записи и установка флага «пароль не истекает» |
| Группы безопасности | Добавление созданного DN пользователя в заранее заданные группы |
| Kerio Connect | Необязательные LDAP-атрибуты kerio-Mail-AccountEnabled и kerio-Mail-Active |
| Домашняя папка | Генерация отдельного PowerShell-файла, который задаёт диск Z:, создаёт каталог и назначает ACL Modify |
| Документ сотрудника | Формирование .docx из welcome2.docx через DocxTemplate |
| Русская раскладка | Обработка Ctrl+C, Ctrl+X и Ctrl+V в полях ввода при русской раскладке |
| Сборка | PyInstaller в режиме --onefile --noconsole через build.ps1 |
flowchart TD
A["Данные сотрудника"] --> B["Проверка обязательных полей"]
B --> C["Логин и начальный пароль"]
C --> D["Создание и настройка объекта AD"]
D --> E["Добавление в группы"]
E --> F["PowerShell для домашней папки"]
F --> G["Приветственный документ DOCX"]
LDAP-часть выполняется первой. Если подключение к домену вызывает исключение, генерация локальных файлов не начинается. Ошибка при создании PowerShell-файла или документа Word показывается как предупреждение, но уже созданная учётная запись при этом не удаляется.
| Компонент | Требование |
|---|---|
| Операционная система | Windows 10/11 или Windows Server с графическим сеансом |
| Python | Для запуска из исходников рекомендуется Python 3.12; совместимость с иными версиями должна проверяться отдельно |
| Сеть | Доступ к контроллеру домена по TCP 636 и к целевому файловому серверу |
| Active Directory | Сервисная учётная запись с делегированными правами на целевую OU, нужные атрибуты и группы |
| Сертификат LDAPS | Сертификат контроллера домена и доверенная цепочка; безопасная проверка сертификата требует доработки текущей конфигурации ldap3 |
| Шаблон | Файл welcome2.docx в текущем рабочем каталоге приложения |
| PowerShell-сценарий | Модуль ActiveDirectory и права на изменение пользователя, создание каталога и ACL |
| Microsoft Word | Не требуется для генерации .docx; нужен только Word или совместимый редактор для просмотра результата |
Клонируйте репозиторий и перейдите в его каталог:
git clone https://github.com/NetGraniz/ad_user_tool.git
Set-Location ad_user_toolСоздайте и активируйте виртуальное окружение:
py -3.12 -m venv .venv
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\.venv\Scripts\Activate.ps1Установите зависимости:
python -m pip install --upgrade pip
python -m pip install -r requirements.txtДо запуска замените демонстрационные значения в ad_user_tool.py. Полная карта параметров, DN и атрибутов приведена в CONFIGURATION.md.
Запустите приложение из корня проекта, чтобы относительный путь к шаблону Word разрешился правильно:
python .\ad_user_tool.pyЗаполните обязательные поля «Фамилия», «Имя», «Должность», «Подразделение» и «Кабинет». Телефоны, номер рабочего места и описание можно оставить пустыми. Перед нажатием кнопки создания проверьте написание ФИО: программа применяет .title(), поэтому регистр аббревиатур может измениться.
После нажатия To create приложение выполняет все операции последовательно. При успешном завершении на экране показываются логин и начальный пароль, а в текущем рабочем каталоге появляются файлы <логин>.ps1 и <Фамилия Имя>.docx.
PowerShell-файл не запускается автоматически. Администратор должен проверить путь, букву диска и модель разрешений, после чего выполнить сценарий в контексте учётной записи с необходимыми правами. Подробный рабочий регламент приведён в USAGE.md.
Сценарий сборки удаляет старые каталоги build и dist, активирует .venv, определяет путь к схемам iuliia и передаёт их PyInstaller:
.\build.ps1Результат создаётся по адресу:
dist\ad_user_tool.exe
Текущий build.ps1 включает в EXE схемы транслитерации, но не включает welcome2.docx. Для работы собранного приложения положите шаблон рядом с EXE и запускайте программу из этого каталога либо измените стратегию поиска ресурсов. Детали сборки и отладки описаны в DEVELOPMENT.md.
| Путь | Назначение |
|---|---|
ad_user_tool.py |
Интерфейс, генерация реквизитов, LDAP-операции и создание выходных файлов |
welcome2.docx |
Шаблон персонального документа с переменными DocxTemplate |
requirements.txt |
Зафиксированные прямые и транзитивные зависимости среды разработки |
build.ps1 |
Очистка предыдущей сборки и создание однофайлового EXE через PyInstaller |
.gitignore |
Исключения для виртуального окружения, кэша Python, результатов сборки и IDE |
docs/CONFIGURATION.md |
Настройка домена, OU, групп, Kerio, файлового сервера и шаблона |
docs/USAGE.md |
Пошаговый эксплуатационный регламент и проверка результата |
docs/ARCHITECTURE.md |
Архитектура, последовательность операций и точки расширения |
docs/DEVELOPMENT.md |
Среда разработки, сборка, диагностика и проверка изменений |
docs/TROUBLESHOOTING.md |
Причины типовых ошибок LDAP, Word, PowerShell и PyInstaller |
SECURITY.md |
Риски текущей реализации и требования перед рабочим внедрением |
| Раздел | Когда использовать |
|---|---|
| Конфигурация | Перед первым подключением к тестовому или рабочему домену |
| Эксплуатация | При оформлении нового сотрудника и проверке результатов |
| Архитектура | При сопровождении кода и планировании новых функций |
| Разработка и сборка | При изменении исходников или выпуске EXE |
| Диагностика | При ошибках подключения, LDAP-операций, шаблона или сборки |
| Безопасность | Перед передачей приложения администраторам и вводом в эксплуатацию |
Вызовы conn.add() и conn.modify() возвращают результат операции, однако код его не проверяет. При стандартном режиме ldap3 некоторые ошибки каталога могут не вызвать исключение, поэтому окно Done само по себе не подтверждает, что все изменения применены. После каждого запуска необходимо проверять объект в AD, членство в группах и домашний каталог.
Логин не проверяется на занятость. Повторная фамилия, одинаковые инициалы, составные имена и фамилии могут привести к коллизии или неожиданному имени входа. Пароль создаётся модулем random, который документация Python не рекомендует для генерации секретов. Значение userAccountControl = 66048 включает обычную учётную запись и запрещает истечение пароля. Эти решения должны быть заменены или явно утверждены политикой организации до рабочего применения.
Секрет сервисной учётной записи сейчас хранится непосредственно в исходном коде. Не публикуйте реальные реквизиты в Git, не передавайте собранный EXE третьим лицам и не используйте административную учётную запись уровня Domain Admin. Полный перечень защитных мер приведён в SECURITY.md.
| Проверка | Ожидаемый результат |
|---|---|
| Запуск из исходников | Окно открывается без traceback |
| Обязательные поля | Пустое значение останавливает операцию до подключения к AD |
| Транслитерация | Для контрольных ФИО получается ожидаемый уникальный sAMAccountName |
| LDAPS | Соединение устанавливается с доверенным контроллером домена |
| Создание объекта | Пользователь находится в заданной OU со всеми ожидаемыми атрибутами |
| Пароль и UAC | Вход возможен, а параметры срока действия соответствуют политике |
| Группы | Пользователь добавлен во все настроенные группы |
| PowerShell | Сценарий создаёт домашний каталог, задаёт Z: и ожидаемые ACL |
| Word | Документ открывается, а все четыре переменные заменены значениями |
| Сборка | dist\ad_user_tool.exe запускается на чистой тестовой машине |
Проект представляет собой рабочий прототип и демонстрацию автоматизации администрирования Active Directory. Перед промышленным использованием требуются вынос конфигурации и секретов из кода, криптографически стойкая генерация паролей, проверка результатов LDAP, защита LDAPS-сертификата, обработка коллизий логинов, журналирование и тесты.
В репозитории отсутствует файл лицензии. До добавления лицензии условия копирования, изменения и распространения проекта явно не определены.
Документация проекта опирается на рекомендации Python по генерации секретов, описание флагов userAccountControl Microsoft, руководство ldap3 по SSL/TLS и руководство PyInstaller по добавлению файлов данных.