Within Active Directory of Microsoft there is a thumbnailPhoto entry where you can place a small photo. These pictures should preferably be 96 by 96 pixels and not larger than 10kb. You might create those photos from an already existing source and batch process them with something like Irfanview so they become the right size. There are several tools available to import them into Active Directory and they will also resize the picture, but it is possible to do this with PowerShell as well. The features are explained in the source code itself. In short it will read the pictures from a single source where the name of the picture should be similar to the logon name of the user and it will check if pictures are not exceeding the above mentioned limits. If successful the source picture is deleted, if not it is kept and a report is sent which can trigger a person to see what is wrong with the picture.
#requires -version 2 <# Program : ADPhotoImport.ps1 Author : Eugene Dullaard Date : 14-Jul-2014 - Initial Script This script will import pictures from a source into Active Directory's thumbnailPhoto field from a fixed content source. Requirements: Photo : 96x96 pixels and smaller than 10Kb filename in the format of <username>.jpg Features : - Content source is leading, it will search AD accounts by the name of the picture. The name without the extension of the picture should be matching SAMAccountName in Active Directory and can include dots, for example user account ab.user its picture should be ab.user.jpg. - Check properties of picture before importing so that they comply with above requirements, wrong pictures will be added to an output report which is send after the script finishes. - Remove photo once processed, keeping content source clean and allow for updating of existing pictures. - If pictures exist and the corresponding account cannot be found this will be added to the output report. In this case the picture will not be removed. - Runs with both a Content source as well as a Searchbase for the accounts. - Searchbase will be searched recursively. Picture folder will not as it should delete the pictures once they've been processed. You should keep any existing source or have a seperate one if pictures need to be kept. - Screen output for operator to see output while looking at the progress. - Reporting errors will allow automated use of this script and corrective measures taken afterwards. #> #Variables (Change these to suit your environment) $Content = "\\Server\Share\Folder" # Content Source (Drive/UNC Path) $Accounts = "OU=Users,DC=domain,DC=tld" # User Accounts OU $MailSender = "photoimport@domain.tld" # Report Sent from mail address $ReportAddress = "name@domain.tld" # Report Sent to mail address $SMTPServer = "mailserver.domain.tld" # Mail server for relaying message #Preliminaries Import-Module ActiveDirectory Add-Type -AssemblyName System.Drawing #Generate List of Photos in Content Source $Photos = Get-ChildItem $Content -Filter *.jpg #Report Header $Report = "Error report on ADPhotoImport ============================== Maximum picture dimensions are 96 x 96 pixels, maximum size is 10Kb. " $ReportCheck = $Report.Length # Used to check for added entries #Start processing the List of Photos (Main Loop) $Photos | % { # Reset variables $ErrorStatus = $false $Basename = $_.BaseName Write-Host "===========================================" Write-Host "Processing : $Basename" # Check picture dimensions and size, if in error add to log and show on screen $jpg = New-Object System.Drawing.Bitmap $_.FullName if ($jpg.height -gt 96) { $Report = $Report + "$_ `t Pixel height exceeded.`n" Write-Host "Error..... : Pixel height exceeded" -ForegroundColor Red $ErrorStatus = $true } if ($jpg.width -gt 96) { $Report = $Report + "$_ `t Pixel width exceeded.`n" Write-Host "Error..... : Pixel width exceeded" -ForegroundColor Red $ErrorStatus = $true } if ($_.length -gt 10240) { $Report = $Report + "$_ `t Size limitation exceeded.`n" Write-Host "Error..... : File size exceeded" -ForegroundColor Red $ErrorStatus = $true } $jpg.Dispose() # Check for AD Account, if not existing add to log. $user = Get-ADUser -SearchBase $Accounts -Filter {(SAMAccountName -eq $BaseName)} if ($user -eq $null) { $Report = $Report + "$_ `t No AD user has been found.`n" Write-Host "Error..... : No matching user account" -ForegroundColor Red $ErrorStatus = $true } # If no errors are found, insert/replace picture and delete from content source if ($ErrorStatus -eq $false) { [byte[]]$photo = Get-Content $_.FullName -Encoding Byte Set-ADUser $_.BaseName -Replace @{thumbnailPhoto=$photo} Remove-Item $_.FullName } } # End Main Loop # Check Report Change, if changed send report If ($Report.Length -ne $ReportCheck) { Send-MailMessage -From $MailSender -To $ReportAddress -Subject "AD Photo Import Error Report" ` -SmtpServer $SMTPServer -Body $Report }
Update: In order to see which accounts do not have a thumbnail photo you can enter the following command in PowerShell:
Get-ADUser -Filter * -SearchBase "OU=Users,DC=domain,DC=tld" -properties thumbnailPhoto | ? {!$_.thumbnailPhoto} | select Name,SAMAccountName
If you want to see a list of who has a thumbnail photo remove the ‘!’ in the code line above.