posh/create-adusers-csv.ps1

255 lines
12 KiB
PowerShell
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Поля УЗ и описания
#
# Название и описание
# <Имя атрибута AD> | <Имя поля CSV> | [<Имя соответствующего параметра New-ADUser, Set-ADUser>]
#
# Имя - имя сотрудника
# givenName | FirstName | -GivenName
# Фамилия - фамилия сотрудника
# sn | LastName | -Surname
# Инициалы - первая буква отчества сотрудника
# initials | MiddleName[1] | -Initials
# Полное имя - Фамилия Имя Отчество сотрудника (именно в таком порядке)
# name | LastName + FirstName + MiddleName | -Name
# Выводимое имя - Фамилия Имя Отчество сотрудника (именно в таком порядке)
# displayName | LastName + FirstName + MiddleName | -DisplayName
# Комната - номер кабинета сотрудника
# physicalDeliveryOfficeName | Room |
# Номер телефона - внутренний номер телефона сотрудника
# telephoneNumber | IPPhone | -OfficePhone
# IP-телефон - городской номер телефона сотрудника в формате (код_города)ХХХХХХХ
# ipPhone | Phone |
# Факс (при наличии) - номер факса, если имеется факсимильный аппарат, в формате (код_города)ХХХХХХХ
# facsimileTelephoneNumber | Fax | -Fax
# Электронная почта - поле заполняется после подключения сотрудника к сервису электронной почты, осуществляемого только по заявке, вручную не заполняется
# mail | Mail | -EmailAddress
# Почтовый индекс
# postalCode | PostalCode | -PostalCode
# Регион
# st | Region | -State
# Адрес - обязательно заполнять для сотрудников территориальных подразделений
# streetAddress | StreetAddress | StreetAddress
# Должность - должность сотрудника
# title | Title | -Title
# Отдел (department) - структурное подразделение, к которому принадлежит сотрудник (Руководство, Управление, Отдел). Начальникам управлений писать сюда название управления; некоторые названия подразделений могут не входить, их следует однообразно для всех работников подразделения сокращать. Для новых работников - просто скопируйте у уже работающих
# department | DepartmentShort | -Department
# departmentNumber - структурное подразделение, к которому принадлежит сотрудник (Руководство, Управление, Отдел). Начальникам управлений писать сюда название управления; предназначено для ПОЛНОГО наименования подразделения. Именно оно отображается в заявках и записывается в журнале учета
# departmentNumber | Department |
# division - Управление, в котором работает сотрудник, если нет - ничего не пишем
# division | Division | -Division
# Описание - Группа, в которой работает сотрудник, если нет - ничего не пишем
# description | Group | -Description
# Руководитель - непосредственный руководитель сотрудника. Если сотрудник входит в группу внутри отдела - это руководитель группы. Для руководителя группы указывается начальник отдела. Для начальника отдела указывается начальник управления, если отдел входит в управление, или курирующий заместитель генерального директора; для заместителя генерального директора указывается генеральный директор
#
# Расположение - поле "l" - город нахождения сотрудника (Красноярск, Тюмень, Иркутск и т.д., без "г.")
# l | City | -City
# destinationIndicator - Может принимать значения: "Администрация", "Подразделения при администрации", "Обособленные подразделение"
# destinationIndicator | DivisionType |
Param(
[Parameter(Mandatory=$true,
HelpMessage="Domain name like 'example.com'")]
[ValidateNotNull()]
[String]$DomainName,
[Parameter(Mandatory=$true,
HelpMessage="OU like 'OU=Temp,OU=Users,OU=MyCompany,DC=example,DC=com'")]
[ValidateNotNull()]
[String]$OU,
[Parameter(Mandatory=$true,
HelpMessage="CSV file path'")]
[ValidateNotNull()]
[String]$CSVPath,
[Parameter(Mandatory=$false,
HelpMessage="Just print debug and exit")]
[Switch]$DryRun,
[Parameter(Mandatory=$false,
HelpMessage="Plain text password")]
[String]$Password
)
$CSVtempfile = "temp.csv"
$DefaultPassword = "1qaz2wsx#EDC"
#Функция транслитерации
function global:Translit {
param([string]$inString)
$Translit = @{
[char]'а' = "a"
[char]'А' = "A"
[char]'б' = "b"
[char]'Б' = "B"
[char]'в' = "v"
[char]'В' = "V"
[char]'г' = "g"
[char]'Г' = "G"
[char]'д' = "d"
[char]'Д' = "D"
[char]'е' = "e"
[char]'Е' = "E"
[char]'ё' = "yo"
[char]'Ё' = "Yo"
[char]'ж' = "zh"
[char]'Ж' = "Zh"
[char]'з' = "z"
[char]'З' = "Z"
[char]'и' = "i"
[char]'И' = "I"
[char]'й' = "j"
[char]'Й' = "J"
[char]'к' = "k"
[char]'К' = "K"
[char]'л' = "l"
[char]'Л' = "L"
[char]'м' = "m"
[char]'М' = "M"
[char]'н' = "n"
[char]'Н' = "N"
[char]'о' = "o"
[char]'О' = "O"
[char]'п' = "p"
[char]'П' = "P"
[char]'р' = "r"
[char]'Р' = "R"
[char]'с' = "s"
[char]'С' = "S"
[char]'т' = "t"
[char]'Т' = "T"
[char]'у' = "u"
[char]'У' = "U"
[char]'ф' = "f"
[char]'Ф' = "F"
[char]'х' = "h"
[char]'Х' = "H"
[char]'ц' = "c"
[char]'Ц' = "C"
[char]'ч' = "ch"
[char]'Ч' = "Ch"
[char]'ш' = "sh"
[char]'Ш' = "Sh"
[char]'щ' = "sch"
[char]'Щ' = "Sch"
[char]'ъ' = ""
[char]'Ъ' = ""
[char]'ы' = "y"
[char]'Ы' = "Y"
[char]'ь' = ""
[char]'Ь' = ""
[char]'э' = "e"
[char]'Э' = "E"
[char]'ю' = "yu"
[char]'Ю' = "Yu"
[char]'я' = "ya"
[char]'Я' = "Ya"
}
$outCHR=""
foreach ($CHR in $inCHR = $inString.ToCharArray()) {
if ($Translit[$CHR] -cne $Null ) {
$outCHR += $Translit[$CHR]
}
else {
$outCHR += $CHR
}
}
Write-Output $outCHR
}
Import-Module activedirectory
# Конвертация кодировки
Get-Content $CSVPath | Set-Content -Encoding UTF8 $CSVtempfile
# Импорт CSV
$Objects = Import-Csv -Delimiter ';' $CSVtempfile
# Обработка строк
foreach ($Object in $Objects) {
Write-Output ""
Write-Output "-----"
Write-Host -ForegroundColor DarkGreen "Запрошенный пользователь:"
Write-Output $Object
# Вычисляемые параметры
$FullName = $Object.LastName + " " + $Object.FirstName + " " + $Object.MiddleName
$DisplayName = $FullName
$Initials = $Object.MiddleName.Substring(0, 1)
$SamAccountName = $($(Translit($Object.FirstName)).Substring(0, 1).ToLower() + "." + $(Translit($Object.LastName)).ToLower())
$UPN = $SamAccountName + @ + $DomainName.ToLower()
if ($Password -eq "") { $Password = $DefaultPassword }
#if ($Object.Manager -ne "") { $Manager = Get-ADUser -Filter {(cn -eq $Object.Manager)} } else { $Manager = "" }
# Проверка существующей УЗ по полному имени
$User = Get-ADUser -Filter {(cn -eq $FullName)} -Properties DistinguishedName
if ($User -ne $null) {
Write-Warning "Совпадение полного имени с существующей учетной записью:"
Write-Output $User
Write-Warning "Пропускаем."
continue
}
# Проверка совпадения логина
$User = Get-ADUser -Filter {(sAMAccountName -eq $SamAccountName)}
if ($User -ne $null) {
Write-Warning "Совпадение логина ($SamAccountName) с существующей учетной записью:"
Write-Output $User
Write-Warning "Пробуем второй вариант:"
$SamAccountName = $($(Translit($Object.FirstName)).Substring(0, 1).ToLower() + $(Translit($Object.MiddleName)).Substring(0, 1).ToLower() + "." + $(Translit($Object.LastName)).ToLower())
$User = Get-ADUser -Filter {(sAMAccountName -eq $SamAccountName)}
if ($User -ne $null) {
Write-Warning "Совпадение второго варианта логина ($SamAccountName) с существующей учетной записью:"
Write-Output $User
Write-Warning "Невозможно создать УЗ в автоматическом режиме. Пропускаем."
continue
}
}
Write-Output $($FullName + "|" + $SamAccountName + "|" + $UPN + "|" + $Password)
# Ничего не делаем, если DryRun
if ($DryRun) { continue }
# Создание учетной записи
New-ADUser `
-UserPrincipalName $UPN `
-SamAccountName $SamAccountName `
-Enabled $false `
-AccountPassword (ConvertTo-SecureString $Password -AsPlainText -force) `
-ChangePasswordAtLogon $true `
-Path $OU `
-Name $FullName `
-DisplayName $DisplayName `
-GivenName $($Object.FirstName + " " + $Object.MiddleName) `
-Surname $Object.LastName `
-Initials $Initials `
-Title $Object.Title `
-OfficePhone $Object.IPPhone `
-MobilePhone $Object.MobilePhone `
-Fax $Object.Fax `
-EmailAddress $Object.Mail `
-Country $Object.Country `
-PostalCode $Object.PostalCode `
-City $Object.City `
-StreetAddress $Object.StreetAddress `
-Company $Object.Company `
-Division $Object.Division `
-Department $Object.DepartmentShort `
-Description $Object.Group `
-Manager $Manager `
-OtherAttributes @{
ipPhone = $Object.Phone;
physicalDeliveryOfficeName = $Object.Room;
destinationIndicator = $Object.DivisionType;
departmentNumber = $Object.Department }
}
if ($DryRun) {
Write-Output ""
Write-Warning "Использован ключ DryRun, изменений не произведено."
}