Commit inicial do projeto Plataforma Unificada de Trabalho Digital

This commit is contained in:
João Pedro Toledo Goncalves 2025-10-14 22:14:28 -03:00
commit c6b223dfa5
3 changed files with 1117 additions and 0 deletions

144
README.md Normal file
View File

@ -0,0 +1,144 @@
# Plataforma Unificada de Trabalho Digital
![Status](https://img.shields.io/badge/status-em%20desenvolvimento-yellowgreen)
![PowerShell](https://img.shields.io/badge/PowerShell-5.1%2B-blue)
![Licença](https://img.shields.io/badge/licen%C3%A7a-propriet%C3%A1ria-red)
Conjunto de scripts e aplicações para automação de tarefas de gestão de identidades (AD/Exchange) para o projeto **Plataforma Unificada de Trabalho Digital**.
---
## 📜 Sumário
- [Visão Geral do Projeto](#-visão-geral-do-projeto)
- [🚀 Módulos e Funcionalidades Principais](#-módulos-e-funcionalidades-principais)
- [🛠️ Tecnologias Utilizadas](#-tecnologias-utilizadas)
- [🏁 Começando (Getting Started)](#-começando-getting-started)
- [Pré-requisitos](#pré-requisitos)
- [Instalação](#instalação)
- [📖 Como Usar](#-como-usar)
- [🗺️ Fases do Projeto (Roadmap)](#-fases-do-projeto-roadmap)
- [🤝 Como Contribuir](#-como-contribuir)
---
## 🌟 Visão Geral do Projeto
Este projeto detalha a criação de uma **Plataforma Unificada de Trabalho Digital**, um investimento estratégico projetado para **reduzir custos operacionais**, **aumentar a segurança e a conformidade (LGPD)** e **melhorar a agilidade organizacional**.
O objetivo é transformar processos manuais de gestão de identidades (criação de usuários, resets de senha, gestão de grupos, desligamentos) em um fluxo de trabalho automatizado, seguro e eficiente, orquestrado por um portal de autoatendimento para colaboradores, gestores e RH.
Os principais objetivos incluem:
- **Automatizar 80% das solicitações de TI rotineiras**.
- **Unificar o acesso a sistemas-chave** como Exchange, Nextcloud e Zammad.
- **Mitigar riscos de segurança** através da automação de processos de desligamento e higienização de contas inativas.
- **Empoderar colaboradores e gestores** com ferramentas de autoatendimento.
Para um guia completo sobre a arquitetura e o funcionamento de cada script, consulte a **[Wiki do Projeto](link-para-a-wiki-do-seu-gitea)**.
## 🚀 Módulos e Funcionalidades Principais
A plataforma é dividida nos seguintes módulos, conforme o dossiê do projeto:
#### Módulo 1: Portal do Colaborador (Hub Digital)
- Autenticação Segura via LDAPS
- Dashboard Unificado com Widgets (AD, Exchange, Nextcloud, Zammad)
- Alteração de Senha (Self-Service)
- Atualização de Foto de Perfil
#### Módulo 2: Portal do Gestor
- Criação de Novos Colaboradores a partir de templates
- Criação e Gestão de Grupos de Distribuição
#### Módulo 3: Gestão de Colaboradores (RH)
- Painel de Consulta e Edição de Colaboradores Ativos
- Processo de Desligamento Totalmente Automatizado
#### Módulo 4: Automação e Governança (Backend)
- Higienização Agendada de Contas de Usuários e Computadores Inativos
- Mapeamento e Atualização Automática do Organograma no AD
#### Módulo 5: Painel de Auditoria e Relatórios
- Geração de Relatórios de Atividade de Login
- Exportação Segura de Logs de Auditoria da Plataforma
## 🛠️ Tecnologias Utilizadas
- **Backend (Automação):** PowerShell 5.1+
- **Sistemas Alvo:** Active Directory, Microsoft Exchange
- **Backend (API):** *(A definir, ex: Node.js, Python/Flask, C#/.NET)*
- **Frontend:** *(A definir, ex: React, Vue.js, Angular)*
- **Banco de Dados (Configurações):** *(A definir, ex: PostgreSQL, MariaDB)*
## 🏁 Começando (Getting Started)
Para configurar um ambiente de desenvolvimento local, siga os passos abaixo.
### Pré-requisitos
- PowerShell 5.1 ou superior
- Módulo `ActiveDirectory` (instalado via RSAT - Ferramentas de Administração de Servidor Remoto)
- Ferramentas de Gerenciamento do Exchange
- Acesso a um ambiente de Active Directory e Exchange para testes
- *(Outros pré-requisitos para a stack web, como Node.js, Python, etc.)*
### Instalação
1. **Clone o repositório:**
```sh
git clone [URL_DO_SEU_REPOSITORIO_GITEA]
cd portal-gestao-automation
```
2. **Configuração do Backend:**
*(Instruções para configurar a API que irá executar os scripts)*
3. **Configuração do Frontend:**
*(Instruções para instalar dependências e iniciar o servidor de desenvolvimento do frontend)*
4. **Configuração dos Scripts:**
- Nenhuma instalação é necessária para os scripts, mas garanta que a política de execução do PowerShell permita a execução de scripts locais:
```powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
```
## 📖 Como Usar
Os scripts de automação estão localizados na pasta `/scripts` e são projetados para serem chamados pela API do backend. Para testes manuais, podem ser executados diretamente via PowerShell.
**Exemplo (Criação de Usuário em Massa):**
```powershell
# 1. Prepare as credenciais de forma segura
$clientCred = Get-Credential
$exchangeCred = Get-Credential
# 2. Execute o script apontando para o arquivo CSV
.\scripts\identity\New-ADUserFromTemplate.ps1 -CsvPath "C:\temp\novos_usuarios.csv" -ClientADServer "dc01.local" -ClientADCredential $clientCred -ExchangeADServer "mail.local" -ExchangeADCredential $exchangeCred
```
> Para detalhes completos sobre os parâmetros de cada script e a estrutura dos arquivos de entrada, consulte a **Wiki do Projeto**.
## 🗺️ Fases do Projeto (Roadmap)
A implementação seguirá as fases estratégicas definidas no dossiê do projeto para mitigar riscos e entregar valor de forma contínua.
| Fase | Título | Duração Estimada | Entregáveis Chave |
| :--: | ------------------------------------------ | :--------------: | --------------------------------------------------------- |
| 1 | Análise e Arquitetura Estratégica | 3-4 Semanas | Blueprint técnico, DPIA/LGPD, planejamento de extensão AD |
| 2 | Prova de Conceito (PoC) de Riscos | 2 Semanas | Validação de integrações complexas (Multi-AD, SIEM) |
| 3 | MVP - Autoatendimento Essencial | 6-8 Semanas | Portal com login, troca de senha e atualização de perfil |
| 4 | Módulo de Gestão (Gestores e RH) | 5-6 Semanas | Criação de usuários, grupos, e módulo de desligamento |
| 5 | Módulos de Automação e Auditoria | 5-7 Semanas | Scripts de higienização, organograma e painel de auditoria|
| 6 | Integração com Sistemas Externos | 4-6 Semanas | Conectores (Exchange, Nextcloud, Zammad), dashboard unificado|
| 7 | Painel de Gestão e Configurações | 3-4 Semanas | Painel de admin para gerenciar variáveis e integrações |
| 8 | Lançamento e Melhoria Contínua | Contínuo | Plataforma em produção, monitoramento de KPIs e treinamento |
## 🤝 Como Contribuir
Contribuições são o que tornam a comunidade um lugar incrível para aprender, inspirar e criar. Qualquer contribuição que você fizer será **muito apreciada**.
1. Faça um Fork do Projeto
2. Crie sua Feature Branch (`git checkout -b feature/AmazingFeature`)
3. Faça o Commit de suas alterações (`git commit -m 'Add some AmazingFeature'`)
4. Faça o Push para a Branch (`git push origin feature/AmazingFeature`)
5. Abra um Pull Request
---

View File

@ -0,0 +1,659 @@
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dossiê Completo do Projeto: Plataforma Unificada de Trabalho Digital</title>
<style>
body { font-family: Arial, Helvetica, sans-serif; line-height: 1.6; margin: 0; padding: 0; background-color: #ffffff; color: #333; }
.container { max-width: 1200px; margin: 20px auto; padding: 20px; background-color: #fff; }
h1, h2, h3, h4 { color: #2c3e50; border-bottom: 2px solid #ecf0f1; padding-bottom: 10px; }
h1 { font-size: 2.5em; text-align: center; margin-bottom: 30px; }
h2 { font-size: 2em; margin-top: 40px; }
h3 { font-size: 1.5em; margin-top: 30px; }
h4 { font-size: 1.2em; margin-top: 25px; border-bottom: 1px dotted #bdc3c7; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }
th, td { border: 1px solid #ddd; padding: 12px; text-align: left; vertical-align: top; }
th { background-color: #f2f2f2; font-weight: bold; }
pre { background-color: #ffffff; border: 1px solid #cccccc; padding: 15px; overflow-x: auto; font-family: 'Consolas', 'Courier New', monospace; font-size: 0.9em; white-space: pre-wrap; word-wrap: break-word; }
code { font-family: 'Consolas', 'Courier New', monospace; background-color: #ecf0f1; padding: 2px 5px; border-radius: 4px; }
.summary { background-color: #f9f9f9; border-left: 5px solid #3498db; padding: 20px; margin-bottom: 30px; }
.highlight-kpi { background-color: #e8f5e9; border-left: 5px solid #4caf50; padding: 20px; margin-bottom: 30px; }
.note { background-color: #fff9c4; border-left: 5px solid #fbc02d; padding: 15px; margin: 20px 0; }
.danger-note { background-color: #ffebee; border-left: 5px solid #c62828; padding: 15px; margin: 20px 0; }
.acceptance-criteria { background-color: #e0f2f1; border-left: 5px solid #00796b; padding: 1px 20px; margin-top: 15px; }
.section { margin-bottom: 40px; }
</style>
</head>
<body>
<div class="container">
<h1>Dossiê Completo do Projeto: Plataforma Unificada de Trabalho Digital</h1>
<p style="text-align: center; font-style: italic; color: #7f8c8d;">Um blueprint consolidado para o investimento estratégico na modernização, segurança e eficiência da gestão de TI e RH.</p>
<p style="text-align: center;"><strong>Versão:</strong> Dossiê Final Consolidado | <strong>Data:</strong> 13 de outubro de 2025</p>
<div class="summary section">
<h3>Sumário Executivo para Gestão</h3>
<p>Esta proposta detalha a criação de uma <strong>Plataforma Unificada de Trabalho Digital</strong>, um investimento estratégico projetado para <strong>reduzir custos operacionais</strong>, <strong>aumentar a segurança e a conformidade (LGPD)</strong> e <strong>melhorar a agilidade organizacional</strong>. Atualmente, processos manuais de gestão de identidades (criação de usuários, resets de senha, gestão de grupos, desligamentos) consomem um tempo valioso das equipes de TI e RH, além de serem fontes de erro humano e riscos de segurança.</p>
<p>A plataforma proposta irá:
<ul style="list-style-type: none; padding: 0;">
<li><strong>Automatizar 80% das solicitações de TI rotineiras</strong>, liberando a equipe para focar em projetos de maior valor agregado.</li>
<li><strong>Unificar o acesso a sistemas-chave</strong> como Exchange, Nextcloud e Zammad em um dashboard central, transformando o portal no principal ponto de entrada para o ambiente de trabalho do colaborador.</li>
<li><strong>Mitigar riscos de segurança</strong> através da higienização automática de contas inativas e da automação de processos de desligamento, garantindo que acessos sejam revogados em tempo hábil.</li>
<li><strong>Empoderar colaboradores e gestores</strong> com ferramentas de autoatendimento, melhorando a produtividade e a satisfação.</li>
<li><strong>Centralizar e garantir a integridade dos dados de colaboradores</strong>, fornecendo ao RH e gestores uma visão única e confiável, diretamente do Active Directory.</li>
</ul>
Este documento apresenta o escopo completo, a justificativa de investimento através de KPIs mensuráveis, os fluxos de operação detalhados para todas as funcionalidades, os riscos e desafios esperados, os critérios de aceite para cada etapa e um plano de implementação faseado.
</div>
<div id="kpis" class="highlight-kpi section">
<h2>Justificativa de Investimento: KPIs e Metas de Sucesso</h2>
<p>O sucesso do projeto será medido por indicadores claros e mensuráveis. O projeto será considerado bem-sucedido ao atingir as metas estabelecidas abaixo dentro de 6 meses após o lançamento completo.</p>
<table>
<thead><tr><th>KPI</th><th>Métrica</th><th>Fonte de Dados</th><th>Meta de Sucesso</th><th>Impacto no Negócio</th></tr></thead>
<tbody>
<tr>
<td>Redução de Carga Operacional de TI</td>
<td>Volume de tickets (categorias: senha, criação de usuário, grupos)</td>
<td>Sistema de Chamados (Help Desk)</td>
<td><strong>Redução de 40%</strong></td>
<td>Redução de custos operacionais, realocação da equipe de TI para atividades estratégicas.</td>
</tr>
<tr>
<td>Aumento da Postura de Segurança</td>
<td>Nº de contas de usuários/computadores ativas e inativas > 90 dias</td>
<td>Relatórios do Painel de Automação</td>
<td><strong>Redução de 95%</strong></td>
<td>Minimização da superfície de ataque, conformidade com auditorias de segurança.</td>
</tr>
<tr>
<td>Agilidade no Ciclo de Vida do Colaborador</td>
<td>Tempo médio para provisionar um novo usuário / desativar um usuário desligado</td>
<td>Logs do Portal, Sistema de Chamados</td>
<td><strong>Provisionamento &lt; 10 min<br>Desligamento &lt; 5 min</strong></td>
<td>Melhora a produtividade (onboarding rápido) e a segurança (offboarding imediato).</td>
</tr>
<tr>
<td>Adoção como Hub Digital</td>
<td>Cliques em widgets de integração e links de aplicativos / Sessões totais</td>
<td>Logs de auditoria do Portal</td>
<td><strong>&gt; 30%</strong></td>
<td>Aumento da produtividade do colaborador, redução de tempo gasto procurando ferramentas.</td>
</tr>
<tr>
<td>Adoção e Satisfação do Usuário</td>
<td>% de resets de senha via portal vs. help desk; NPS (Net Promoter Score) da plataforma</td>
<td>Logs do Portal; Pesquisa de satisfação</td>
<td><strong>80% de autosserviço;<br>NPS &gt; 40</strong></td>
<td>Aumento da produtividade e autonomia dos colaboradores, melhora da experiência de trabalho.</td>
</tr>
</tbody>
</table>
</div>
<div id="catalog" class="section">
<h2>Catálogo de Módulos, Funcionalidades e Fluxos de Execução</h2>
<h3>Módulo 1: Portal do Colaborador (Hub Digital)</h3>
<h4>Autenticação de Usuário</h4>
<h4>Fluxo Detalhado de Execução</h4>
<pre>
[USUÁRIO]
| AÇÃO: Informa Login/Senha no formulário.
v
[FRONTEND]
| VALIDAÇÃO: Valida formato dos campos (ex: e-mail válido).
| AÇÃO: Envia credenciais (HTTPS) para o Backend.
v
[BACKEND API]
| VALIDAÇÃO: Recebe e valida a requisição HTTP.
| - Verifica Token CSRF (se aplicável).
| - Tenta autenticar via LDAPS (bind) com as credenciais.
| TESTE: O bind LDAPS foi bem-sucedido?
| - Se SUCESSO:
| - AÇÃO: Gera Token de Sessão (JWT) para o usuário.
| - AÇÃO: Loga "Login Success" (UserLogin, SourceIP, SourceHostname, SourceLocation).
| - AÇÃO: Retorna o Token de Sessão para o Frontend.
| - Se FALHA:
| - AÇÃO: Loga "Login Failure" (UserLogin, SourceIP, SourceHostname, SourceLocation, Motivo).
| - AÇÃO: Retorna erro 401 (Não Autorizado) para o Frontend.
v
[FRONTEND]
| VALIDAÇÃO: Recebe a resposta da API.
| AÇÃO: Se Token recebido:
| - Armazena o Token (ex: LocalStorage, Cookies seguros).
| - Redireciona para a página inicial do portal.
| Senão (erro):
| - Exibe mensagem de erro (ex: "Usuário ou senha inválidos").
</pre>
<h4>Dashboard Unificado e Personalizado</h4>
<p>O Dashboard é a tela inicial para todos os usuários, apresentando widgets que consolidam informações de múltiplos sistemas como AD, Exchange, Nextcloud e Zammad.</p>
<div class="danger-note">
<h4>Pontos de Dificuldade e Desafios</h4>
<ul>
<li><strong>Latência:</strong> A performance do dashboard depende da velocidade de resposta das APIs de todos os sistemas integrados. Chamadas lentas podem degradar a experiência do usuário.</li>
<li><strong>Tratamento de Erros:</strong> A interface precisa lidar de forma elegante com falhas individuais de cada widget (ex: se a API do Zammad estiver offline, os outros widgets devem carregar normalmente).</li>
</ul>
</div>
<div class="acceptance-criteria">
<h4>Critérios de Aceite</h4>
<ul>
<li>✔ O dashboard deve carregar em menos de 3 segundos em condições normais de rede.</li>
<li>✔ Todos os widgets devem exibir dados precisos e atualizados no momento do carregamento.</li>
<li>✔ Se uma integração falhar, o widget correspondente deve exibir uma mensagem de erro clara sem impedir o carregamento do restante da página.</li>
<li>✔ A seção "Meus Aplicativos" deve exibir apenas os links configurados para o domínio e departamento do usuário logado.</li>
</ul>
</div>
<h4>Alteração de Senha (Self-Service)</h4>
<div class="danger-note">
<h4>Pontos de Dificuldade e Desafios</h4>
<ul>
<li><strong>Sincronização Atômica:</strong> Garantir que a senha seja alterada em múltiplos ADs (principal e de e-mail) de forma transacional é complexo. Uma falha no segundo AD após o sucesso no primeiro deixa as senhas dessincronizadas.</li>
</ul>
</div>
<div class="acceptance-criteria">
<h4>Critérios de Aceite</h4>
<ul>
<li>✔ O usuário consegue alterar sua senha com sucesso em ambos os ADs.</li>
<li>✔ Em caso de falha de sincronização, um log de erro detalhado é gerado e o usuário recebe uma notificação instruindo-o a contatar o suporte.</li>
<li>✔ O usuário recebe um e-mail de confirmação após a alteração bem-sucedida.</li>
</ul>
</div>
<h4>Fluxo Detalhado de Execução</h4>
<pre>
[USUÁRIO]
| AÇÃO: Preenche formulário com senha atual e nova senha (duas vezes).
v
[FRONTEND]
| VALIDAÇÃO: Valida complexidade da nova senha (tamanho, caracteres especiais).
| - Confere se nova senha e confirmação são iguais.
| AÇÃO: Envia requisição (HTTPS) para o Backend (incluindo Token de Sessão).
v
[BACKEND API]
| VALIDAÇÃO: Valida o Token de Sessão (autenticação e autorização).
| - Carrega configurações específicas do domínio do usuário (do BD de Configurações).
| AÇÃO: Loga "PasswordChange Attempt" (UserLogin, SourceIP, TargetObject).
| AÇÃO: Invoca script PowerShell Set-UserPassword.ps1 com parâmetros (usuário, senha antiga, nova senha, AD_SERVER).
v
[POWERSHELL SCRIPT]
| AÇÃO: Conecta ao AD Principal usando a Conta de Serviço.
| VALIDAÇÃO: Tenta autenticar o usuário com a senha antiga.
| TESTE: Autenticação da senha antiga bem-sucedida?
| - Se SUCESSO:
| - AÇÃO: Executa Set-ADAccountPassword no AD Principal com a nova senha.
| - TESTE: Troca de senha no AD Principal bem-sucedida?
| - Se SUCESSO:
| - AÇÃO: Se houver AD de E-mail separado, repete os passos de conexão e troca de senha lá.
| - VALIDAÇÃO: Troca de senha no AD de E-mail bem-sucedida?
| - Se SUCESSO:
| - AÇÃO: Retorna SUCESSO consolidado para a API.
| - Se FALHA (E-mail):
| - AÇÃO: Retorna ERRO consolidado para a API (com detalhes).
| - Se FALHA (Principal):
| - AÇÃO: Retorna ERRO consolidado para a API (com detalhes).
| - Se FALHA (Senha Antiga):
| - AÇÃO: Retorna ERRO "Senha Antiga Inválida" para a API.
v
[BACKEND API]
| VALIDAÇÃO: Recebe o resultado do script PowerShell.
| AÇÃO: Loga o resultado final ("PasswordChange Success" ou "PasswordChange Failure" com motivo).
| AÇÃO: Dispara e-mail de notificação (usando template do cliente) para o usuário.
| AÇÃO: Retorna resposta JSON para o Frontend.
v
[FRONTEND]
| VALIDAÇÃO: Exibe mensagem de sucesso ou erro para o USUÁRIO.
</pre>
<h4>Atualização de Foto de Perfil</h4>
<h4>Fluxo Detalhado de Execução</h4>
<pre>
[USUÁRIO]
| AÇÃO: Seleciona e carrega uma imagem (PNG/JPG).
v
[FRONTEND]
| VALIDAÇÃO: Valida tipo de arquivo (PNG/JPG) e tamanho (ex: <2MB).
| AÇÃO: Envia a imagem (HTTPS) para o Backend (incluindo Token de Sessão).
v
[BACKEND API]
| VALIDAÇÃO: Valida Token de Sessão e recebe a imagem.
| AÇÃO: Loga "PhotoUpdate Attempt" (UserLogin, SourceIP, TargetObject).
| AÇÃO: Invoca script PowerShell Set-UserProfilePhoto.ps1 com parâmetros (usuário, imagem em base64/bytes).
v
[POWERSHELL SCRIPT]
| AÇÃO: Recebe a imagem.
| VALIDAÇÃO: Redimensiona e comprime a imagem para um tamanho adequado (ex: <100KB).
| AÇÃO: Converte a imagem para um array de bytes.
| AÇÃO: Conecta ao AD Principal usando a Conta de Serviço.
| AÇÃO: Grava o array de bytes no atributo thumbnailPhoto do usuário.
| TESTE: Gravação no AD bem-sucedida?
| - Se SUCESSO:
| - AÇÃO: Retorna SUCESSO para a API.
| - Se FALHA:
| - AÇÃO: Retorna ERRO para a API (com detalhes).
v
[BACKEND API]
| VALIDAÇÃO: Recebe o resultado do script PowerShell.
| AÇÃO: Loga o resultado final ("PhotoUpdate Success" ou "PhotoUpdate Failure").
| AÇÃO: Retorna resposta JSON para o Frontend.
v
[FRONTEND]
| VALIDAÇÃO: Exibe mensagem de sucesso/erro.
| AÇÃO: Se sucesso:
| - Atualiza a foto exibida na interface do USUÁRIO.
</pre>
<h3>Módulo 2: Portal do Gestor</h3>
<h4>Criação de Novo Colaborador</h4>
<div class="danger-note">
<h4>Pontos de Dificuldade e Desafios</h4>
<ul>
<li><strong>Complexidade do Workflow:</strong> O processo envolve criação de conta no AD, adição a múltiplos grupos, criação de mailbox em outro sistema e envio de notificações. A falha em qualquer etapa precisa ser tratada para evitar contas parcialmente configuradas.</li>
</ul>
</div>
<div class="acceptance-criteria">
<h4>Critérios de Aceite</h4>
<ul>
<li>✔ Um gestor autorizado consegue preencher o formulário e criar um novo usuário com sucesso.</li>
<li>✔ A conta do novo usuário é criada na OU correta, com os atributos corretos e nos grupos padrão definidos nas configurações.</li>
<li>✔ A mailbox do novo usuário é criada e funcional.</li>
<li>✔ O gestor e o novo colaborador recebem os e-mails de notificação corretos.</li>
</ul>
</div>
<h4>Fluxo Detalhado de Execução</h4>
<pre>
[GESTOR]
| AÇÃO: Preenche formulário com dados do novo colaborador (nome, sobrenome, departamento, etc.).
v
[FRONTEND]
| VALIDAÇÃO: Valida formato dos campos (ex: e-mail do gestor válido, dados obrigatórios).
| AÇÃO: Envia requisição (HTTPS) para o Backend (incluindo Token de Sessão).
v
[BACKEND API]
| VALIDAÇÃO: Valida Token de Sessão (autenticação e autorização do GESTOR).
| - TESTE: O usuário é um gestor autorizado a criar usuários?
| - Carrega variáveis de configuração do BD (OU padrão, grupos padrão, AD_SERVER, etc.).
| AÇÃO: Loga "UserCreation Attempt" (GestorLogin, SourceIP, DadosPropostos).
| AÇÃO: Invoca script PowerShell New-ADUserFromTemplate.ps1 com parâmetros (dados do form, variáveis de config).
v
[POWERSHELL SCRIPT]
| AÇÃO: Conecta ao AD Principal usando a Conta de Serviço.
| AÇÃO: Gera uma senha temporária segura para o novo usuário.
| AÇÃO: Cria o usuário no AD Principal com todos os atributos fornecidos.
| TESTE: Criação do usuário no AD bem-sucedida?
| - Se SUCESSO:
| - AÇÃO: Adiciona o novo usuário aos grupos padrão definidos nas variáveis.
| - AÇÃO: Se houver AD de E-mail/Exchange separado, cria o mailbox.
| - TESTE: Criação do mailbox bem-sucedida?
| - Se SUCESSO:
| - AÇÃO: Retorna SUCESSO consolidado (com login e senha temporária) para a API.
| - Se FALHA (E-mail):
| - AÇÃO: Loga erro específico. Retorna ERRO para a API.
| - Se FALHA (Principal):
| - AÇÃO: Loga erro específico. Retorna ERRO para a API.
v
[BACKEND API]
| VALIDAÇÃO: Recebe o resultado do script PowerShell.
| AÇÃO: Loga o resultado final ("UserCreation Success" ou "UserCreation Failure" com motivo).
| AÇÃO: Dispara e-mails de notificação (usando templates do cliente):
| - Para o novo colaborador (boas-vindas com login/senha temporária).
| - Para o gestor (confirmação da criação).
| AÇÃO: Retorna resposta JSON para o Frontend.
v
[FRONTEND]
| VALIDAÇÃO: Exibe mensagem de sucesso/erro para o GESTOR, incluindo os dados do novo usuário e senha temporária se for um sucesso.
</pre>
<h4>Criação de Grupos de Distribuição</h4>
<h4>Fluxo Detalhado de Execução</h4>
<pre>
[GESTOR]
| AÇÃO: Preenche formulário com nome do grupo, descrição e lista de membros (e-mails).
v
[FRONTEND]
| VALIDAÇÃO: Valida formato dos campos (ex: nome do grupo, e-mails).
| AÇÃO: Envia requisição (HTTPS) para o Backend (incluindo Token de Sessão).
v
[BACKEND API]
| VALIDAÇÃO: Valida Token de Sessão e permissão do GESTOR para criar grupos.
| AÇÃO: Loga "GroupCreation Attempt" (GestorLogin, SourceIP, GroupName, Members).
| AÇÃO: Invoca script PowerShell New-DistributionGroup.ps1 com parâmetros.
v
[POWERSHELL SCRIPT]
| AÇÃO: Conecta ao AD Principal usando a Conta de Serviço.
| AÇÃO: Cria o grupo de distribuição no AD.
| TESTE: Criação do grupo bem-sucedida?
| - Se SUCESSO:
| - AÇÃO: Define o gestor como "ManagedBy" do grupo.
| - AÇÃO: Para cada membro na lista:
| - TESTE: É um e-mail interno (existente no AD) ou externo?
| - Se INTERNO: AÇÃO: Adiciona usuário ao grupo.
| - Se EXTERNO: AÇÃO: Cria um ADContact e o adiciona ao grupo.
| - TESTE: Adição de todos os membros bem-sucedida?
| - Se SUCESSO:
| - AÇÃO: Retorna SUCESSO para a API.
| - Se FALHA (membros):
| - AÇÃO: Retorna ERRO (com lista de membros falhos) para a API.
| - Se FALHA (Grupo):
| - AÇÃO: Retorna ERRO para a API (com detalhes).
v
[BACKEND API]
| VALIDAÇÃO: Recebe o resultado do script PowerShell.
| AÇÃO: Loga o resultado final ("GroupCreation Success" ou "GroupCreation Failure").
| AÇÃO: Retorna resposta JSON para o Frontend.
v
[FRONTEND]
| VALIDAÇÃO: Exibe mensagem de sucesso/erro para o GESTOR.
</pre>
<h3>Módulo 3: Gestão de Colaboradores (RH)</h3>
<h4>Painel de Colaboradores, Consulta e Edição</h4>
<p>Uma interface para o RH e gestores (com visão restrita à sua equipe) para visualizar, consultar e editar informações dos colaboradores.</p>
<h4>Fluxo Detalhado de Execução (Consulta e Edição)</h4>
<pre>
[USUÁRIO RH/GESTOR]
| AÇÃO: Navega para a seção "Colaboradores Ativos".
v
[FRONTEND]
| AÇÃO: Envia requisição (HTTPS) para o Backend para buscar a lista.
v
[BACKEND API]
| VALIDAÇÃO: Valida Token de Sessão e permissão (RH ou Gestor).
| - TESTE: Se Gestor, aplica filtro para mostrar apenas sua equipe.
| AÇÃO: Invoca script PowerShell Get-AllActiveUsers.ps1.
v
[POWERSHELL SCRIPT]
| AÇÃO: Busca todos os usuários ativos, aplicando os filtros.
| VALIDAÇÃO: Filtra os atributos retornados para incluir apenas os relevantes.
| AÇÃO: Retorna lista de usuários para a API.
v
[BACKEND API]
| AÇÃO: Retorna lista de usuários em JSON para o Frontend.
v
[FRONTEND]
| AÇÃO: Exibe a lista de colaboradores.
| AÇÃO: [USUÁRIO RH] clica em "Editar" e modifica campos.
| VALIDAÇÃO: Valida formato dos campos editados.
| AÇÃO: Envia requisição (HTTPS) de atualização para o Backend.
v
[BACKEND API (Update)]
| VALIDAÇÃO: Valida Token de Sessão e permissão (apenas RH).
| AÇÃO: Loga "UserDetailsUpdate Attempt".
| AÇÃO: Invoca script PowerShell Set-ADUserAttributes.ps1.
v
[POWERSHELL SCRIPT (Update)]
| AÇÃO: Conecta ao AD e executa Set-ADUser para atualizar os atributos.
| TESTE: Atualização bem-sucedida?
| - Se SUCESSO: Retorna SUCESSO.
| - Se FALHA: Retorna ERRO.
v
[BACKEND API (Update)]
| AÇÃO: Loga o resultado final e retorna para o Frontend.
v
[FRONTEND]
| VALIDAÇÃO: Exibe mensagem de sucesso/erro.
</pre>
<h4>Processo de Desligamento Automatizado</h4>
<div class="danger-note">
<h4>Pontos de Dificuldade e Desafios</h4>
<ul>
<li><strong>Orquestração de Múltiplos Sistemas:</strong> O processo depende da comunicação bem-sucedida com AD e Exchange. Falhas de conexão ou permissão podem interromper o fluxo.</li>
<li><strong>Timing:</strong> O processo deve ser imediato para garantir a segurança, exigindo alta disponibilidade dos sistemas envolvidos.</li>
</ul>
</div>
<div class="acceptance-criteria">
<h4>Critérios de Aceite</h4>
<ul>
<li>✔ Um usuário de RH autorizado consegue iniciar e concluir o processo de desligamento.</li>
<li>✔ A conta do usuário no AD é imediatamente desativada.</li>
<li>✔ A mailbox do usuário é convertida para Shared Mailbox.</li>
<li>✔ O gestor do usuário desligado recebe permissão de acesso total à Shared Mailbox.</li>
<li>✔ O redirecionamento de e-mails para o gestor é ativado.</li>
<li>✔ O gestor e o RH recebem e-mails de confirmação detalhando as ações executadas.</li>
</ul>
</div>
<h4>Fluxo Detalhado de Execução</h4>
<pre>
[USUÁRIO RH]
| AÇÃO: Na tela de detalhes do colaborador, clica em "Desligar".
v
[FRONTEND]
| AÇÃO: Exibe modal de confirmação.
| AÇÃO: Envia requisição (HTTPS) para o Backend (incluindo Token de Sessão).
v
[BACKEND API]
| VALIDAÇÃO: Valida Token de Sessão e permissão (apenas RH).
| AÇÃO: Loga "Offboarding Initiated".
| AÇÃO: Invoca script PowerShell Automate-Offboarding.ps1.
v
[POWERSHELL SCRIPT]
| AÇÃO: Conecta ao AD e Exchange.
| AÇÃO: Desativa a conta do usuário no AD (Disable-ADAccount).
| TESTE: Desativação da conta bem-sucedida?
| - Se SUCESSO:
| - AÇÃO: Converte a Mailbox para Shared Mailbox.
| - TESTE: Conversão bem-sucedida?
| - Se SUCESSO:
| - AÇÃO: Adiciona permissão "Full Access" para o gestor.
| - AÇÃO: Configura o redirecionamento de e-mail.
| - TESTE: Permissões/Redirecionamento bem-sucedidos?
| - Se SUCESSO:
| - AÇÃO: Retorna SUCESSO consolidado.
| - Se FALHA: Retorna ERRO.
| - Se FALHA: Retorna ERRO.
| - Se FALHA: Retorna ERRO.
v
[BACKEND API]
| VALIDAÇÃO: Recebe o resultado do script.
| AÇÃO: Loga o resultado final.
| AÇÃO: Dispara e-mails de notificação para gestor e RH.
| AÇÃO: Retorna resposta JSON para o Frontend.
v
[FRONTEND]
| VALIDAÇÃO: Exibe mensagem de confirmação de sucesso/erro.
</pre>
<h3>Módulo 4: Automação e Governança (Backend)</h3>
<h4>Higienização de Contas (Computadores e Usuários)</h4>
<div class="danger-note">
<h4>Pontos de Dificuldade e Desafios</h4>
<ul>
<li><strong>Definição de Exceções:</strong> Identificar e configurar corretamente as OUs ou contas de serviço que devem ser excluídas da limpeza automática é crucial para evitar a desativação de contas importantes.</li>
<li><strong>Precisão do `lastLogonTimestamp`:</strong> Este atributo do AD não é replicado em tempo real, podendo haver uma latência. As regras devem levar essa imprecisão em consideração.</li>
</ul>
</div>
<div class="acceptance-criteria">
<h4>Critérios de Aceite</h4>
<ul>
<li>✔ O job agendado executa no horário configurado.</li>
<li>✔ Apenas contas que excederam o limiar de inatividade e não estão na lista de exceções são desativadas.</li>
<li>✔ Um relatório detalhado é gerado e enviado para os destinatários corretos (TI, RH, Gestores).</li>
<li>✔ A execução do job (sucesso, falha, nº de contas desativadas) é registrada nos logs de auditoria.</li>
</ul>
</div>
<h4>Fluxo Detalhado de Execução (Higienização de Computadores)</h4>
<pre>
[AGENDADOR DE TAREFAS]
| AÇÃO: Dispara o job em um horário programado.
v
[SCRIPT POWERSHELL]
| VALIDAÇÃO: Lê as configurações (dias de inatividade X, e-mail de TI).
| AÇÃO: Conecta ao AD.
| AÇÃO: Busca computadores inativos há mais de X dias.
| TESTE: Existe lista de computadores inativos e eles ainda estão ativos?
| - Se SIM:
| - AÇÃO: Para cada computador na lista:
| - VALIDAÇÃO: Confere se o computador não está em uma OU de exceção.
| - AÇÃO: Desativa a conta no AD (Disable-ADAccount).
| - AÇÃO: Adiciona o computador a uma lista para o relatório.
| - AÇÃO: Gera relatório (HTML/CSV) com a lista.
| - CONFIRMAÇÃO: Envia o relatório por e-mail para a equipe de TI.
| - AÇÃO: Loga "ComputerCleanup Success".
| - Se NÃO (ou erro):
| - AÇÃO: Loga "ComputerCleanup NoChanges" ou "Failure".
| FIM
</pre>
<h4>Mapeamento Organizacional</h4>
<div class="danger-note">
<h4>Pontos de Dificuldade e Desafios</h4>
<ul>
<li><strong>Extensão do Esquema do AD:</strong> Esta é uma operação de altíssimo risco, irreversível e que pode impactar toda a floresta do Active Directory se não for executada corretamente.</li>
<li><strong>Lógica de Hierarquia:</strong> A lógica para determinar o "cargo" com base na estrutura de gerência pode ser complexa.</li>
</ul>
</div>
<div class="acceptance-criteria">
<h4>Critérios de Aceite</h4>
<ul>
<li>✔ O atributo customizado é criado com sucesso no Esquema do AD (após testes em laboratório).</li>
<li>✔ O job agendado popula corretamente o atributo para todos os usuários com base na sua posição na hierarquia.</li>
<li>✔ A execução do job é registrada nos logs de auditoria.</li>
</ul>
</div>
<h4>Fluxo Detalhado de Execução</h4>
<pre>
[AGENDADOR DE TAREFAS]
| AÇÃO: Dispara o job em um horário programado.
v
[SCRIPT POWERSHELL]
| VALIDAÇÃO: Conecta ao AD e lê o nome do atributo customizado.
| AÇÃO: Busca todos os usuários ativos com o atributo "manager" preenchido.
| TESTE: Existem usuários com "manager"?
| - Se SIM:
| - AÇÃO: Constrói uma árvore hierárquica em memória.
| - AÇÃO: Para cada usuário na árvore:
| - VALIDAÇÃO: Determina o organizationalRole com base na posição.
| - TESTE: O organizationalRole calculado é diferente do valor atual no AD?
| - Se SIM:
| - AÇÃO: Atualiza o atributo customizado (Set-ADUser -Replace ...).
| - AÇÃO: Adiciona o usuário à lista de atualizados para o log.
| - CONFIRMAÇÃO: Loga "OrgChartUpdate Success" com o número de usuários atualizados.
| - Se NÃO (ou erro):
| - AÇÃO: Loga "OrgChartUpdate Failure".
| FIM
</pre>
<h3>Módulo 5: Painel de Auditoria e Relatórios</h3>
<h4>Geração de Relatório de Atividade de Login</h4>
<div class="note"><strong>Pré-requisito Técnico:</strong> A funcionalidade de relatório de login depende da existência de um sistema centralizado de coleta de logs (como SIEM ou Windows Event Forwarding).</div>
<h4>Fluxo Detalhado de Execução</h4>
<pre>
[USUÁRIO SUPORTE]
| AÇÃO: Define filtros (usuário, período) e solicita relatório.
v
[FRONTEND]
| VALIDAÇÃO: Valida formato dos filtros.
| AÇÃO: Envia requisição para o Backend.
v
[BACKEND API]
| VALIDAÇÃO: Valida Token de Sessão e permissão.
| AÇÃO: Loga "LoginReport Generation Attempt".
| AÇÃO: Constrói e executa a query de busca no SIEM.
v
[SIEM / COLETOR DE LOGS]
| AÇÃO: Processa a query (ex: busca pelo EventID 4624) e retorna os dados.
v
[BACKEND API]
| VALIDAÇÃO: Recebe os resultados do SIEM.
| AÇÃO: Formata os dados e retorna para o painel.
| AÇÃO: Loga "LoginReport Generation Success" ou "Failure".
v
[FRONTEND]
| VALIDAÇÃO: Exibe relatório em uma tabela interativa.
</pre>
<h4>Exportação de Logs de Auditoria</h4>
<h4>Fluxo Detalhado de Execução</h4>
<pre>
[USUÁRIO SUPORTE/ADMIN]
| AÇÃO: No Painel de Auditoria, aplica filtros e clica em "Exportar".
v
[FRONTEND]
| AÇÃO: Exibe modal solicitando e-mail de destino e justificativa.
| AÇÃO: Envia requisição (HTTPS) para o Backend.
v
[BACKEND API]
| VALIDAÇÃO: Valida Token de Sessão e permissão.
| - VALIDAÇÃO: Confere se e-mail de destino e justificativa são fornecidos.
| AÇÃO: Loga "AuditLog Export Attempt".
| AÇÃO: Executa a consulta nos logs internos do portal com os filtros aplicados.
| TESTE: Consulta de logs bem-sucedida e há dados a exportar?
| - Se SIM:
| - AÇÃO: Gera um arquivo (CSV/PDF) com os logs.
| - AÇÃO: Anexa o arquivo e envia um e-mail para o endereço de destino.
| - CONFIRMAÇÃO: Loga "AuditLog Export Success" (com hash do arquivo).
| - AÇÃO: Retorna SUCESSO para o Frontend.
| - Se NÃO (ou erro):
| - AÇÃO: Loga "AuditLog Export Failure".
| - AÇÃO: Retorna ERRO para o Frontend.
v
[FRONTEND]
| VALIDAÇÃO: Exibe mensagem de sucesso/erro para o USUÁRIO.
</pre>
</div>
<div id="fases" class="section">
<h2>Fases de Implementação Unificadas</h2>
<p>Propomos uma implementação faseada para mitigar riscos, garantir a adoção e permitir uma entrega de valor contínua.</p>
<table>
<thead><tr><th>Fase</th><th>Título</th><th>Duração</th><th>Entregáveis Chave e Valor para o Negócio</th></tr></thead>
<tbody>
<tr>
<td>1</td>
<td>Análise e Arquitetura Estratégica</td>
<td>3-4 Semanas</td>
<td>Blueprint técnico, análise de impacto (DPIA/LGPD), e <strong>planejamento da extensão do Esquema AD</strong>. <strong>Valor:</strong> Garante que a fundação do projeto é segura, escalável e alinhada com os requisitos de negócio.</td>
</tr>
<tr>
<td>2</td>
<td>Prova de Conceito (PoC) de Riscos</td>
<td>2 Semanas</td>
<td>Validação das integrações mais complexas (Multi-AD, SIEM). <strong>Valor:</strong> Elimina os principais riscos técnicos antes do investimento em desenvolvimento.</td>
</tr>
<tr>
<td>3</td>
<td>MVP - Autoatendimento Essencial</td>
<td>6-8 Semanas</td>
<td>Portal com login, troca de senha e atualização de perfil. <strong>Valor:</strong> Entrega rápida do maior redutor de tickets de TI, gerando ROI imediato.</td>
</tr>
<tr>
<td>4</td>
<td>Módulo de Gestão (Gestores e RH)</td>
<td>5-6 Semanas</td>
<td>Painel de gestão com criação de usuários, grupos, e o <strong>módulo de desligamento do RH</strong>. <strong>Valor:</strong> Agiliza o ciclo de vida do colaborador e fortalece a segurança do offboarding.</td>
</tr>
<tr>
<td>5</td>
<td>Módulos de Automação e Auditoria</td>
<td>5-7 Semanas</td>
<td>Scripts de higienização, organograma, e o painel de auditoria completo. <strong>Valor:</strong> Implementa a governança proativa, reduzindo riscos de forma contínua e automática.</td>
</tr>
<tr>
<td>6</td>
<td>Integração com Sistemas Externos e Catálogo de Apps</td>
<td>4-6 Semanas</td>
<td>Conectores para Exchange, Nextcloud e Zammad; Dashboard unificado funcional; Painel de gestão para o catálogo de aplicativos. <strong>Valor:</strong> Transforma o portal em um hub de produtividade, aumentando o engajamento e a eficiência.</td>
</tr>
<tr>
<td>7</td>
<td>Painel de Gestão e Configurações</td>
<td>3-4 Semanas</td>
<td>Implementação completa do Painel de Configurações para gerenciar AD, e-mail, integrações e variáveis de scripts. <strong>Valor:</strong> Oferece flexibilidade e controle total sobre o sistema para os administradores, permitindo adaptações futuras sem código.</td>
</tr>
<tr>
<td>8</td>
<td>Lançamento e Melhoria Contínua</td>
<td>Contínuo</td>
<td>Plataforma completa em produção, monitoramento de KPIs, <strong>plano de comunicação e treinamento de usuários</strong>, e planejamento de futuras melhorias. <strong>Valor:</strong> Garante a adoção, o sucesso a longo prazo e a evolução da plataforma como um ativo estratégico.</td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,314 @@
<#
.SYNOPSIS
Cria um novo usuário no Active Directory principal (Cliente) e habilita sua caixa de correio em um ambiente Exchange/AD secundário.
.DESCRIPTION
Este script foi desenvolvido como parte do projeto "Plataforma Unificada de Trabalho Digital".
Ele orquestra a criação de contas de usuário em dois ambientes Active Directory distintos,
suportando múltiplos métodos de entrada de dados e incluindo validações robustas para garantir a integridade dos dados e a conformidade com as políticas.
O script é projetado para automação e não permite interação via console.
.NOTES
Autor: Gemini (Especialista NGINX & Automação)
Data: 14 de outubro de 2025
Versão: 1.3 - Removida interatividade. O script agora falha imediatamente se executado sem parâmetros, exibindo apenas a ajuda.
Contexto: Projeto Plataforma Unificada de Trabalho Digital
#>
[CmdletBinding(DefaultParameterSetName = 'SingleUser')]
param(
# --- Parâmetros para criação de usuário único ---
[Parameter(Mandatory = $true, ParameterSetName = 'SingleUser', HelpMessage = 'Nome de logon (pré-Windows 2000)')]
[string]$SamAccountName,
[Parameter(Mandatory = $true, ParameterSetName = 'SingleUser', HelpMessage = 'Primeiro nome')]
[string]$GivenName,
[Parameter(Mandatory = $true, ParameterSetName = 'SingleUser', HelpMessage = 'Sobrenome')]
[string]$Surname,
[Parameter(Mandatory = $true, ParameterSetName = 'SingleUser', HelpMessage = 'Nome completo para exibição')]
[string]$Name,
[Parameter(Mandatory = $true, ParameterSetName = 'SingleUser', HelpMessage = 'UPN / Logon de e-mail')]
[string]$UserPrincipalName,
[Parameter(Mandatory = $true, ParameterSetName = 'SingleUser', HelpMessage = 'OU de destino. Ex: "OU=Usuarios,DC=cliente,DC=local"')]
[string]$Path,
# --- Parâmetros para importação em massa ---
[Parameter(Mandatory = $true, ParameterSetName = 'CsvImport', HelpMessage = 'Caminho do arquivo .CSV para importação')]
[string]$CsvPath,
[Parameter(Mandatory = $true, ParameterSetName = 'DbImport', HelpMessage = 'Indica que a fonte de dados é um banco de dados')]
[switch]$FromDatabase,
# --- Parâmetros de Conexão e Autenticação ---
[Parameter(Mandatory = $true, Position = 0, HelpMessage = 'IP ou FQDN do DC do cliente')]
[string]$ClientADServer,
[Parameter(Mandatory = $true, Position = 1, HelpMessage = 'Credencial para o AD do cliente')]
[pscredential]$ClientADCredential,
[Parameter(Mandatory = $true, Position = 2, HelpMessage = 'IP ou FQDN do DC do Exchange')]
[string]$ExchangeADServer,
[Parameter(Mandatory = $true, Position = 3, HelpMessage = 'Credencial para o AD do Exchange')]
[pscredential]$ExchangeADCredential,
# --- Parâmetros de Logging ---
[Parameter(Mandatory = $false, HelpMessage = 'String de conexão do banco de dados de log')]
[string]$DatabaseConnectionString,
[Parameter(Mandatory = $false, HelpMessage = 'Caminho do arquivo de texto para log de fallback')]
[string]$LogFilePath = ".\New-UnifiedADUser-Log-$(Get-Date -Format 'yyyy-MM-dd').txt"
)
# --- FUNÇÕES AUXILIARES ---
function Write-Log {
param(
[Parameter(Mandatory = $true)]
[string]$Message,
[Parameter(Mandatory = $true)]
[ValidateSet('INFO', 'WARN', 'ERROR')]
[string]$Level,
[Parameter(Mandatory = $false)]
[string]$TargetADServer
)
$logEntry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - [$Level] - $Message"
$scriptUser = $env:USERNAME
try {
if (-not [string]::IsNullOrEmpty($DatabaseConnectionString)) {
# [PLACEHOLDER] Lógica de log no banco de dados.
Write-Verbose "Log enviado para o banco de dados."
}
}
catch {
$dbErrorMessage = "Falha ao gravar no banco de dados: $($_.Exception.Message)"
"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - [ERROR] - $dbErrorMessage" | Out-File -FilePath $LogFilePath -Append
}
$logEntry | Out-File -FilePath $LogFilePath -Append
if (-not [string]::IsNullOrEmpty($TargetADServer)) {
try {
$eventMessage = "Script 'New-UnifiedADUser.ps1' executado por '$scriptUser'.`nDetalhes: $Message"
$eventLevel = switch ($Level) {
'INFO' { 'Information' }
'WARN' { 'Warning' }
'ERROR' { 'Error' }
}
Invoke-Command -ComputerName $TargetADServer -ScriptBlock {
param($eventMessage, $eventLevel)
$logSource = "Provisionamento de Usuários AD"
if (-not ([System.Diagnostics.EventLog]::SourceExists($logSource))) {
New-EventLog -LogName 'Application' -Source $logSource
}
Write-EventLog -LogName 'Application' -Source $logSource -EventId 1001 -EntryType $eventLevel -Message $eventMessage
} -ArgumentList $eventMessage, $eventLevel
Write-Verbose "Log de evento escrito em '$TargetADServer'."
}
catch {
$eventErrorMessage = "Falha ao escrever no Event Log de '$TargetADServer': $($_.Exception.Message)"
"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - [ERROR] - $eventErrorMessage" | Out-File -FilePath $LogFilePath -Append
}
}
}
function Show-Usage {
Write-Host @"
ERRO: O script foi chamado sem os parâmetros necessários ou com um método de entrada de dados inválido.
Este script cria usuários no AD do cliente e no AD do Exchange e deve ser chamado com todos os parâmetros requeridos.
MÉTODOS DE USO:
1. Criação de Usuário Único (parâmetros diretos):
Exemplo:
.\New-UnifiedADUser.ps1 -SamAccountName 'joao.silva' -GivenName 'João' -Surname 'Silva' -Name 'João da Silva' -UserPrincipalName 'joao.silva@cliente.com.br' -Path 'OU=Usuarios,DC=local' -ClientADServer '...' -ClientADCredential (Get-Credential) -ExchangeADServer '...' -ExchangeADCredential (Get-Credential)
2. Criação em Massa via CSV (usando o parâmetro -CsvPath):
Exemplo:
.\New-UnifiedADUser.ps1 -CsvPath 'C:\temp\usuarios.csv' -ClientADServer '...' -ClientADCredential (Get-Credential) -ExchangeADServer '...' -ExchangeADCredential (Get-Credential)
3. Criação via Banco de Dados (usando o parâmetro -FromDatabase):
(Funcionalidade a ser implementada)
Exemplo:
.\New-UnifiedADUser.ps1 -FromDatabase -ClientADServer '...' -ClientADCredential (Get-Credential) -ExchangeADServer '...' -ExchangeADCredential (Get-Credential)
"@
}
# --- LÓGICA PRINCIPAL ---
# --- VALIDAÇÃO: Garante que o script não seja executado de forma interativa ---
if ($PSBoundParameters.Count -eq 0) {
Show-Usage
exit 1 # Encerra o script imediatamente
}
# --- FIM DA VALIDAÇÃO ---
try {
Import-Module ActiveDirectory -ErrorAction Stop
}
catch {
Write-Log -Level 'ERROR' -Message "Falha ao importar o módulo ActiveDirectory. Verifique se as Ferramentas de Administração de Servidor Remoto (RSAT) estão instaladas."
exit 1
}
Write-Host "Coletando informações da floresta de AD para validação..."
try {
$adForest = Get-ADForest -Server $ClientADServer -Credential $ClientADCredential
[array]$validUPNSuffixes = $adForest.UPNSuffixes + $adForest.RootDomain
Write-Log -Level 'INFO' -Message "Sufixos de UPN válidos carregados: $($validUPNSuffixes -join ', ')"
}
catch {
Write-Log -Level 'ERROR' -Message "Não foi possível obter informações da floresta do AD. Verifique a conexão e as credenciais. Erro: $($_.Exception.Message)"
exit 1
}
$usersToProcess = @()
switch ($PSCmdlet.ParameterSetName) {
'SingleUser' {
$usersToProcess += [PSCustomObject]@{
SamAccountName = $SamAccountName
GivenName = $GivenName
Surname = $Surname
Name = $Name
UserPrincipalName = $UserPrincipalName
Path = $Path
}
break
}
'CsvImport' {
try {
$usersToProcess = Import-Csv -Path $CsvPath -ErrorAction Stop
Write-Log -Level 'INFO' -Message "Arquivo CSV '$CsvPath' carregado com $($usersToProcess.Count) registros."
}
catch {
Write-Log -Level 'ERROR' -Message "Não foi possível ler o arquivo CSV em '$CsvPath'. Erro: $($_.Exception.Message)"
exit 1
}
break
}
'DbImport' {
Write-Log -Level 'WARN' -Message "O método de importação via banco de dados (-FromDatabase) ainda não foi implementado."
exit 1
break
}
default {
Show-Usage
exit 1
}
}
foreach ($user in $usersToProcess) {
$u_sam = $user.SamAccountName
Write-Host "Iniciando processamento para o usuário: $u_sam"
Write-Log -Level 'INFO' -Message "Iniciando provisionamento para o usuário '$u_sam'."
# --- BLOCO DE VALIDAÇÕES ---
$validationFailed = $false
if ([string]::IsNullOrWhiteSpace($u_sam) -or [string]::IsNullOrWhiteSpace($user.UserPrincipalName) -or [string]::IsNullOrWhiteSpace($user.Path)) {
Write-Log -Level 'ERROR' -Message "USUÁRIO IGNORADO: Dados essenciais (SamAccountName, UserPrincipalName, Path) estão faltando para o usuário '$u_sam'."
$validationFailed = $true
}
if (-not $validationFailed) {
if ($u_sam.Length -gt 20) {
Write-Log -Level 'ERROR' -Message "USUÁRIO IGNORADO: O SamAccountName '$u_sam' excede o limite de 20 caracteres."
$validationFailed = $true
}
if (Get-ADUser -Filter "SamAccountName -eq '$u_sam'" -Server $ClientADServer -Credential $ClientADCredential) {
Write-Log -Level 'ERROR' -Message "USUÁRIO IGNORADO: O SamAccountName '$u_sam' já existe no Active Directory."
$validationFailed = $true
}
}
if (-not $validationFailed) {
if (-not (Get-ADOrganizationalUnit -Filter "DistinguishedName -eq '$($user.Path)'" -Server $ClientADServer -Credential $ClientADCredential)) {
Write-Log -Level 'ERROR' -Message "USUÁRIO IGNORADO: A OU '$($user.Path)' não foi encontrada no Active Directory."
$validationFailed = $true
}
}
if (-not $validationFailed) {
$upnSuffix = ($user.UserPrincipalName).Split('@')[1]
if ($upnSuffix -eq 'exch.local') {
Write-Log -Level 'ERROR' -Message "USUÁRIO IGNORADO: O UPN '$($user.UserPrincipalName)' usa o sufixo proibido 'exch.local'."
$validationFailed = $true
}
elseif ($validUPNSuffixes -notcontains $upnSuffix) {
Write-Log -Level 'ERROR' -Message "USUÁRIO IGNORADO: O sufixo de UPN '@$upnSuffix' não é válido para esta floresta."
$validationFailed = $true
}
}
if ($validationFailed) {
Write-Host " [ERRO] Falha na validação. Verifique o log para detalhes." -ForegroundColor Red
continue
}
# --- FIM DO BLOCO DE VALIDAÇÕES ---
$clientADSuccess = $false
try {
$tempPassword = -join ((65..90) + (97..122) + (48..57) | Get-Random -Count 16 | ForEach-Object { [char]$_ })
$securePassword = ConvertTo-SecureString $tempPassword -AsPlainText -Force
$userParams = @{
SamAccountName = $u_sam
GivenName = $user.GivenName
Surname = $user.Surname
Name = $user.Name
UserPrincipalName = $user.UserPrincipalName
Path = $user.Path
AccountPassword = $securePassword
Enabled = $true
ChangePasswordAtLogon = $true
Server = $ClientADServer
Credential = $ClientADCredential
}
Write-Log -Level 'INFO' -Message "Tentando criar a conta '$u_sam' no AD do Cliente em '$ClientADServer'." -TargetADServer $ClientADServer
New-ADUser @userParams -ErrorAction Stop
Write-Log -Level 'INFO' -Message "SUCESSO: Conta '$u_sam' criada no AD do Cliente. Senha temporária gerada." -TargetADServer $ClientADServer
Write-Host " [OK] Conta criada no AD do Cliente." -ForegroundColor Green
Write-Log -Level 'INFO' -Message "Senha temporária para '$u_sam': $tempPassword"
$clientADSuccess = $true
}
catch {
$errorMessage = "FALHA ao criar a conta '$u_sam' no AD do Cliente. Erro: $($_.Exception.Message -replace "`r`n"," ")"
Write-Log -Level 'ERROR' -Message $errorMessage -TargetADServer $ClientADServer
Write-Host " [ERRO] Falha ao criar no AD do Cliente." -ForegroundColor Red
continue
}
if ($clientADSuccess) {
try {
Start-Sleep -Seconds 5
Write-Log -Level 'INFO' -Message "Tentando habilitar a mailbox para '$u_sam' no AD do Exchange em '$ExchangeADServer'." -TargetADServer $ExchangeADServer
Enable-Mailbox -Identity $u_sam -DomainController $ExchangeADServer -Credential $ExchangeADCredential -ErrorAction Stop
Write-Log -Level 'INFO' -Message "SUCESSO: Mailbox para '$u_sam' habilitada no ambiente Exchange." -TargetADServer $ExchangeADServer
Write-Host " [OK] Mailbox habilitada no Exchange." -ForegroundColor Green
Write-Log -Level 'INFO' -Message "PROVISIONAMENTO COMPLETO para o usuário '$u_sam'."
}
catch {
$errorMessage = "FALHA PARCIAL: A conta '$u_sam' foi criada no AD do Cliente, mas falhou ao habilitar a mailbox no Exchange. Erro: $($_.Exception.Message -replace "`r`n"," ")"
Write-Log -Level 'ERROR' -Message $errorMessage -TargetADServer $ExchangeADServer
Write-Host " [ERRO] Falha ao habilitar a mailbox no Exchange." -ForegroundColor Red
}
}
}
Write-Host "Processamento concluído."