Self Service Formular für das Active Directory Teil 3 21. Februar 2012

Bis jetzt ist das kleine Projekt ohne größere Herausforderungen über die Bühne gegangen. Jetzt, wo wir zu dem Bild kommen, wird es etwas kniffliger. Als Erstes werden wir uns einmal die Attributdefinition im Active Directory anschauen:

 

 

 

 

 

 

 

 

 

Das Bild wird also als Binärwert im Active Directory gespeichert und die Größe des Bildes ist auf 100KB begrenzt. Bevor wir den Quellcode erstellen können, müssen wir die Seite aus Teil 2 mit weiteren Steuerelementen versorgen. Wir benötigen jetzt zusätzlich ein Image-Steuerelement und auch ein FileUpload-Steuerelement, damit die Benutzer ihre Bilder auch hochladen können. Nachdem die Steuerelemente platziert wurden, sieht das Fomular so aus:

 

Wenn das Benutzerkonto über kein Bild verfügt, dann soll ein Dummy-Bild zur Anzeige kommen. Ich habe dafür ein einfaches Bild (dummy.jpg) gezeichnet. Das wird dem Image-Steuerelement zugewiesen, wenn in dem Attribut “thumbnailphoto” kein Wert vorhanden ist. Um das Image-Steuerelement mit einem Bild zu befüllen, greifen wir auf eine separate Seite zu, die für einen entsprechenden Benutzernamen das Bild aus dem Active Directory ausliest. Wenn kein Bild vorhanden ist, gibt die Seite das Dummy-Bild zurück. Sourcecode der “getPictureFromAD.aspx”

 

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.DirectoryServices;
 
namespace ITeach_ADSelfService
{
    public partial class getPictureFromAD : System.Web.UI.Page
    {
        private readonly string[] arrProperties = new string[] { "department", "sn", "title","thumbNailPhoto" };
        protected void Page_Load(object sender, EventArgs e)
        {
            //Auslesen des samAccountName und BaseDN fuer die Suche im AD
            String strSamAccount = Request.QueryString["samAccountName"];
            String strDN = Request.QueryString["strLDAP"];
            Response.ContentType = "image/jpeg";
            Response.Clear();
            if (strDN == null | strSamAccount == null)
            {
                Response.Redirect("dummy.jpg");
            }
            DirectoryEntry adDomain = new DirectoryEntry(strDN);
            string strSearchfilter = "(SamAccountName=" + strSamAccount + ")";
            System.DirectoryServices.DirectorySearcher search = new System.DirectoryServices.DirectorySearcher(adDomain, strSearchfilter, arrProperties);
            DirectoryEntry user = null;
            user = new DirectoryEntry(search.FindOne().Path.ToString());
            try {
                byte[] binaryPicture = (byte[])user.Properties["thumbNailPhoto"][0];
                Response.BinaryWrite(binaryPicture);
            }
            catch {
                Response.Redirect("dummy.jpg");
            }
 
        }
 
    }
}

Jetzt müssen wir dem Benutzer nur noch die Möglichkeit geben, sein eigenes Bild auch zu verändern. Dafür müssen wir nur in der Funktion “SetADData” folgenden Code einfügen:

if (thumbUpload.FileName != null && thumbUpload.PostedFile.ContentLength <= 102400)
             {
                 byte[] imageBytes = new byte[thumbUpload.PostedFile.InputStream.Length + 1];
                 thumbUpload.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length);
                 //Bevor das Attribut neu befuellt wird, muss es geleert werden.
                 user.Properties["thumbnailphoto"].Clear();
                 user.Properties["thumbnailphoto"].Add(imageBytes);
             }

In diesem if Statement wird einfach geprüft, ob das Fileupload-Steuerelement einen Dateinamen enthält und die Dateigröße nicht größer als 100KB ist (Beschränkung des Attributs “thumbNailPhoto” im Active Directory). Wenn diese Bedingungen erfüllt sind, wird das Attribut “thumbNailPhoto” des Benutzers entsprechend mit dem neuen Bild befüllt. Der Quellcode der “default.aspx” sieht dann so aus:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.DirectoryServices;
 
namespace ITeach_ADSelfService
{
    public partial class _Default : System.Web.UI.Page
    {
        const string LDAP = "LDAP://dc=spielwiese,dc=intern"; //Anzupassen!
        static DirectoryEntry ADUser;
        private readonly string[] arrProperties = new string[] { "department","sn", "title"};
        protected void Page_Load(object sender, EventArgs e)
        {
            //Caching totlegen
            Response.ExpiresAbsolute = DateTime.Now.AddDays(-1d);
            Response.Expires = -1500;
            Response.CacheControl = "no-cache";
            if (Page.IsPostBack)
            {
                GetADData(ADUser);
            }
            else
            {
                string strUserName = GetCurrentWindowsUserLogin().ToString();
                ADUser = GetUser(strUserName);
                GetADData(ADUser);
                //Thumbnailimage fuer den entsprechenden Benutzer holen
                thumbNailImage.ImageUrl = "getPictureFromAD.aspx?samAccountName=" + strUserName + "&strLDAP=" + LDAP;
 
            }
 
        }
 
        private string GetCurrentWindowsUserLogin()
        //Diese Funktion ermittelt fuer uns den aktuellen Benutzernamen damit wir die Suche durchfuehren können
        {
            string strSamAccountName = "";
            string login = Page.User.Identity.Name;
            int intLogin = login.IndexOf(@"\");
            if (intLogin > 0)
            {
              strSamAccountName = login.Remove(0, intLogin + 1);
            }
            return strSamAccountName;
        }
        private DirectoryEntry GetUser(string loginName)
        {
            string strSearchfilter = "(SamAccountName=" + loginName + ")";
 
            DirectoryEntry entry = new DirectoryEntry(LDAP);
 
            System.DirectoryServices.DirectorySearcher search = new System.DirectoryServices.DirectorySearcher(entry, strSearchfilter, arrProperties);
            DirectoryEntry user = null;
            user = new DirectoryEntry(search.FindOne().Path.ToString());
            return user;
        }
         private void GetADData(DirectoryEntry user)
         {
              if (user.Properties["sn"].Value != null)
              {
                  txtSurname.Text = user.Properties["sn"].Value.ToString();
              }
              else
              {
                  txtSurname.Text = "";
              }
              if (user.Properties["department"].Value != null)
              {
                  txtDepartment.Text = user.Properties["department"].Value.ToString();    
              }
              else
              {
                  txtDepartment.Text = "";
              }
              if (user.Properties["title"].Value != null)
              {
                  txtPosition.Text = user.Properties["title"].Value.ToString();
 
              }
              else
              {
                  txtPosition.Text = "";
              }
 
         }
         private void SetADData(DirectoryEntry user)
         {
             if (txtSurname.Text != null)
             {
                 user.Properties["sn"].Value = txtSurname.Text.ToString();
             }
             if (txtPosition.Text != null)
             {
                 user.Properties["title"].Value = txtPosition.Text.ToString();
             }
             if (txtDepartment.Text != null)
             {
                 user.Properties["department"].Value = txtDepartment.Text.ToString();
             }
             if (thumbUpload.FileName != null && thumbUpload.PostedFile.ContentLength <= 102400)
             {
                 byte[] imageBytes = new byte[thumbUpload.PostedFile.InputStream.Length + 1];
                 thumbUpload.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length);
                 //Bevor das Attribut neu befuellt wird, muss es geleert werden.
                 user.Properties["thumbnailphoto"].Clear();
                 user.Properties["thumbnailphoto"].Add(imageBytes);
             }  
             user.CommitChanges();
         }
 
         protected void Button1_Click(object sender, EventArgs e)
         {
             SetADData(ADUser);
         }
 
    }
}

Nachdem das alles erledigt ist, kann man schon einen vorsichtigen Test im Visual Studio wagen.

Der dritte Teil, inklusive dem Dummy-Bild, kann hier heruntergeladen werden (ITeach-ADSelfService-Teil3 (1197)).

Self Service Formular für das Active Directory Teil 1

Self Service Formular für das Active Directory Teil 2

Self Service Formular für das Active Directory Teil 4

Leave a Reply

*