PowerShell para Entra ID (Azure AD) — automações úteis para identidade e licenças
Índice
1) Conectar ao Entra ID
Use o módulo Microsoft.Graph (recomendado). Instale e conecte:
# Instalar módulos principais
Install-Module Microsoft.Graph -Scope CurrentUser -Repository PSGallery -Force
# Conectar interativamente (consentimento só na 1ª vez)
Connect-MgGraph -Scopes "User.ReadWrite.All","Group.ReadWrite.All","Directory.Read.All","AuditLog.Read.All" -NoWelcome
Select-MgProfile -Name "beta" # opcional: recursos em preview
# Ver conta atual
gm account
(Get-MgContext).Account
2) Usuários — criar, atualizar, redefinir senha
# Criar usuário básico
$newUser = New-MgUser -AccountEnabled:$true -DisplayName "João Silva" -MailNickname "joaos" -UserPrincipalName "joaos@contoso.com" -PasswordProfile @{ Password = "P@ssw0rd!" }
# Atualizar atributos (cargo/telefone)
Update-MgUser -UserId $newUser.Id -JobTitle "Analista" -MobilePhone "+55 11 90000-0000"
# Forçar redefinição de senha no próximo logon
Update-MgUser -UserId $newUser.Id -PasswordProfile @{ ForceChangePasswordNextSignIn = $true }
# Listar usuários com filtro
Get-MgUser -Filter "startsWith(displayName,'João')" -All | Select-Object Id, DisplayName, UserPrincipalName
3) Grupos — membros e regra dinâmica
# Criar grupo de segurança
$grp = New-MgGroup -DisplayName "GRP-Financeiro" -MailEnabled:$false -MailNickname "grp-fin" -SecurityEnabled:$true
# Adicionar membros
Add-MgGroupMemberByRef -GroupId $grp.Id -OdataId "/users/$($newUser.Id)"
# Criar grupo dinâmico por atributo (ex.: department)
$rule = "(user.department -eq \"Finance\")"
$dyn = New-MgGroup -DisplayName "GRP-DYN-Finance" -MailEnabled:$false -MailNickname "grp-dyn-fin" -SecurityEnabled:$true -GroupTypes "DynamicMembership" -MembershipRule $rule -MembershipRuleProcessingState "On"
4) Licenças — atribuição em massa
# Obter SKUs disponíveis
gskus = Get-MgSubscribedSku | Select-Object SkuId, SkuPartNumber
# Ex.: atribuir Microsoft 365 E3 (substitua o SkuId correto)
$skuId = (Get-MgSubscribedSku | Where-Object SkuPartNumber -eq "ENTERPRISEPACK").SkuId
# Atribuir para todos de um grupo
groupId = $grp.Id
Get-MgGroupMember -GroupId $groupId -All | ForEach-Object {
Set-MgUserLicense -UserId $_.Id -AddLicenses @{SkuId=$skuId} -RemoveLicenses @()
}
5) Relatórios CSV — inventário e sign-ins
# Exportar inventário de usuários com status de licença
$users = Get-MgUser -All -Property Id,DisplayName,UserPrincipalName,AssignedLicenses
$users | Select-Object DisplayName,UserPrincipalName,@{N='SkuCount';E={$_.AssignedLicenses.Count}} | Export-Csv users-licenses.csv -NoTypeInformation -Encoding UTF8
# Baixar logs de sign-in (precisa AuditLog.Read.All)
$since = (Get-Date).AddDays(-7).ToString('o')
Get-MgAuditLogSignIn -All -Filter "createdDateTime ge $since" | \
Select-Object userDisplayName,userPrincipalName,appDisplayName,ipAddress,status | \
Export-Csv signins-last7d.csv -NoTypeInformation -Encoding UTF8
6) Filtros — regras dinâmicas úteis
// Somente usuários habilitados
authenticationStatus -eq "enabled"
// iOS corporativos (para filtros do Intune)
(device.deviceOSType -eq "iOS") and (device.deviceOwnership -eq "Company")
// Atribuir por domínio
(user.userPrincipalName -contains "@contoso.com")
7) Dicas e boas práticas
- Prefira Microsoft.Graph em vez dos cmdlets legados de AzureAD.
- Use Scopes mínimos ao conectar (princípio de menor privilégio).
- Automatize com runbooks no Azure Automation + Managed Identity para rotinas (ex.: revisão de licenças).
- Versione scripts e use CI (GitHub Actions/Azure DevOps) para testes básicos (PSScriptAnalyzer).
