Поиск по сайту:

Использование 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.

Если у вас есть вопросы, просто оставьте комментарий ниже.