diff --git a/create-adusers-csv b/create-adusers-csv new file mode 100644 index 0000000..9c3877a --- /dev/null +++ b/create-adusers-csv @@ -0,0 +1,255 @@ +# Поля УЗ и описания +# +# Название и описание +# <Имя атрибута 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, изменений не произведено." +} \ No newline at end of file