Использование PowerShell для обновления пользователя AD из CSV-файла
Мне нужно было обновить много пользователей Active Directory с их новыми должностями. Новый год начался, и некоторые получили повышение и новую должность. Поэтому я получил файл Excel с их полными именами и новыми должностями от HR. Поскольку это происходит каждый год, пора создать для этого скрипт PowerShell.
В качестве бонуса мы также отправим пользователю электронное письмо, чтобы уведомить его о том, что его должность изменена. Таким образом, ему больше не нужно связываться с IT по этому поводу.
Импортирование CSV файла в PowerShell
Для обновления пользователя AD мы будем использовать файл CSV. Это позволяет нам использовать командлет Import-CSV в PowerShell. Я использовал следующую таблицу Excel, которую сохранил в формате CSV.
| имя | название должности |
| Джон Доу | старший менеджер по работе с клиентами |
| Джейн Доу | менеджер по аккаунтам |
| Салина Скотт | инженер |
| Джаспер Ремпел | младший инженер |
С помощью параметра csvPath мы можем указать расположение CSV-файла, который хотим импортировать.
Set-UserPromotions.ps1 -csvPath c:\temp\promotions.csvТеперь для импорта CSV-файла в PowerShell мы используем следующую команду позже:
$promotions = Import-Csv -Delimiter ";" -Path $csvPathСовет
По умолчанию, Разделитель - это запятая ( , ), но вы можете изменить его, используя параметр -Delimiter. Как вы можете видеть, я использую $rootPath для ссылки на расположение скрипта. Вы также можете указать абсолютный путь к файлу здесь.
Результат $промоакций:
name jobtitle
-------------
John Doe senior accountmanager
Jane Doe accountmanager
Salina Scott Engineer
Jasper Rempel junior engineer
Поиск пользователя AD для обновления
Get-ADUserУ нас нет одного пользователя, а целый список. Поэтому мы собираемся использовать цикл foreach, чтобы пройтись по списку пользователей.
foreach($user in $promotions){
# Find user
$ADUser = Get-ADUser -Filter "displayname -eq '$($user.name)'"
}Итак, мы пытаемся получить каждого пользователя в таблице акций. Теперь хорошей практикой является реализация обработки ошибок на случай, если пользователь не существует. Возможно, HR допустил опечатку, что может привести к тому, что пользователь не будет найден.
Также нам понадобится адрес электронной почты пользователя позже, чтобы отправить ему уведомление. Добавьте свойство mail к команду Get-ADUser.
foreach($user in $promotions){
#find user
$ADUser = Get-ADUser -Filter "displayname -eq '$($user.user)'" -Properties mail
if ($ADUser){
# <update the user>
}else{
Write-Warning ("Failed to update " + $($user.user))
}
}Обновление пользователя AD
Если пользователи существуют в Active Directory, мы можем использовать Set-ADUser для обновления атрибута. В данном случае атрибута должности, но это может быть любой атрибут, связанный с пользователем AD.
Совет
Читать далее о команде Set-ADUser в этой статье.
foreach($user in $promotions){
# Find user
$ADUser = Get-ADUser -Filter "displayname -eq '$($user.name)'" -Properties mail
if ($ADUser){
Set-ADUser -Identity $ADUser -Title $user.jobtitle
}else{
Write-Warning ("Failed to update " + $($user.name))
}
}Если вы хотите только обновить пользователя AD из CSV-файла, то вы закончили. Если вы также хотите отправить им электронное письмо с уведомлением об изменении, тогда продолжайте читать.
Отправка пользователю электронного письма
Я использую шаблон электронной почты, чтобы отправить пользователю электронное письмо. Шаблон представляет собой HTML-файл, который вы можете скачать здесь на GitHub вместе с этим скриптом. Прежде чем отправить письмо, нам нужно заменить некоторые заполнительные элементы на имя пользователя и новый заголовок. Также нам нужен SMTP-сервер для отправки электронной почты.
Настройка деталей STMP
Ниже представлен простой массив с деталями SMTP, такими как сервер и адрес отправителя.
#SMPT Details to send the email
$smtp = @{
"address" = "stonegrovebank.mail.protection.outlook.com"
"from" = "itdept@stonegrovebank.com>"
"subject" = "Jobtitle updated."
}Создание тела электронной почты
У меня есть функция, которую я использую для создания тела электронного письма. Использование функций позволяет мне повторно использовать части кода в разных скриптах. Первая функция получит шаблон письма и заменит заполнители правильными данными.
Function Get-EmailTemplate {
<#
.SYNOPSIS
Get the eamil template which is located in the same location as the script
#>
PARAM(
[parameter(Mandatory=$true)]
$user,
[parameter(Mandatory=$true)]
$jobtitle
)
PROCESS
{
#Get the mailtemplate
$mailTemplate = (Get-Content ($rootPath + '\MailTemplate.html')) | ForEach-Object {
$_ -replace '{{user.jobtitle}}', $jobtitle`
-replace '{{user.firstname}}', $user.givenName
} | Out-String
return $mailTemplate
}
}В цикле foreach, после команды Set-ADuser мы добавляем следующую строку для вызова функции и формирования тела электронного письма:
$emailBody = Get-EmailTemplate -user $ADUser -JobTitle $user.jobtitleОтправка письма
Последняя функция предназначена для отправки электронной почты. Она берет данные SMTP из массива SMTP и использует предоставленную информацию для отправки электронной почты. Я добавил переменную "что если", чтобы вы могли провести тест перед отправкой настоящего письма.
Function Send-Mail {
<#
.SYNOPSIS
Send the user a mail.
#>
PARAM(
[parameter(Mandatory=$true)]
$emailBody,
[parameter(Mandatory=$true)]
$user,
[parameter(Mandatory=$false)]
[bool]$whatIf
)
PROCESS
{
#Set encoding
$encoding = [System.Text.Encoding]::UTF8
Try
{
if ($whatIf -ne $true)
{
send-MailMessage -SmtpServer $smtp.address -To $user.mail -From $smtp.from -Subject $smtp.subject -Encoding $encoding -Body $emailBody -BodyAsHtml
}
else
{
Write-host ("Send mail to -SmtpServer " + $smtp.address + " -To " + $user.mail + " -From " + $smtp.from + " -Subject $smtp.subject")
}
}
Catch
{
Write-Error "Failed to send email to, $_"
}
}
}
Мы вызываем эту функцию с помощью следующей команды, которую мы добавляем ниже тела электронного письма:
Send-Mail -user $ADUser -EmailBody $emailBodyИтак, полный цикл foreach теперь выглядит так:
foreach($user in $promotions){
#find user
$ADUser = Get-ADUser -Filter "displayname -eq '$($user.user)'" -Properties mail
if ($ADUser){
Set-ADUser -Identity $ADUser -Title $user.jobtitle -WhatIf
$emailBody = Get-EmailTemplate -user $ADUser -JobTitle $user.jobtitle
Send-Mail -user $ADUser -EmailBody $emailBody -whatIf $true
}else{
Write-Warning ("Failed to update " + $($user.user))
}
}Обратите внимание, что я добавил два WhatIf флага. Один для команды Set-ADUser и один для команды Send-mail. Таким образом, вы можете запустить свой скрипт для тестирования перед фактическими изменениями или отправкой чего-либо.
Заключение
Я надеюсь, что код выше помог вам обновить пользователя AD из файла CSV с помощью PowerShell. Вы можете найти полный скрипт и шаблон электронной почты здесь в моем репозитории на GitHub.
Если у вас есть вопросы, просто оставьте комментарий ниже.