<# .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 }