计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
ms365-tenant-manager【效率与协作】Administração de tenant Microsoft 365 para Administradores Globais. Automatize configuração de tenant M365, tarefas de administração do Office 365, gerenciamento de usuários Azure AD, configuração do Exchange Online, administração do Teams e políticas de segurança. Gere scripts PowerShell para operações em massa, políticas de Acesso Condicional, gere…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: "ms365-tenant-manager" description: Administração de tenant Microsoft 365 para Administradores Globais. Automatize configuração de tenant M365, tarefas de administração do Office 365, gerenciamento de usuários Azure AD, configuração do Exchange Online, administração do Teams e políticas de segurança. Gere scripts PowerShell para operações em massa, políticas de Acesso Condicional, gerenciamento de licenças e relatórios de conformidade. Use para gerenciamento de tenant M365, admin Office 365, usuários Azure AD, Administrador Global, configuração de tenant ou automação Microsoft 365. agents:
Orientação especializada e automação para Administradores Globais Microsoft 365 gerenciando configuração de tenant, ciclo de vida de usuários, políticas de segurança e otimização organizacional.
Connect-MgGraph -Scopes "Directory.Read.All","Policy.Read.All","AuditLog.Read.All"
Get-MgSubscribedSku | Select-Object SkuPartNumber, ConsumedUnits, @{N="Total";E={$_.PrepaidUnits.Enabled}}
Get-MgPolicyAuthorizationPolicy | Select-Object AllowInvitesFrom, DefaultUserRolePermissions
# Colunas CSV: DisplayName, UserPrincipalName, Department, LicenseSku
Import-Csv .\new_users.csv | ForEach-Object {
$passwordProfile = @{ Password = (New-Guid).ToString().Substring(0,16) + "!"; ForceChangePasswordNextSignIn = $true }
New-MgUser -DisplayName $_.DisplayName -UserPrincipalName $_.UserPrincipalName `
-Department $_.Department -AccountEnabled -PasswordProfile $passwordProfile
}
$adminRoles = (Get-MgDirectoryRole | Where-Object { $_.DisplayName -match "Admin" }).Id
$policy = @{
DisplayName = "Require MFA for Admins"
State = "enabledForReportingButNotEnforced" # Iniciar em modo de relatório apenas
Conditions = @{ Users = @{ IncludeRoles = $adminRoles } }
GrantControls = @{ Operator = "OR"; BuiltInControls = @("mfa") }
}
New-MgIdentityConditionalAccessPolicy -BodyParameter $policy
Passo 1: Gerar Lista de Verificação de Configuração
Confirmar pré-requisitos antes do provisionamento:
Passo 2: Configurar e Verificar Registros DNS
# Após adicionar o domínio no centro de administração M365, verifique a propagação antes de prosseguir
$domain = "company.com"
Resolve-DnsName -Name "_msdcs.$domain" -Type NS -ErrorAction SilentlyContinue
# Execute também a partir de um prompt de shell:
# nslookup -type=MX company.com
# nslookup -type=TXT company.com # confirmar registro SPF
Aguardar a propagação de DNS (até 48h) antes da criação de usuários em massa.
Passo 3: Aplicar Baseline de Segurança
# Desabilitar autenticação legada (bloqueia protocolos de Autenticação Básica)
$policy = @{
DisplayName = "Block Legacy Authentication"
State = "enabled"
Conditions = @{ ClientAppTypes = @("exchangeActiveSync","other") }
GrantControls = @{ Operator = "OR"; BuiltInControls = @("block") }
}
New-MgIdentityConditionalAccessPolicy -BodyParameter $policy
# Habilitar log de auditoria unificado
Set-AdminAuditLogConfig -UnifiedAuditLogIngestionEnabled $true
Passo 4: Provisionar Usuários
$licenseSku = (Get-MgSubscribedSku | Where-Object { $_.SkuPartNumber -eq "ENTERPRISEPACK" }).SkuId
Import-Csv .\employees.csv | ForEach-Object {
try {
$user = New-MgUser -DisplayName $_.DisplayName -UserPrincipalName $_.UserPrincipalName `
-AccountEnabled -PasswordProfile @{ Password = (New-Guid).ToString().Substring(0,12)+"!"; ForceChangePasswordNextSignIn = $true }
Set-MgUserLicense -UserId $user.Id -AddLicenses @(@{ SkuId = $licenseSku }) -RemoveLicenses @()
Write-Host "Provisionado: $($_.UserPrincipalName)"
} catch {
Write-Warning "Falhou $($_.UserPrincipalName): $_"
}
}
Validação: Verificar 3–5 contas no portal de administração M365; confirmar que as licenças mostram "Ativo."
Passo 1: Executar Auditoria de Segurança
Connect-MgGraph -Scopes "Directory.Read.All","Policy.Read.All","AuditLog.Read.All","Reports.Read.All"
# Exportar inventário de políticas de Acesso Condicional
Get-MgIdentityConditionalAccessPolicy | Select-Object DisplayName, State |
Export-Csv .\ca_policies.csv -NoTypeInformation
# Encontrar contas sem MFA registrado
$report = Get-MgReportAuthenticationMethodUserRegistrationDetail
$report | Where-Object { -not $_.IsMfaRegistered } |
Select-Object UserPrincipalName, IsMfaRegistered |
Export-Csv .\no_mfa_users.csv -NoTypeInformation
Write-Host "Auditoria concluída. Revise ca_policies.csv e no_mfa_users.csv."
Passo 2: Criar Política MFA (relatório apenas primeiro)
$policy = @{
DisplayName = "Require MFA All Users"
State = "enabledForReportingButNotEnforced"
Conditions = @{ Users = @{ IncludeUsers = @("All") } }
GrantControls = @{ Operator = "OR"; BuiltInControls = @("mfa") }
}
New-MgIdentityConditionalAccessPolicy -BodyParameter $policy
Validação: Após 48h, revise os logs de entrada no Entra ID; confirme que os usuários esperados seriam desafiados, então altere State para "enabled".
Passo 3: Revisar Secure Score
# Recuperar Secure Score atual e principais ações de melhoria
Get-MgSecuritySecureScore -Top 1 | Select-Object CurrentScore, MaxScore, ActiveUserCount
Get-MgSecuritySecureScoreControlProfile | Sort-Object -Property ActionType |
Select-Object Title, ImplementationStatus, MaxScore | Format-Table -AutoSize
Passo 1: Bloquear Login e Revogar Sessões
$upn = "departing.user@company.com"
$user = Get-MgUser -Filter "userPrincipalName eq '$upn'"
# Bloquear login imediatamente
Update-MgUser -UserId $user.Id -AccountEnabled:$false
# Revogar todos os tokens ativos
Invoke-MgInvalidateAllUserRefreshToken -UserId $user.Id
Write-Host "Login bloqueado e sessões revogadas para $upn"
Passo 2: Preview com -WhatIf (remoção de licença)
# Identificar licenças atribuídas
$licenses = (Get-MgUserLicenseDetail -UserId $user.Id).SkuId
# Execução simulada: imprimir o que seria removido
$licenses | ForEach-Object { Write-Host "[WhatIf] Would remove SKU: $_" }
Passo 3: Executar Desligamento
# Remover licenças
Set-MgUserLicense -UserId $user.Id -AddLicenses @() -RemoveLicenses $licenses
# Converter mailbox para compartilhado (requer módulo ExchangeOnlineManagement)
Set-Mailbox -Identity $upn -Type Shared
# Remover de todos os grupos
Get-MgUserMemberOf -UserId $user.Id | ForEach-Object {
try { Remove-MgGroupMemberByRef -GroupId $_.Id -DirectoryObjectId $user.Id } catch {}
}
Write-Host "Desligamento concluído para $upn"
Validação: Confirmar no portal de administração M365 que a conta mostra "Bloqueado", não tem licenças ativas e o tipo de mailbox é "Compartilhado."
Get-CredentialMicrosoft.Graph) ao legado MSOnlinetry/catch para tratamento de errosWrite-Host/Write-Warning para trilhas de auditoria-WhatIf ou saída de execução simulada antes de operações destrutivas em massareferences/powershell-templates.md
references/security-policies.md
references/troubleshooting.md
| Restrição | Impacto |
|---|---|
| Administrador Global necessário | A configuração completa do tenant requer o privilégio mais alto |
| Limites de taxa de API | Operações em massa podem sofrer throttling |
| Dependências de licença | E3/E5 necessário para recursos avançados |
| Cenários híbridos | AD on-premises requer configuração adicional |
| Pré-requisitos PowerShell | Módulo Microsoft.Graph necessário |
Install-Module Microsoft.Graph -Scope CurrentUser
Install-Module ExchangeOnlineManagement -Scope CurrentUser
Install-Module MicrosoftTeams -Scope CurrentUser