Как загрузить файл изображения в профиль пользователя 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...