Como muchos ya sabéis, desde Windows Server 2003 funcionando como Domain Controller y nivel funcional 2003, se pueden almacenar fotos de los usuarios en el entorno.
##############################################################################################
# PowerShell Skript to upload multiple Photos to Active Directory with
# automatic Logging management and Prechecks before uploading
# Author: Marc Salvador
#
# Version 1.0 – Inicial adaptada de Internet
# Version 1.1 – Control de errores con «Try/Catch»
# Versión 1.2 – Control de la existencia de carpetas para trabajar
##############################################################################################
$Date = $(Get-Date -Uformat «%d.%m.%Y-%H.%M»)
# Variables de ejecución
# Se han de crear las carpetas «UploadPics» y sus subdirectorios o modificar el valor de las
# variables con el dato correcto.
# ——————————————————————
$overwrite =
«false» #Si es necesario actualizar una foto de usuario, dejad el valor en «true»
$pathToPictures = «E:\UploadPics\Pics» #only path to folder
$maxPictureSize = «20000» # in byte
$pathToLog = «E:\UploadPics\PicUpload.log» #with name of the file
$maxLogSize = «10000000» #in byte
$backupFolder = «E:\UploadPics\Logs\» #Ubicación de los backups
$backupDays = «7» #Días antes de borrar un backup
#
——————————————————————
# Existencia de la carpeta con las fotos
if (!(Test-Path -Path $pathToPictures))
{
Write-Host «No se encuentra la ruta de los archivos con las fotos» -ForegroundColor Red
Break
}
#
——————————————————————
# Existencia de la carpeta de logs
if (Test-Path -Path $pathToLog)
{
$log = Get-Item $pathToLog
}
else
{
Write-Host «No se encuentra la ruta de los archivos de log» -ForegroundColor Red
Break
}
# Revisar tamaño del fichero de logs
if ($log.length -gt $maxLogSize)
{
$backupLog = «$backupFolder\PicUpload-$Date.log»
Copy-Item $pathToLog $backupLog
Clear-Content $pathToLog
Write-Host «Fichero de logs copiado a $backupLog« -ForegroundColor Green
}
#Borrar los backups antiguos
$backupFiles =
Get-ChildItem $backupFolder
$old = $backupFiles | ? { $_.CreationTime -lt ((get-date).adddays(–$backupDays)) }
if ($old -eq $Null)
{
Write-Host «No hay backups de más de $backupDays días en ‘$backupFolder‘!» -ForegroundColor Yellow
}
else
{
$old | % { Remove-Item $backupFolder$_ }
Write-Host «Backups antiguos eliminados!»
}
#Fecha actual
$Date=$(Get-Date -format g) | add-content $pathToLog
#Using hashtable for logs.
$errorlist=@{} #Errores de log
#
———————————————————————————————————————
# Cargamos el módulo de AD. Si se ejecuta desde un Windows client,
# hay que bajar primero las RSAT para ese cliente e instalarlas.
# Control de error de carga del módulo
Try {
Import-Module ActiveDirectory
}
Catch {
$ErrorMessage = $_.Exception.Message
$FailedItem = $_.Exception.ItemName
$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup(«Error en la operación $ErrorMessage $FailedItem«,0,«Error de ejecución»,0x0)
Break
}
#Cargamos todas las imágenes desde el directorio donde están almacenadas
$queryPics = Get-ChildItem $pathToPictures -ErrorAction Stop
foreach ($pic in $queryPics)
{
$username = $pic.basename
$dom = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$root = $dom.GetDirectoryEntry()
$search = [System.DirectoryServices.DirectorySearcher]$root
$search.Filter = «(&(objectclass=user)(objectcategory=person)(samAccountName=$username))»
$result = $search.FindOne()
#Check if user exists
if ($result -ne $null)
{
$user = $result.GetDirectoryEntry()
$thumbnailPhoto = $user.thumbnailPhoto
#Revisar si tiene o no una imagen en el AD
if ($thumbnailPhoto.Value -eq $null)
{
#Añadir la foto al usuario
[byte[]]$jpg = Get-Content $pic.FullName -encoding byte
#Control de errores
Try
{
$user.put(«thumbnailPhoto», $jpg )
$user.setinfo()
}
Catch
{
$ErrorMessage = $_.Exception.Message
$errorlist.Add($username, $ErrorMessage)
Break
}
}
else #Sobreescribimos la foto existente
{
if ($overwrite -eq $true)
{
#Add picture to user property
[byte[]]$jpg = Get-Content $pic.FullName -encoding byte
#Control de errores
Try
{
$user.put(«thumbnailPhoto», $jpg )
$user.setinfo()
}
Catch
{
$ErrorMessage = $_.Exception.Message
$errorlist.Add($username, $ErrorMessage)
Break
}
}
else
{
Write-Host $user.displayname «ya tiene una imagen en el AD» -ForegroundColor Yellow
$errorlist.Add($username, «ya tiene una imagen»)
}
}
}
else
{
Write-Host $username » no encontrado» -ForegroundColor Red
$errorlist.Add($username, «no encontrado»)
}
}
#Notificación
$maxLogSize =
$maxLogSize/1000000
Write-Host «#Nota: el archivos de log se puede encontrar en $pathtopictures y se llama ‘PicUpload.log’. Este archivo se moverá a ‘»$backupFolder«PicUpload-Date-Time.log’ cuando exceda los $maxLogSize MB.`n» -ForegroundColor Cyan
#Añadir los errores en el fichero
$errorlist | out-string | add-content $pathToLog