Занимательные взаимоотношения получились с задачей обновления фотографий пользователей в учетные записи Active Directory. Все оказалось несколько "необычнее", чем смотрелось на первый взгляд.
Подход к снаряду №1. Разминочный
Фотография (аватар) хранится в АДшной записи в поле thumbnailPhoto. Размер фотографии в целом ограничен только ее объемом: 100КБ в jpeg формате.
Как выяснилось, "запихивают" туда фотографию нужно через поток:
1 2 3 4 5 6 7 8 9 | 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 скрипта, вида:
1 | Set -ADUser ЛОГИН_ПОЛЬЗОВАТЕЛЯ -Replace @{thumbnailPhoto=[byte[]]( Get -Content ПУТЬ_К_ФОТО -Encoding byte)} |
1 2 3 4 | $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 |
Комментарии
Отправить комментарий