Занимательные взаимоотношения получились с задачей обновления фотографий пользователей в учетные записи Active Directory. Все оказалось несколько "необычнее", чем смотрелось на первый взгляд.
Подход к снаряду №1. Разминочный
Фотография (аватар) хранится в АДшной записи в поле thumbnailPhoto. Размер фотографии в целом ограничен только ее объемом: 100КБ в jpeg формате.
Как выяснилось, "запихивают" туда фотографию нужно через поток:
Set adoStreamRead = CreateObject("ADODB.Stream") adoStreamRead.Type = 1 adoStreamRead.Open adoStreamRead.LoadFromFile(ПУТЬ_К_ФАЙЛУ) adUser.put "thumbnailPhoto", adoStreamRead.Read() adUser.setInfo adoStreamRead.Close
Вроде все ок, да?
Подход к снаряду №2. "Не хочешь по-хорошему - заставим"
Оказывается нет, по крайней мере, если дело касается Notes/Domino. adoStreamRead.Read() в выше описанном коде возвращает массив байт. Даже, если любая фотография укладывается в ограничения АД - 100КБ, то исходя из ограничений размерности массива в лотусе, получим, что максимально можем считать только 64КБ. И это при условии установления значения первого индекса в массиве на -32768.
Ок. Возвращаясь к методу adoStreamRead.Read(), в качестве параметра можно указать размер буфера. НО. Даже если считывать порционно:
1. Дописывать в атрибут объекта в АД возможности нет (если только он не многозначный, но это не наш случай)
2. Где-то на просторах Интернета промелькнула информация, что можно перевести массив байт в Base64, но при попытке запихнуть их атрибут, AD выдает ошибку.
В целом, подход записи через поток подходит, но только если фотографии не превышают 32КБ. Можно пойти по этому пути и, например, используя WIA уменьшать фотографию на лету до того размера и качества, которое будет влезать в 32КБ.
Подход к снаряду №3. Завершающий. "В любом случае заставим"
Вставить фотографию можно одной единственной строчкой PowerShell скрипта, вида:
Вставить фотографию можно одной единственной строчкой PowerShell скрипта, вида:
Set-ADUser ЛОГИН_ПОЛЬЗОВАТЕЛЯ -Replace @{thumbnailPhoto=[byte[]](Get-Content ПУТЬ_К_ФОТО -Encoding byte)}
$login = "ЛОГИН_УЧЕТКИ_ДЛЯ_ИЗМЕНЕНИЙ" $pass = ConvertTo-SecureString "ПАРОЛЬ_УЧЕТКИ_ДЛЯ_ИЗМЕНЕНИЙ" -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential($login, $pass) Set-ADUser ЛОГИН_ПОЛЬЗОВАТЕЛЯ -Replace @{thumbnailPhoto=[byte[]](Get-Content ПУТЬ_К_ФОТО -Encoding byte)} -Credential $credЧерез shell запускаем powershell.exe с путем к скрипту и нужными параметрами. На всякий случай в скрипте лучше вызвать import-module activedirectory
Комментарии
Отправить комментарий