Newer versions of Office (2010+) use Active Directory to retrieve and display user photos. It’s a useful feature that also adds visual interest. I can look quickly at the thumbnails at the bottom of an email or meeting request in Outlook to see who’s invited; this is much faster than reading through the semi-colon delimited list of email addresses.
I’m working on a TFS application that has some custom views. I thought it would be cool to display the user as a thumbnail instead of simply using their name. Doing this will add some pizzazz and, ultimately, result in a cleaner UI since vertical space is more abundant in my layout–it is less costly for me to show a 50×50 thumbnail than to display a 20×100 textbox.
So how do we do it? Like many tasks, the .NET Framework makes it relatively easy for us once we know what we’re doing. Here are the steps:
- Bind to a node in Active Directory Domain Services with the DirectoryEntry class
- Use the DirectorySearcher class to specify a search filter and find the desired user
- Extract the image bytes from the user properties
- Convert the bytes to a usable format
The method below accepts a username parameter, looks it up in AD, and binds the thumbnail to an Image. (Note that this is a WPF application, which is why I convert to the BitmapImage class. You may want to convert to a different type, like System.Drawing.Bitmap.)
private void GetUserPicture(string userName)
{
var directoryEntry = new DirectoryEntry("LDAP://YourDomain");
var directorySearcher = new DirectorySearcher(directoryEntry);
directorySearcher.Filter = string.Format("(&(SAMAccountName={0}))", userName);
var user = directorySearcher.FindOne();
var bytes = user.Properties["thumbnailPhoto"][0] as byte[];
using (var ms = new MemoryStream(bytes))
{
var imageSource = new BitmapImage();
imageSource.BeginInit();
imageSource.StreamSource = ms;
imageSource.EndInit();
uxPhoto.Source = imageSource;
}
}