Как загрузить файл изображения в профиль пользователя Active Directory на С#?
Мне нужен метод, который возьмет файл изображения *.jpg и загрузит его в профиль пользователя в Active Directory Windows AD 2003.
Также метод для извлечения фото в виде потока или его просмотра в качестве защищенного веб-сервиса, который будет вызываться кросс-платформенными приложениями в java и т.д. (Черт, я слишком много спрашиваю!!!)
Загружаемый файл будет *.jpg, который является в основном визуальным сигнатурным файлом, созданным пользователем.
Кто-нибудь, кто имеет опыт работы с Active Directory в С#, предоставляет некоторую информацию о том, как это можно сделать с минимальными последствиями, связанными с безопасностью.
С точки зрения администратора Windows Active Directory, что он должен
сделать это возможным. Изменения/положения к схеме профиля пользователя и т.д.
Изображение загружается так, что оно может быть впоследствии извлечено из AD для вставки в PDF-документ для целей подписи.
Можно ли это сделать на С#? Или есть ли какие-либо библиотеки и т.д.?
Заранее благодарим за ваши ответы, фрагменты и решения.
Ответы
Ответ 1
Вот серия сообщений блога с кодом, который показывает, как это сделать:
(Первое показывает, как получить фотографию, вторая показывает, как ее получить)
Использование атрибута jpegPhoto в AD - часть I
Использование атрибута jpegPhoto в AD - Part II
EDIT: Вот общая функция, реализующая код из части I:
void AddPictureToUser(
string strDN, // User Distinguished Name, in the form "CN=Joe User,OU=Employees,DC=company,DC=local"
string strDCName, // Domain Controller, ie: "DC-01"
string strFileName // Picture file to open and import into AD
)
{
// Open file
System.IO.FileStream inFile = new System.IO.FileStream(strFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
// Retrive Data into a byte array variable
byte[] binaryData = new byte[inFile.Length];
int bytesRead = inFile.Read(binaryData, 0, (int)inFile.Length);
inFile.Close();
// Connect to AD
System.DirectoryServices.DirectoryEntry myUser = new System.DirectoryServices.DirectoryEntry(@"LDAP://" + strDCName + @"/" + strDN);
// Clear existing picture if exists
myUser.Properties["jpegPhoto"].Clear();
// Update attribute with binary data from file
myUser.Properties["jpegPhoto"].Add(binaryData);
myUser.CommitChanges();
}
EDIT: Я обнаружил, что в моей организации правильным атрибутом для установки был "thumbnailPhoto" следующим образом:
myUser.Properties["thumbnailPhoto"].Add(binaryData);
Это также похоже на то, что устанавливает коммерческий продукт Exclaimer (но это может быть только в моей организации)
Ответ 2
Общий атрибут AD для пользовательской фотографии jpegPhoto, но вы можете использовать то, что когда-либо захотелось
В этом примере показан основной способ AD для получения и установки потока изображения. Вы должны использовать эти методы как полезный класс.
Подумайте о том, чтобы заставить веб-службу просто вернуть URL-адрес изображения. Обработчик запроса для этого URL-адреса должен затем вернуть изображение с правильным типом контента и т.д. Гораздо полезнее в веб-среде
using System;
using System.DirectoryServices;
using System.Collections;
using System.IO;
public class ADPhoto {
public void Set() {
try {
var de = new DirectoryEntry("LDAP://cn=username,cn=users,DC=domain, DC=com");
de.Username = "username";
de.Password = "password";
var forceAuth = de.NativeObject;
var fs = new FileStream("path\\photo.jpg", FileMode.Open);
var br = new BinaryReader(fs);
br.BaseStream.Seek(0, SeekOrigin.Begin);
byte[] ba = new byte[br.BaseStream.Length];
ba = br.ReadBytes((int)br.BaseStream.Length);
de.Properties["jpegPhoto"].Insert(0, ba);
de.CommitChanges();
}
catch(Exception ex) {
Console.WriteLine(ex.Message);
}
}
public Stream Get() {
var fs = new MemoryStream();
try {
var de = new DirectoryEntry("LDAP://cn=username,cn=users,DC=domain, DC=com");
de.Username = "username";
de.Password = "password";
var forceAuth = de.NativeObject;
var wr = new BinaryWriter(fs);
byte[] bb = (byte[])de.Properties["jpegPhoto"][0];
wr.Write(bb);
wr.Close();
}
catch (Exception e) {
Console.WriteLine(e.Message);
}
return fs;
}
}
Ответ 3
Нашел статью, в которой описывается, как загружать изображения в Active Directory и как их отображать на компьютерах конечных пользователей.
http://blog.jocha.se/tech/ad-user-pictures-in-windows-10
Ответ 4
Каждый профиль пользователя Active Directory будет иметь домашнюю папку.
Если вы не уверены в этом, пожалуйста, ознакомьтесь с приведенной ниже статьей
http://support.microsoft.com/kb/816313
Я считаю, что вам нужно загрузить файл изображения в этот каталог.
Также, если это не решит вашу проблему, обновите, если вы найдете что-то еще.
MNK...