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
- Ligação ao Exchange Online
- Ligação ao Microsoft Teams
- Ligação ao SharePoint e OneDrive
- Ligação ao Microsoft Graph (Alternativa Moderna)
- Desligar Todas as Sessões
- Autenticação Moderna: App Registration e Service Principal
- Erros Comuns e Soluções
- Checklist de Configuração Inicial
- Artigos Relacionados
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
- No portal Entra ID (Azure AD) → App Registrations → New Registration
- Definir nome (ex: “M365-Admin-Script”) e seleccionar Single Tenant
- Anotar o Application (client) ID e o Tenant ID
- Em API Permissions, adicionar as permissões necessárias (ex: Microsoft Graph → Application permissions → User.Read.All, Mail.Read, Sites.ReadWrite.All)
- 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:
- Instalar PowerShell 7 —
winget install Microsoft.PowerShellou descarregar de learn.microsoft.com - Definir PSGallery como repositório confiável —
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted - Instalar os quatro módulos — ExchangeOnlineManagement, MicrosoftTeams, PnP.PowerShell, Microsoft.Graph (com
-Force -AllowClobber) - Verificar versões instaladas —
Get-Module -ListAvailablee confirmar EXO ≥ 3.0, Teams ≥ 4.0, PnP ≥ 1.12 - Criar App Registration no Entra ID — para scripts automatizados; anotar Client ID e Tenant ID
- Gerar e carregar certificado —
New-SelfSignedCertificate, exportar .cer para o portal, .pfx para o servidor - Atribuir permissões API — Microsoft Graph Application permissions conforme necessário; conceder admin consent
- Atribuir roles administrativas — Exchange Admin, Teams Admin, SharePoint Admin à conta ou App
- Testar ligação a cada carga de trabalho —
Connect-ExchangeOnline,Connect-MicrosoftTeams,Connect-PnPOnline,Connect-MgGraph - Testar comando básico em cada sessão —
Get-Mailbox,Get-Team,Get-PnPSite,Get-MgUser - Validar comandos Disconnect — confirmar que
Disconnect-ExchangeOnline,Disconnect-MicrosoftTeams,Disconnect-PnPOnline,Disconnect-MgGraphexecutam sem erro - Documentar Client ID, Tenant ID e thumbprint — guardar em cofre de palavras-passe (não em ficheiros de texto no repositório)
Artigos Relacionados
- SharePoint Online e Microsoft Teams para Administradores em 2026: Guia PME
- Instalar e Utilizar o OpenSSH no Windows 10
- Definir Palavra-passe Segura
- Copilot Cowork GA: Modelos, Plugins e Tarefas Automatizadas
Referências oficiais: Connect to Exchange Online PowerShell, Teams PowerShell Overview, PnP PowerShell Documentation, Microsoft Graph PowerShell Overview.