143 lines
6.4 KiB
PowerShell
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
|
|
} |