2009-12-30 12 views
15

Necesito un método que tomará un archivo de imagen * .jpg y lo cargará a un perfil de usuario en el Active Directory de Windows AD 2003.Cómo subir un archivo de imagen de perfil de usuario de Active Directory en C#?

También un método para recuperar la foto como transmisión o exponerla como web segura servicio para ser llamado por aplicaciones multiplataforma en Java, etc. (¡Maldición! ¿Estoy pidiendo demasiado !!!)

El archivo que se está cargando será un * .jpg que básicamente es un archivo de firma visual creado por un usuario.

¿Hay alguien que tenga experiencia trabajando con Active Directory en C# proporcionar alguna información acerca de cómo esto se puede hacer con la implicación mínima relacionada con la seguridad.

Desde el punto de vista del administrador de Windows Active Directory lo qué tiene que hacer para que esta possible.Changes/disposiciones de esquema de perfil de usuario, etc.

La imagen está siendo cargado para que ésta pueda más tarde se recuperará de la AD para ser insertado en un documento PDF con fines de firma.

¿Se puede hacer esto en C#? ¿O hay alguna biblioteca hecha, etc.?

Gracias de antemano por sus respuestas, fragmentos y soluciones.

+0

Antes de intentar responder a esta, lo que desea insertar la imagen como un objeto en el esquema de Active Directory en alguna parte relacionada con el usuario? ¿O también está buscando asignar la foto como imagen de perfil del usuario? –

Respuesta

15

Aquí hay una serie de publicaciones en blogs con el código que muestra cómo hacerlo:

(la primera muestra cómo obtener una foto en la segunda muestra cómo sacarlo)

Using the jpegPhoto attribute in AD - Part I

Using the jpegPhoto attribute in AD - Part II

EDIT: He aquí una función genérica para implementar el código de la Parte 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: encontré que en mi organización, el atributo correcto para establecer era "thumbnailPhoto" de esta manera:

myUser.Properties["thumbnailPhoto"].Add(binaryData); 

Esto también parece tbe el que el producto comercial Exclaimer está estableciendo (pero podría ser solamente haciendo que en mi organización)

+0

wow nos estamos acercando aquí necesito hacer un prototipo esta semana – abmv

+0

No estoy seguro de qué más necesitas, el código fue bastante completo. Agregaré una función genérica para ti, si eso ayuda. – GalacticJello

+1

Para abreviar, se podría usar [File.ReadAllBytes] (http://msdn.microsoft.com/en-us/library/system.io.file.readallbytes.aspx) ... – takrl

13

El atributo AD común para un usuario foto es jpegPhoto pero se puede usar lo que cada vez nombre desea

Este ejemplo muestra la forma básica de AD para obtener y establecer un flujo de imágenes. Es necesario dar cuerpo estos métodos a ser una clase útil

considere hacer su servicio web que acaba de regresar de la URL de la imagen. El controlador de solicitudes para esa URL debe entonces devolver la imagen con el mismo tipo de contenido, etc. Mucho más útil en un entorno web

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; 
} 

} 
+0

gracias déjame poner esto en funcionamiento y ver ..... – abmv

-2

Cada perfil de usuario de Active Directory tendrá una carpeta de inicio. Si no está seguro de esto, consulte el siguiente artículo http://support.microsoft.com/kb/816313 Creo que tiene que cargar el archivo de imagen en este directorio.

Además, si esto no soluciona su problema, actualice si encuentra algo más.

MNK ...

Cuestiones relacionadas