# encoding: ascii
# api: powershell
# title: Get-ADThumbnail
# description: Gets the picture stored in the thumbnailPhoto attribute for the specified user/users and saves it to the path specified by the Path parameter. Path should be a folder, not a file.
# version: 0.1
# type: function
# author: DollarUnderscore
# license: CC0
# function: Get-ADThumbnail
# x-poshcode-id: 5357
# x-archived: 2015-03-24T01:06:51
# x-published: 2015-08-05T14:18:00
#
# Requires the ActiveDirectory-module to run. Import it manually if you are not running PoSh v.3 or newer.
# A short post about it is available at my blog:
# http://dollarunderscore.azurewebsites.net/?p=3221
#
function Get-ADThumbnail
{
    <#
    .SYNOPSIS
    Gets the picture stored in the thumbnailPhoto attribute for the specified user/users.

    .DESCRIPTION
    Gets the picture stored in the thumbnailPhoto attribute for the specified user/users and saves it to the path specified by the Path parameter. Path should be a folder, not a file.

    Requires the ActiveDirectory-module to run. Import it manually if you are not running PoSh v.3 or newer.

    .EXAMPLE
    Get-ADThumbnail -Identity MySamAccountName -Path C:\Temp\

    Downloads the picture of the user with SamAccountName 'MySamAccountName' and saves it in the folder C:\Temp\

    .EXAMPLE
    Get-ADUser -Filter "GivenName -eq 'John'" | Get-ADThumbnail -Path C:\Temp\

    Downloads the picture from all the users with the GivenName 'John' and saves the files to C:\Temp\

    .PARAMETER Identity
    Specify the SamAccountName, DistinguishedName, objectGUID or SID of the user(s) with the picture. Supports pipeline input.

    .PARAMETER Path
    Specify the folder were the picture(s) will be saved. The filename will be "SamAccountName.jpg"

    If omitted, this will default to the current path.

    #>

    [cmdletbinding()]
    param([Parameter(Mandatory=$True, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
          [Alias('SamAccountName','DistinguishedName','ObjectGUID','SID')]
          $Identity,
          $Path = '.\')

    BEGIN { }

    PROCESS {
        
        if ((Test-Path $Path -PathType Leaf)) {
            Write-Error "Path should be a folder, not a file."
            return
        }

        foreach ($Ident in $Identity) {

            try {
                $ADUser = Get-ADUser -Identity $Ident -Properties Thumbnailphoto -ErrorAction Stop
            }
            catch {
                Write-Error "Failed to get the user $Ident from Active Directory."
                Continue
            }

            [byte[]] $PictureByteArray = $ADUser | select -ExpandProperty Thumbnailphoto

            if ($PictureByteArray -eq $null) {
                Write-Warning "No thumbnail found for user $Ident."
                Continue
            }

            $PictureFileContent = [System.Text.Encoding]::Default.GetString($PictureByteArray)

            $FileName = "$($ADUser.SamAccountName).jpg"

            $FullPath =  Join-Path $Path $FileName


            Set-Content -Path $FullPath -Value $PictureFileContent

            Remove-Variable PictureByteArray, PictureFileContent, Filename -ErrorAction SilentlyContinue
        }
    }

    END { }
}
