255 lines
12 KiB
PowerShell
255 lines
12 KiB
PowerShell
# Поля УЗ и описания
|
||
#
|
||
# Название и описание
|
||
# <Имя атрибута 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, изменений не произведено."
|
||
} |