Ligar ao Microsoft 365 via PowerShell: Exchange, Teams e SharePoint

Administrar um tenant Microsoft 365 através do portal web é viável para tarefas pontuais, mas quando se gerem dezenas de caixas de correio, equipas Teams, sites SharePoint e OneDrives, a única forma eficiente de trabalhar é via PowerShell. Este guia mostra como instalar os módulos correctos, ligar a cada carga de trabalho (Exchange Online, Teams, SharePoint/OneDrive e Microsoft Graph), executar os comandos essenciais e desligar correctamente todas as sessões. Inclui ainda a configuração de autenticação moderna com App Registration e certificado — a abordagem recomendada pela Microsoft para scripts automatizados e service principals.

ℹ Nota: A Microsoft está a consolidar a administração no Microsoft Graph PowerShell (Connect-MgGraph). Os módulos específicos (ExchangeOnlineManagement, MicrosoftTeams) continuam suportados, mas para novas automatizações considere o Graph como primeira opção quando as APIs cobrirem as necessidades.

Neste artigo

Pré-requisitos e Instalação de Módulos

O PowerShell 7 (ou superior) é a base recomendada. Os módulos do Microsoft 365 foram actualizados para funcionar nativamente com PowerShell 7, embora alguns continuem compatíveis com Windows PowerShell 5.1. Para verificar a versão instalada:

$PSVersionTable.PSVersion

Instalar o PowerShell 7 no Windows:

winget install Microsoft.PowerShell

Os quatro módulos essenciais para administrar Microsoft 365 via PowerShell:

Módulo Carga de Trabalho Comando de Ligação
ExchangeOnlineManagement Exchange Online Connect-ExchangeOnline
MicrosoftTeams Microsoft Teams Connect-MicrosoftTeams
PnP.PowerShell SharePoint / OneDrive Connect-PnPOnline
Microsoft.Graph Microsoft Graph (todas) Connect-MgGraph

Instalação de todos os módulos de uma só vez:

# Definir repositório confiável
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted

# Instalar módulos (executar como administrador se necessário)
Install-Module -Name ExchangeOnlineManagement -Force -AllowClobber
Install-Module -Name MicrosoftTeams -Force -AllowClobber
Install-Module -Name PnP.PowerShell -Force -AllowClobber
Install-Module -Name Microsoft.Graph -Force -AllowClobber

# Verificar versões instaladas
Get-Module -ListAvailable ExchangeOnlineManagement, MicrosoftTeams, PnP.PowerShell, Microsoft.Graph | Select-Object Name, Version

⚠ Importante: O módulo Microsoft.Online.SharePoint.PowerShell (legado) foi amplamente substituído pelo PnP.PowerShell, que é mantido pela comunidade e pela Microsoft como a ferramenta recomendada. Se precisar do módulo legado para Get-SPOSite, instale-o com Install-Module -Name Microsoft.Online.SharePoint.PowerShell, mas prefira PnP para novas implementações.

Ligação ao Exchange Online

O módulo ExchangeOnlineManagement (EXO v3+) usa autenticação moderna por defeito e suporta MFA interativo. Para ligar:

Connect-ExchangeOnline

A autenticação abre uma janela de login no navegador (Browser SSO). Para ligar com uma conta específica:

Connect-ExchangeOnline -UserPrincipalName [email protected]

Comandos Essenciais do Exchange Online

Comando Descrição
Get-Mailbox Lista todas as caixas de correio do tenant
Get-MailboxPermission Mostra permissões delegadas numa caixa
Set-Mailbox Configura propriedades de uma caixa (quota, encaminhamento, etc.)
Get-DistributionGroup Lista grupos de distribuição
New-DistributionGroup Cria um novo grupo de distribuição
Get-MobileDevice Lista dispositivos móveis sincronizados (ActiveSync)
Get-MessageTrace Rastreia mensagens enviadas/recebidas nos últimos 10 dias

Exemplos práticos:

# Listar todas as caixas de correio com alias e tamanho
Get-Mailbox -ResultSize Unlimited | Select-Object DisplayName, PrimarySmtpAddress, Alias

# Ver permissões de uma caixa específica
Get-Mailbox -Identity "[email protected]" | Get-MailboxPermission | Where-Object {$_.User -notlike "NT AUTHORITY*"}

# Criar grupo de distribuição
New-DistributionGroup -Name "Equipa TI" -Alias "equipa-ti" -PrimarySmtpAddress "[email protected]"

# Rastrear mensagem nas últimas 24 horas
Get-MessageTrace -SenderAddress "[email protected]" -StartDate (Get-Date).AddDays(-1) -EndDate (Get-Date)

# Listar dispositivos móveis de um utilizador
Get-MobileDevice -Mailbox "[email protected]" | Select-Object DeviceType, DeviceModel, LastSuccessSync

Ligação ao Microsoft Teams

O módulo MicrosoftTeams (versão 4.x+) usa autenticação moderna e integra comandos de Teams e Skype for Business Online. Para ligar:

Connect-MicrosoftTeams

Para especificar a conta:

Connect-MicrosoftTeams -AccountId [email protected]

Comandos Essenciais do Microsoft Teams

Comando Descrição
Get-Team Lista todas as equipas do tenant
Get-TeamUser Lista membros de uma equipa
Add-TeamUser Adiciona utilizador a uma equipa
New-Team Cria uma nova equipa
Get-CsOnlineUser Dados de utilizadores com voz/Teams
Grant-CsTeamsPolicy Atribui políticas de Teams a um utilizador

Exemplos práticos:

# Listar todas as equipas
Get-Team | Select-Object DisplayName, GroupId, Visibility

# Ver membros de uma equipa (pelo GroupId)
Get-TeamUser -GroupId "12345678-1234-1234-1234-123456789abc"

# Criar nova equipa
New-Team -DisplayName "Projecto Alpha" -Visibility Private -Description "Equipa do projecto Alpha"

# Adicionar utilizador a uma equipa
Add-TeamUser -GroupId "12345678-1234-1234-1234-123456789abc" -User "[email protected]" -Role Member

# Atribuir política de reuniões a um utilizador
Grant-CsTeamsMeetingPolicy -Identity "[email protected]" -PolicyName "AllOn"

# Ver utilizadores com plano de voz
Get-CsOnlineUser -ResultSize Unlimited | Where-Object {$_.EnterpriseVoiceEnabled -eq $true} | Select-Object DisplayName, LineURI

Ligação ao SharePoint e OneDrive

O PnP.PowerShell é a ferramenta recomendada para administrar SharePoint Online e OneDrive. Suporta autenticação interativa e app-only (com certificado). Para ligar a um site específico:

# Ligação interativa (abre navegador)
Connect-PnPOnline -Url "https://dominio.sharepoint.com/sites/ProjectoAlpha" -Interactive

Para ligação com Service Principal (app-only) usando thumbprint de certificado:

Connect-PnPOnline -Url "https://dominio.sharepoint.com/sites/ProjectoAlpha" `
  -ClientId "12345678-1234-1234-1234-123456789abc" `
  -Tenant "dominio.onmicrosoft.com" `
  -Thumbprint "A1B2C3D4E5F6..." `
  -CertificateThumbprint "A1B2C3D4E5F6..."

Comandos Essenciais do SharePoint/OneDrive

Comando Descrição
Get-PnPSite Informação do site actual
Get-PnPList Lista todas as listas/bibliotecas do site
Get-PnPListItem Itens de uma lista específica
Get-PnPUser Utilizadores com acesso ao site
Get-PnPFile Descarrega um ficheiro da biblioteca
Get-SPOSite -IncludePersonalSite Lista sites OneDrive (módulo legado)

Exemplos práticos:

# Informação do site actual
Get-PnPSite | Select-Object Title, Url, Owner

# Listar bibliotecas de documentos
Get-PnPList | Where-Object {$_.BaseType -eq "DocumentLibrary"} | Select-Object Title, ItemCount

# Itens de uma lista
Get-PnPListItem -List "Documentos" | Select-Object Title, Created, Modified

# Utilizadores com acesso ao site
Get-PnPUser | Select-Object Title, Email, LoginName, IsSiteAdmin

# Descarregar um ficheiro
Get-PnPFile -Url "/sites/ProjectoAlpha/Documentos/relatorio.pdf" -Path "C:\Temp" -AsFile

# Listar todos os OneDrives do tenant (módulo legado Microsoft.Online.SharePoint.PowerShell)
Connect-SPOService -Url "https://dominio-admin.sharepoint.com"
Get-SPOSite -IncludePersonalSite $true -Limit All | Where-Object {$_.Url -like "*-my.sharepoint.com/personal/*"}

Ligação ao Microsoft Graph (Alternativa Moderna)

O Microsoft Graph PowerShell é a API unificada que cobre todas as cargas de trabalho do Microsoft 365. A Microsoft recomenda-o como primeira opção para novas automatizações. Para ligar interactivamente com âmbito de permissões específico:

# Ligação com permissões específicas (Scopes)
Connect-MgGraph -Scopes "User.Read.All", "Group.Read.All", "Sites.Read.All"

Para ligação com Service Principal via certificado:

Connect-MgGraph -ClientId "12345678-1234-1234-1234-123456789abc" `
  -TenantId "tenant-id-aqui" `
  -CertificateThumbprint "A1B2C3D4E5F6..."

Comandos Essenciais do Microsoft Graph

Comando Descrição
Get-MgUser Lista utilizadores do Entra ID (Azure AD)
Get-MgGroup Lista grupos do Entra ID
Get-MgSite Lista sites SharePoint via Graph
# Listar utilizadores
Get-MgUser -All | Select-Object DisplayName, UserPrincipalName, JobTitle

# Listar grupos
Get-MgGroup -All | Select-Object DisplayName, GroupType, MailEnabled

# Listar sites SharePoint
Get-MgSite -All | Select-Object DisplayName, WebUrl

ℹ Dica: Use Find-MgGraphCommand -Command Get-MgUser para descobrir quais as permissões (Scopes) necessárias para cada comando do Graph. Esta ferramenta é essencial para configurar App Registrations correctamente.

Desligar Todas as Sessões

Cada módulo mantém uma sessão autenticada que consome recursos. Desligar explicitamente evita fugas de tokens e limites de sessões concorrentes. Coloque este bloco no fim de cada script:

# Desligar todas as sessões activas
Disconnect-ExchangeOnline -Confirm:$false
Disconnect-MicrosoftTeams
Disconnect-PnPOnline
Disconnect-MgGraph

⚠ Importante: Não fechar a janela do PowerShell sem executar os comandos Disconnect-* pode deixar sessões órfãs no tenant. Com contas de serviço, isto pode esgotar o limite de sessões e bloquear ligações subsequentes.

Autenticação Moderna: App Registration e Service Principal

Para scripts automatizados, pipelines CI/CD e scheduled tasks, a Microsoft recomenda usar App Registration + Certificate em vez de credenciais de utilizador. As razões são três:

  • Sem MFA interativo: Scripts não podem responder a prompts MFA no navegador. Service Principals autenticam via certificado, sem intervenção humana.
  • Princípio do menor privilégio: Atribui-se apenas as permissões API necessárias à App, não as permissões completas de uma conta de administrador.
  • Auditoria e rastreabilidade: Acções executadas pela App aparecem nos logs com o ID da aplicação, permitindo distinguir scripts de acções manuais.

Criar App Registration no Entra ID

  1. No portal Entra ID (Azure AD) → App Registrations → New Registration
  2. Definir nome (ex: “M365-Admin-Script”) e seleccionar Single Tenant
  3. Anotar o Application (client) ID e o Tenant ID
  4. Em API Permissions, adicionar as permissões necessárias (ex: Microsoft Graph → Application permissions → User.Read.All, Mail.Read, Sites.ReadWrite.All)
  5. Em Certificates & Secrets, carregar um certificado X.509 (.cer para o portal, .pfx para o servidor onde o script corre)

Gerar Certificado Auto-Assinado

# Gerar certificado auto-assinado (PowerShell)
$cert = New-SelfSignedCertificate -Subject "CN=M365-Admin-Script" `
  -CertStoreLocation "Cert:\CurrentUser\My" `
  -KeyExportPolicy Exportable `
  -KeySpec Signature `
  -KeyLength 2048 `
  -KeyAlgorithm RSA `
  -HashAlgorithm SHA256 `
  -NotAfter (Get-Date).AddYears(1)

# Exportar .cer (para carregar no portal)
Export-Certificate -Cert $cert -FilePath "C:\Temp\M365-Admin-Script.cer"

# Exportar .pfx (para o servidor onde o script corre)
$pwd = ConvertTo-SecureString -String "MinhaSenhaForte" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath "C:\Temp\M365-Admin-Script.pfx" -Password $pwd

# Obter thumbprint
$cert.Thumbprint

Ligar com Service Principal

# Microsoft Graph com Service Principal
Connect-MgGraph -ClientId "app-id-aqui" `
  -TenantId "tenant-id-aqui" `
  -CertificateThumbprint "thumbprint-aqui"

# Exchange Online com Service Principal (EXO v3+)
Connect-ExchangeOnline -AppId "app-id-aqui" `
  -Organization "dominio.onmicrosoft.com" `
  -CertificateThumbprint "thumbprint-aqui"

# PnP PowerShell com Service Principal
Connect-PnPOnline -Url "https://dominio.sharepoint.com" `
  -ClientId "app-id-aqui" `
  -Tenant "dominio.onmicrosoft.com" `
  -Thumbprint "thumbprint-aqui"

⚠ Porquê não usar credenciais de utilizador: Autenticar com utilizador + palavra-passe em scripts expõe credenciais em texto, não suporta MFA, viola políticas de Conditional Access e deixa de ser suportado em muitos módulos. A Microsoft descontinuou a Basic Authentication no Exchange Online desde outubro de 2022 — ligações com -Credential já não funcionam.

Erros Comuns e Soluções

Problema Causa Solução
The term 'Connect-ExchangeOnline' is not recognized Módulo não instalado ou não importado Executar Install-Module ExchangeOnlineManagement; depois Import-Module ExchangeOnlineManagement
New-ExoPSSession: Aucun module Exchange... ou erro de MFA Versão do módulo desactualizada (EXO v1 não suporta MFA moderno) Actualizar: Update-Module ExchangeOnlineManagement; verificar versão ≥ 3.0
429 Too Many Requests ou throttling Rate limiting do serviço (demasiados comandos em pouco tempo) Adicionar Start-Sleep -Seconds 2 entre comandos em loops; usar -ResultSize paginado
Access Denied / Insufficient privileges Conta sem roles administrativas necessárias Atribuir roles no Entra ID (Exchange Admin, Teams Admin, SharePoint Admin) ou conceder permissões à App Registration
The remote name could not be resolved Problema de conectividade/DNS/proxy Verificar proxy corporativo; testar Resolve-DnsName outlook.office365.com; confirmar acesso às portas 443
AADSTS65001: The user or administrator has not consented to use the application App Registration sem consentimento de permissões No portal Entra ID → API Permissions → “Grant admin consent for [tenant]”
Certificate could not be found Certificado não instalado na store correcta Importar o .pfx para Cert:\LocalMachine\My (não CurrentUser); verificar thumbprint

Checklist de Configuração Inicial

Passos para ter um ambiente de administração Microsoft 365 via PowerShell completamente funcional e seguro:

  1. Instalar PowerShell 7winget install Microsoft.PowerShell ou descarregar de learn.microsoft.com
  2. Definir PSGallery como repositório confiávelSet-PSRepository -Name PSGallery -InstallationPolicy Trusted
  3. Instalar os quatro módulos — ExchangeOnlineManagement, MicrosoftTeams, PnP.PowerShell, Microsoft.Graph (com -Force -AllowClobber)
  4. Verificar versões instaladasGet-Module -ListAvailable e confirmar EXO ≥ 3.0, Teams ≥ 4.0, PnP ≥ 1.12
  5. Criar App Registration no Entra ID — para scripts automatizados; anotar Client ID e Tenant ID
  6. Gerar e carregar certificadoNew-SelfSignedCertificate, exportar .cer para o portal, .pfx para o servidor
  7. Atribuir permissões API — Microsoft Graph Application permissions conforme necessário; conceder admin consent
  8. Atribuir roles administrativas — Exchange Admin, Teams Admin, SharePoint Admin à conta ou App
  9. Testar ligação a cada carga de trabalhoConnect-ExchangeOnline, Connect-MicrosoftTeams, Connect-PnPOnline, Connect-MgGraph
  10. Testar comando básico em cada sessãoGet-Mailbox, Get-Team, Get-PnPSite, Get-MgUser
  11. Validar comandos Disconnect — confirmar que Disconnect-ExchangeOnline, Disconnect-MicrosoftTeams, Disconnect-PnPOnline, Disconnect-MgGraph executam sem erro
  12. Documentar Client ID, Tenant ID e thumbprint — guardar em cofre de palavras-passe (não em ficheiros de texto no repositório)

Artigos Relacionados

Referências oficiais: Connect to Exchange Online PowerShell, Teams PowerShell Overview, PnP PowerShell Documentation, Microsoft Graph PowerShell Overview.