Создаем виртуальную организацию в Active Directory
Во многих организациях в России и по всему миру используется Active Directory (далее AD), для разграничения доступа пользователей к ресурсам сети и решения прочих проблем администрирования сети.
Как правило, в AD отражается организационная структура предприятия, где OU – соответствуют отделам, а пользователи и ПК создаются и размещаются в соответствующих OU.
Сегодня мы рассмотрим способ быстрого создания структуры виртуального предприятия “Altunin Soft” в AD и наполнение её пользователями с помощью скриптов на Python и PowerShell. Данные скрипты могут быть полезны разработчикам и админам, для быстрого заполнения данными тестового домена.
Active Directory – база данных
AD по сути дела – иерархическая база данных, содержащая информацию о пользователях, компьютерах, серверах, принтерах и прочих устройствах в локальной сети, а так же множество прочей информации необходимых для функционирования домена. Но она же может содержать и любые другие данные, конечно, эффективность хранения и доступа к этим данным остается под вопросом, но это выходит за рамки текущей статьи.
Установка сервера
Для того, чтобы работать с каталогом, нужно для начала заполнить его данными. Для этой статьи я использовал Windiows Server 2019 Evaluate. Скачать образ вы можете отсюда: https://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-2019
Сервер настроен как контролер PDC домена altuninvv.local
Создание структуры предприятия
Для начала определимся - сколько сотрудников у нас будет и какие роли они будут исполнять. Структура примерная, к реальности не имеющая никакого отношения:
Офис 1 (Ленина 1)
- 1 директор
- 2 зама
- 1 секретарь
- 1 главный бухгалтер
- 1 зам главного бухгалтера
- 2 бухгалтера
- 2 системного администратора
Отдел 1
- 1 начальник
- 1 зам
- 20 сотрудников
- Отдел 2
- 1 начальник
- 1 зам
- 20 сотрудников
Офис 2 (Горького 1)
Отдел 3
- 1 начальник
- 1 зам
- 20 сотрудников
Офис 3 (Пушкина 1)
Отдел 4
- 1 начальник
- 1 зам
- 22 сотрудников
Всего 100 человек и три офиса. Это просто виртуальная организация, потому вглубь идти мы не будем, нам нужно более-менее логичная структура.
У секретаря и начальников отделов есть еще и факс.
Генерация ФИО
Нам понадобятся данные пользователей, чтобы заполнить нашу телефонную книгу.
Для генерации массивов данных существует несколько сайтов, но полностью подходящего я не нашел, так что пришлось писать свой скрипт.
Для начала сгенерируем список ФИО. Наш телефонный справочник будет содержать 100 человек.
Переходим по ссылке https://randomus.ru/name?type=0&sex=10&count=100
Выбираем «Списком», выбираем A;B;C и копируем список фамилий в файл fio.csv.
Генерация данных пользователей и подразделений
Для генерации списка подразделений и пользователей я написал скрипт на Python:
import cyrtranslit
import string
import random
import codecs
from random import randint
f = open('fio.csv', 'r')
fio = f.read().split(';')
fout = codecs.open('users.csv', 'w', "utf-8")
fout.write("login;")
fout.write("fio;")
fout.write("fname;")
fout.write("lname;")
fout.write("initials;")
fout.write("samaccname;")
fout.write("cellphone;")
fout.write("workphone;")
fout.write("vntel;")
fout.write("fax;")
fout.write("email;")
fout.write("department;")
fout.write("jobtitle;")
fout.write("addr;")
fout.write("kab;")
fout.write("company;")
fout.write("ou;")
fout.write("passwd\n")
print(fio)
i = 0;
kab = 100;
for val in fio:
fios = val.strip().split(' ')
login = cyrtranslit.to_latin(fios[0],'ru') + cyrtranslit.to_latin(fios[1][0:1].upper(),'ru') + cyrtranslit.to_latin(fios[2][0:1].upper(),'ru')
email = login + "@altuninvv.local"
fname = fios[1]
lname = fios[0]
initials = fios[2][0:1] + "."
samaccname = login
cellphone = "+7(495)" + str(randint(0,9)) + str(randint(0,9)) + str(randint(0,9)) + "-" + str(randint(0,9)) + str(randint(0,9)) + "-" + str(randint(0,9)) + str(randint(0,9))
department = ""
company = "Altunin Soft"
letters = string.ascii_uppercase + string.ascii_lowercase + string.digits + "-=+,.:@!%$&*()~"
password = ''.join(random.choice(letters) for i in range(16))
kab = kab + 1
fax = "+7(495)1240001"
vntel = 100
if (i >-1 ) and (i < 4):
workphone = "+7(495)1230001" + str(i)
vntel = vntel + i
if (i > 3) and (i < 8):
workphone = "+7(495)1230002" + str(i)
vntel = vntel + i
if (i > 7) and (i < 10):
workphone = "+7(495)1230003" + str(i)
vntel = vntel + i
if (i > 9) and (i < 32):
workphone = "+7(495)12301" + str(i)
vntel = vntel + i
if (i > 31) and (i < 54):
workphone = "+7(495)12302" + str(i)
vntel = 200
vntel = vntel + i
if (i > 53) and (i < 76):
workphone = "+7(495)12303" + str(i)
vntel = 300
vntel = vntel + i
if (i > 75):
vntel = 400
workphone = "+7(495)12304" + str(i)
vntel = vntel + i
if (i == 3):
fax = "+7(495)12400001"
elif (i == 4):
fax = "+7(495)12400002"
elif (i == 7):
fax = "+7(495)12400003"
elif (i == 9):
fax = "+7(495)12400004"
elif (i == 31):
fax = "+7(495)12400005"
elif (i == 53):
fax = "+7(495)12400006"
elif (i == 75):
fax = "+7(495)12400007"
else:
fax = ""
if (i >-1 ) and (i < 4):
department = "Руководство"
if (i > 3) and (i < 8):
department = "Бухгалтерия"
if (i > 7) and (i < 10):
department = "It"
if (i > 9) and (i < 32):
department = "Отдел 1"
if (i > 31) and (i < 54):
department = "Отдел 2"
if (i > 53) and (i < 76):
department = "Отдел 3"
if (i > 75):
department = "Отдел 4"
jobtitle = ""
if (i == 0 ):
jobtitle = "Директор"
if (i == 1) or (i == 2):
jobtitle = "Заместитель директора"
if (i == 3):
jobtitle = "Секретарь"
if (i == 4):
jobtitle = "Главный бухгалтер"
if (i == 5):
jobtitle = "Заместитель главного бухгалтера"
if (i == 6) or (i == 7):
jobtitle = "Бухгалтер"
if (i == 8) or (i == 9):
jobtitle = "Системный администратор"
if (i == 10):
jobtitle = "Начальник"
if (i == 11):
jobtitle = "Заместитель начальника"
if (i > 11) and (i < 32):
jobtitle = "Специалист"
if (i == 32):
jobtitle = "Начальник"
if (i == 33):
jobtitle = "Заместитель начальника"
if (i > 33) and (i < 54):
jobtitle = "Специалист"
if (i == 54):
jobtitle = "Начальник"
if (i == 55):
jobtitle = "Заместитель начальника"
if (i > 55) and (i < 76):
jobtitle = "Специалист"
if (i == 76):
jobtitle = "Начальник"
if (i == 77):
jobtitle = "Заместитель начальника"
if (i > 77):
jobtitle = "Специалист"
if (i >-1 ) and (i < 54):
addr = "Ленина 1"
if (i > 53) and (i < 76):
addr = "Горького 1"
if (i > 75):
addr = "Пушкина 1"
if (i >-1 ) and (i < 4):
ou = "OU=ruk,OU=Company,DC=altuninvv,DC=local"
if (i > 3) and (i < 8):
ou = "OU=buh,OU=Company,DC=altuninvv,DC=local"
if (i > 7) and (i < 10):
ou = "OU=it,OU=Company,DC=altuninvv,DC=local"
if (i > 9) and (i < 32):
ou = "OU=otdel1,OU=Company,DC=altuninvv,DC=local"
if (i > 31) and (i < 54):
ou = "OU=otdel2,OU=Company,DC=altuninvv,DC=local"
if (i > 53) and (i < 76):
ou = "OU=otdel3,OU=Company,DC=altuninvv,DC=local"
if (i > 75):
ou = "OU=otdel4,OU=Company,DC=altuninvv,DC=local"
print("Processing: " + login)
i = i + 1
fout.write(login+";")
fout.write(val+";")
fout.write(fname+";")
fout.write(lname+";")
fout.write(initials+";")
fout.write(samaccname+";")
fout.write(cellphone+";")
fout.write(workphone+";")
fout.write(str(vntel)+";")
fout.write(fax+";")
fout.write(email+";")
fout.write(department+";")
fout.write(jobtitle+";")
fout.write(addr+";")
fout.write(str(kab)+";")
fout.write(company+";")
fout.write(ou+";")
fout.write(password)
fout.write("\n")
fout.close()
print("---------------")
f.close()
fout = codecs.open('ous.csv', 'w', "utf-8")
fout.write("name;descr\n")
fout.write("ruk;Руководство\n")
fout.write("buh;Бухгалтерия\n")
fout.write("it;IT\n")
fout.write("otdel1;Отдел 1\n")
fout.write("otdel2;Отдел 2\n")
fout.write("otdel3;Отдел 3\n")
fout.write("otdel4;Отдел 4\n")
fout.close()
print("Done!")
Для работы он требует библиотеку cyrtranslit (https://github.com/opendatakosovo/cyrillic-transliteration)
Установите её используя pip или скачав исходный код, скопируйте папку cyrtranslit в папку с скриптом.
Запускаем
python generator.py
Скрипт создаст два файла с данными:
ous.csv users.csv
Добавляем данные в AD
Чтобы добавить в Active Directory сгенерированные подразделения и пользователей, был написан PowerShell-скрипт:
Import-Module ActiveDirectory
$ous = Import-Csv -Encoding UTF8 -Delimiter ';' -Path $PSScriptRoot"\ous.csv"
New-ADOrganizationalUnit –Name Company –Path " DC=altuninvv,DC=local" –Description "Altunin Soft"
foreach ($ou in $ous) {
New-ADOrganizationalUnit –Name $ou.name `
–Path "OU=Company,DC=altuninvv,DC=local" `
–Description $ou.descr
}
$users = Import-Csv -Encoding UTF8 -Delimiter ';' -Path $PSScriptRoot"\users.csv"
foreach ($user in $users) {
New-ADUser -Name $user.login `
-DisplayName $user.fio `
-GivenName $user.fname `
-Surname $user.lname `
-Initials $user.initials `
-OfficePhone $user.workphone `
-Department $user.department `
-Title $user.jobtitle `
-UserPrincipalName $user.login `
-MobilePhone $user.cellphone `
-SamAccountName $user.samaccname `
-Path $user.ou `
-EmailAddress $user.email `
-StreetAddress $user.addr `
-Office $user.kab `
-Company $user.company `
-Fax $user.fax `
-AccountPassword (ConvertTo-SecureString $user.passwd -AsPlainText -force) -Enabled $true
Set-ADUser -Identity $user.login `
-Add @{otherTelephone=$user.vntel}
}
Запустите его от имени администратора.
Данный скрипт, используя созданные файлы, создаст в AD сначала подразделения, а потом и пользователей в них.
Вот что получилось у меня:
Заключение
Сегодня мы рассмотрели способ быстрого заполнения тестового домена AD структурой.
Для создания списка с ФИО пользователей был использован бесплатный сайт в сети Internet.
Для генерации данных о подразделениях и списка с информацией пользователей скрипт на Python.
Для добавления информации в AD используется PowerShell скрипт.
Готовые скрипты вы можете найти на GitFlic.
В папке ready вы найдете уже сгенерированные данные, так что сможете сразу использовать скрипт для импорта их в ваш тестовый домен.
Добавить комментарий