Наконец-то у меня появился полноценный материал, который не взят всецело с других ресурсов (что мешало мне высветить вопрос).
Итак, суть задачи: поместить фотографии в Active Directory для автоматического отображения в Exchange 2010/2013 и Lync 2010/2013.
Требования к выполнению задачи:
- Размер фотографии до 10Кб
 - ОС контроллера домена - Windows Server 2008 R2. На самом деле, спорный вопрос, так как скрипт можно выполнить на другой машине, где будет присутствовать PowerShell 2.0 и компонент RSAT ADDS, но этот вариант я не проверял.
 - Язык PowerShell 2.0
 - Возможность автоматизации помещения фотографий в AD
 
Для выполнения последней задачи ТЗ был разработан алгоритм:
- Есть некий каталог Temp, где помещаются фотографии необходимого размера. Имя файла-фотографии = SamAccountName пользователя в домене.
 - Скрипт запускается автоматически с помощью ежедневной задачи.
 - Проходит по каждой фотографии в каталоге и по имени файла находит пользователя, у которого проверяет поле thumbnailPhoto.
 - Если поле thumbnailPhoto пустое - записывает фотографию.
 - Ведёт лог выполненных действий.
 
Сам скрипт:
Указываем адрес каталога с фотографиями, как параметр.
$count = 0
Строчка ниже генерирует адрес и имя лог-файла: получает каталог, в котором находится выполняемый скрипт + получает имя выполняемого скрипта + добавляет расширение.
Out-File -FilePath $log -InputObject (Get-Date -Format "dd-MM-yyy") -Encoding utf8 -Append
Импортируем модуль Active Directory.
{
# Включить модуль
import-module ActiveDirectory
}
Проверяем наличие каталога, который указан, как источник фотографий.
{
Out-File -FilePath $log -InputObject "Enter User Photo Path. Program will be terminated." -Encoding utf8 -Append
exit
}
Записываем содержимое (имена файлов) в массив.
Проводим действие для каждого файла в каталоге:
- Отсеиваем вспомогательные файлы с учётом того, что расширение всех фотографий - jpg (чтобы отсеять файлы типа thumbs.db и т.д.)
 - Проверяем размер файла (не более 10Кб)
 - Проводим поиск пользователя в AD по имени файла-фотографии.
 - Если поле для фотографии (thumbnailPhoto) пустое - хэшируем фотографию и записываем в поле
 - Ведём счётчик изменений. Если изменений нет - записываем в лог "Изменения не были произведены."
 
{
if(([io.path]::GetExtension($File)) -eq ".jpg")
{
if(((Get-Item $File).length) -gt 10kb)
{
Out-File -FilePath $log -InputObject "Photo | $File | too large, try another one less than 10kb. Start working with the next picture." -Encoding utf8 -Append
}
else
{
$FileName = [io.path]::GetFileNameWithoutExtension($File)
if((Get-ADUser -Identity $FileName -Properties thumbnailPhoto).thumbnailPhoto -eq $null)
{
Out-File -FilePath $log -InputObject "User $FileName has no photo. Starting write value." -Encoding utf8 -Append
$Photo = [byte[]](Get-Content $File -Encoding byte)
Set-ADUser -Identity $FileName -Replace @{thumbnailPhoto=$Photo}
Out-File -FilePath $log -InputObject "User $FileName was edited, please check." -Encoding utf8 -Append
$count = 1
}
}
}
else
{
Out-File -FilePath $log -InputObject "Photo | $File | is not a picture. Start working with the next file." -Encoding utf8 -Append
}
}
if($count -eq 0)
{
Out-File -FilePath $log -InputObject "No changes has been done." -Encoding utf8 -Append
}
Данный скрипт без комментариев размещён во вложении. Необходимо сменить расширение файла с txt на ps1, так как размещать скрипты на сайте запрещено политикой.
| Прикрепленный файл | Размер | 
|---|---|
| InsertUserPhotoToAD.txt [3] | 1.89 кб |