automacao-identidade-ad/scripts/muda-imagem-perfil.ps1

143 lines
6.4 KiB
PowerShell

<#
.SYNOPSIS
Atualiza a foto de perfil (thumbnailPhoto) de um usuário no Active Directory.
.DESCRIPTION
Versão 1.0. Componente da "Plataforma Unificada de Trabalho Digital", este script é responsável por
processar uma imagem, validá-la, redimensioná-la para um formato adequado e, em seguida,
atualizar o atributo 'thumbnailPhoto' do usuário especificado no Active Directory.
O script inclui validações de tamanho de arquivo para garantir conformidade com os limites do AD.
.NOTES
Autor: Gemini (Especialista NGINX & Automação)
Data: 15 de outubro de 2025
Versão: 1.0
Contexto: Módulo "Atualização de Foto de Perfil" do Portal de Autoatendimento.
#>
function Set-UnifiedADUserPhoto {
[CmdletBinding()]
param(
# --- Parâmetros de Conexão e Autenticação (Obrigatórios) ---
[Parameter(Mandatory = $true, HelpMessage = "IP ou FQDN do Domain Controller principal (cliente).")]
[string]$ClientADServer,
[Parameter(Mandatory = $true, HelpMessage = "Credencial (usuário e senha) da conta de serviço para autenticar no AD do cliente.")]
[pscredential]$ClientADCredential,
# --- Parâmetros do Usuário (Obrigatórios) ---
[Parameter(Mandatory = $true, HelpMessage = "O nome de logon (SamAccountName) do usuário cuja foto será alterada.")]
[string]$SamAccountName,
[Parameter(Mandatory = $true, HelpMessage = "O caminho completo para o arquivo de imagem (JPG/PNG) a ser carregado.")]
[string]$ImagePath,
# --- Parâmetros de Logging ---
[Parameter(Mandatory = $false)]
[string]$LogFilePath = ".\Set-UnifiedADUserPhoto-Log-$(Get-Date -Format 'yyyy-MM-dd').txt"
)
# --- LÓGICA PRINCIPAL ---
# Validação da existência da função de log, para consistência com outros scripts
if (-not (Get-Command Write-Log -ErrorAction SilentlyContinue)) {
Write-Host "[ERRO FATAL] A função auxiliar 'Write-Log' não foi encontrada. O script não pode continuar." -ForegroundColor Red
return
}
try {
Import-Module ActiveDirectory -ErrorAction Stop
}
catch {
Write-Log -Level 'ERROR' -Message "Falha ao importar o módulo ActiveDirectory. Verifique se as Ferramientas de Administração de Servidor Remoto (RSAT) estão instaladas."
return
}
Write-Log -Level 'INFO' -Message "Iniciando tentativa de atualização de foto para '$SamAccountName'."
# --- Bloco 1: Validação e Processamento da Imagem ---
if (-not (Test-Path -Path $ImagePath -PathType Leaf)) {
Write-Log -Level 'ERROR' -Message "FALHA: O arquivo de imagem especificado não foi encontrado em '$ImagePath'."
Write-Host " [ERRO] O arquivo de imagem não foi encontrado." -ForegroundColor Red
return
}
$imageBytes = $null
try {
Write-Host " Processando imagem de '$ImagePath'..."
# Carrega a biblioteca .NET para manipulação de imagens
Add-Type -AssemblyName System.Drawing
# Carrega a imagem do arquivo
$image = [System.Drawing.Image]::FromFile($ImagePath)
# Define o tamanho máximo em bytes (95 KB para segurança)
$maxSizeInBytes = 97280
# Redimensiona a imagem para um padrão (ex: 240x240 pixels)
$newBitmap = New-Object System.Drawing.Bitmap(240, 240)
$graphics = [System.Drawing.Graphics]::FromImage($newBitmap)
$graphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic
$graphics.DrawImage($image, 0, 0, 240, 240)
# Salva a imagem processada em um fluxo de memória para obter os bytes
$memoryStream = New-Object System.IO.MemoryStream
# Salva como JPEG para melhor compressão
$newBitmap.Save($memoryStream, [System.Drawing.Imaging.ImageFormat]::Jpeg)
$imageBytes = $memoryStream.ToArray()
# Limpeza de recursos para evitar memory leaks
$graphics.Dispose()
$image.Dispose()
$newBitmap.Dispose()
$memoryStream.Dispose()
# Validação final do tamanho
if ($imageBytes.Length -gt $maxSizeInBytes) {
throw "A imagem processada excede o limite de tamanho do AD ($($maxSizeInBytes / 1KB) KB). Tamanho final: $($imageBytes.Length / 1KB) KB."
}
Write-Host " [OK] Imagem processada e validada com sucesso. Tamanho: $($imageBytes.Length / 1KB) KB." -ForegroundColor Green
}
catch {
$errorMessage = "FALHA no processamento da imagem para '$SamAccountName'. Erro: $($_.Exception.Message -replace "`r`n"," ")"
Write-Log -Level 'ERROR' -Message $errorMessage
Write-Host " [ERRO] Falha ao processar a imagem." -ForegroundColor Red
return
}
# --- Bloco 2: Atualização no Active Directory ---
if ($imageBytes) {
try {
Write-Host " Tentando atualizar o atributo 'thumbnailPhoto' no AD do Cliente..."
Set-ADUser -Identity $SamAccountName -Replace @{thumbnailPhoto = $imageBytes} -Server $ClientADServer -Credential $ClientADCredential -ErrorAction Stop
Write-Log -Level 'INFO' -Message "SUCESSO: Foto de perfil para '$SamAccountName' atualizada no AD do Cliente." -TargetADServer $ClientADServer
Write-Host " [OK] Foto de perfil atualizada com sucesso no Active Directory." -ForegroundColor Green
}
catch {
$errorMessage = "FALHA ao atualizar a foto de '$SamAccountName' no AD do Cliente. Erro: $($_.Exception.Message -replace "`r`n"," ")"
Write-Log -Level 'ERROR' -Message $errorMessage -TargetADServer $ClientADServer
Write-Host " [ERRO] Falha ao gravar a imagem no Active Directory." -ForegroundColor Red
return
}
}
Write-Host "Processo de atualização de foto concluído."
}
# --- FUNÇÃO AUXILIAR DE LOG (Exemplo, assumindo que já existe no seu ambiente) ---
# Mantenha sua função de log centralizada. Esta é uma versão mínima para permitir testes autônomos.
function Write-Log {
param(
[Parameter(Mandatory=$true)] [string]$Message,
[Parameter(Mandatory=$true)] [ValidateSet('INFO', 'WARN', 'ERROR')] [string]$Level,
[Parameter(Mandatory=$false)] [string]$TargetADServer
)
$LogFilePath = ".\Set-UnifiedADUserPhoto-Log-$(Get-Date -Format 'yyyy-MM-dd').txt"
$logEntry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - [$Level] - $Message"
$logEntry | Out-File -FilePath $LogFilePath -Append
}