Понедельник, 18.01.2021 08:00

Создаем виртуальную организацию в Active Directory

Создаем виртуальную организацию в 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 вы найдете уже сгенерированные данные, так что сможете сразу использовать скрипт для импорта их в ваш тестовый домен.

Категория Windows

Добавить комментарий

Простой текст

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
Просмотров: 350