Archivo

Archivo para viernes, 20 de noviembre de 2015

[Active Directory]–Subir fotos de usuarios al AD

viernes, 20 de noviembre de 2015 Sin comentarios

Hola a todos,

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.

Bien, pues después de mucho buscar por Internet y no encontrar un script de PowerShell medio decente, me aventuré a hacer el mío propio adaptado de otro.

Este es el código

##############################################################################################

# 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

 

Como todo en esta vida, el script es mejorable así que acepto sugerencias

Saludos,

Marc