Recebeu uma lista de App IDs (GUIDs) e precisa descobrir o nome das aplicações no Microsoft Entra (antigo Azure AD)? Este guia prático mostra como resolver pelo portal, PowerShell, Azure CLI e Graph — inclusive em lote e com boas práticas de governança.
Visão geral
Em ambientes Microsoft Entra (Azure AD), App ID (também chamado de Application (client) ID) é o identificador global de uma aplicação. A partir dele é possível localizar:
- Enterprise applications: instâncias de service principal existentes no seu locatário (tenant) — o que efetivamente aparece nas permissões e acessos.
- App registrations: os registos/registros de aplicação do lado do desenvolvimento/proprietário do app no seu tenant.
Para descobrir o Display name (nome amigável) a partir de um App ID, pesquise em ambos os lugares: primeiro em Enterprise applications; se não existir, verifique App registrations. A seguir, veja os caminhos do mais simples ao automatizado, além de dicas para listas grandes.
Contexto rápido: App ID vs. Object ID
Conceito | Onde aparece | Escopo | Uso típico |
---|---|---|---|
App ID (Application/Client ID) | Applications e Service Principals | Global (mesmo GUID em todos os tenants) | Identificar a aplicação em qualquer locatário |
Object ID | Instância no diretório | Por tenant (muda de um locatário para outro) | Endereçar objetos específicos no seu tenant |
Resumo: você recebeu App IDs — portanto, busque por appId
na API/portal. Se o app ainda não foi consentido no seu tenant, haverá App registration (caso você seja o proprietário) mas não haverá service principal.
Pelo portal (rápido e sem scripts)
- Acesse o Microsoft Entra admin center.
- Vá a Enterprise applications → All applications.
- No painel de filtros/colunas, exiba a coluna “Application ID” e pesquise o GUID recebido.
- Quando encontrar, anote Display name (nome da aplicação) e, se necessário, o Object ID do service principal.
- Não achou? Vá a App registrations → All applications e pesquise pelo Application (client) ID.
Permissões/Roles úteis (apenas leitura): Cloud Application Administrator, Application Administrator ou Global Reader normalmente bastam para consulta.
PowerShell (Microsoft Graph) — recomendado para automação
Importante: o módulo AzureAD
clássico foi descontinuado; use Microsoft.Graph
. Abaixo, o fluxo mínimo para uma consulta única e, depois, um script completo para listas.
Consulta pontual por App ID
# 1) Instalar e conectar (delegado; requer consentimento admin para leitura de diretório)
Install-Module Microsoft.Graph -Scope CurrentUser
Connect-MgGraph -Scopes "Application.Read.All","Directory.Read.All"
2) Consultar por App ID (procura no seu tenant)
Get-MgServicePrincipal -Filter "appId eq 'GUID-AQUI'" | Select DisplayName, AppId, Id
Get-MgApplication -Filter "appId eq 'GUID-AQUI'" | Select DisplayName, AppId, Id </code></pre>
<ul>
<li><code>Get-MgServicePrincipal</code>: encontra a <em>instância</em> no seu tenant (Enterprise application).</li>
<li><code>Get-MgApplication</code>: encontra o <em>registo</em> de aplicação (App registration) no seu tenant.</li>
</ul>
<h3>Script pronto para várias entradas (lista de GUIDs)</h3>
<p>Este script aceita uma lista de App IDs, resolve cada um e indica onde foi encontrado. Ideal para inventários, auditorias e investigações de segurança.</p>
<pre><code class="language-powershell"># Requer: Microsoft.Graph + consentimento a "Application.Read.All" e "Directory.Read.All"
$ids = @(
'f8d98a96-0999-43f5-8af3-69971c7bb423',
'5d661950-3475-41cd-a2c3-d671a3162bc1',
'6326e366-9d6d-4c70-b22a-34c7ea72d73d',
'9fd38622-d9b4-4401-b1b9-1ce14c5e435a',
'8acd33ea-7197-4a96-bc33-d7cc7101262f',
'00b263e4-3497-4650-b082-3197cfdfdd7c',
'7fba38f4-ec1f-458d-906c-f4e3c4f41335',
'd34dcd43-8519-44e4-827c-de79b767da47',
'464e0e4d-676a-4c3b-9f81-2ed9b2a9acd2',
'19a16049-c5e2-41d0-aab4-a9b5956106cc',
'82d8ab62-be52-a567-14ea-1616c4ee06c4'
)
Install-Module Microsoft.Graph -Scope CurrentUser -Force
Connect-MgGraph -Scopes "Application.Read.All","Directory.Read.All"
\$results = foreach (\$id in \$ids) {```
# Validação leve do formato GUID (evita chamadas desnecessárias)
if ($id -notmatch '^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$') {
[PSCustomObject]@{
AppId = $id
Nome = 'Formato inválido (não é GUID)'
Tipo = '-'
ObjectId = '-'
}
continue
}
# Tenta localizar a instância (service principal) no tenant
$sp = $null
try { $sp = Get-MgServicePrincipal -Filter "appId eq '$id'" -ErrorAction Stop } catch {}
if ($sp) {
[PSCustomObject]@{
AppId = $id
Nome = $sp.DisplayName
Tipo = 'Enterprise application (Service Principal)'
ObjectId = $sp.Id
}
continue
}
# Tenta localizar o registo (app registration) no tenant
$app = $null
try { $app = Get-MgApplication -Filter "appId eq '$id'" -ErrorAction Stop } catch {}
if ($app) {
[PSCustomObject]@{
AppId = $id
Nome = $app.DisplayName
Tipo = 'App registration'
ObjectId = $app.Id
}
}
else {
[PSCustomObject]@{
AppId = $id
Nome = 'Não encontrado no tenant'
Tipo = '-'
ObjectId = '-'
}
}
```
}
\$results | Format-Table -AutoSize
Opcional: exportar para planilha
\$results | Export-Csv -NoTypeInformation -Path ".\appids\_resolvidos.csv" -Encoding UTF8
</code></pre>
<h3>Variações úteis</h3>
<ul>
<li><strong>Ler de arquivo</strong>:
<pre><code class="language-powershell">$ids = Get-Content ".\appids.txt" # um GUID por linha
ou CSV com cabeçalho AppId
(Import-Csv ".\entrada.csv").AppId
Saída para Excel/BI:
$results | Export-Csv ".\appids.csv" -NoTypeInformation -Encoding UTF8
PowerShell 7 — paralelo (grandes listas):
$ids | ForEach-Object -Parallel {
param($id)
# ... a mesma lógica interna (necessário passar o token Connect-MgGraph via contexto)
} -ThrottleLimit 8
Dica: em execuções paralelas, cuide de limites de taxa (429). Insira Start-Sleep
exponencial no tratamento de exceções.
App-only (sem usuário interativo): autentique com certificado/segredo e conceda permissões Application equivalentes (Application.Read.All
, Directory.Read.All
). Em seguida, Connect-MgGraph
com os parâmetros de app.
Azure CLI (alternativa rápida em linha de comando)
# Autenticar
az login
Procurar a instância (Enterprise application / service principal)
az ad sp show --id \<APP\_ID> --query "{displayName\:displayName, appId\:appId, objectId\:id}"
Procurar o registo (App registration) se existir no seu tenant
az ad app show --id \<APP\_ID> --query "{displayName\:displayName, appId\:appId, objectId\:id}"
Formatos de saída úteis
-o tsv / -o table / -o json
Nota: os comandos az ad
consultam o Microsoft Graph por trás. Garanta que sua sessão possui perfil/tenant corretos (az account show
/ az account set
).
API/Graph Explorer (sem instalar nada)
Para quem prefere a própria API, consulte com filtros diretos por appId
:
GET /servicePrincipals?$filter=appId eq 'GUID-AQUI'
GET /applications?$filter=appId eq 'GUID-AQUI'
Se houver resultado, o campo displayName
é o nome da aplicação. Otimize retornos usando $select=displayName,appId,id
quando necessário.
Procedimento de decisão (passo a passo)
- Confirme que o valor recebido é um GUID válido (formato 8-4-4-4-12).
- Pesquise primeiro em Enterprise applications (service principal) usando o App ID.
- Se não existir, pesquise em App registrations (pode existir o registo do app sem instância).
- Se ainda não aparecer, avalie:
- App multitenant ainda não consentido no seu tenant (não haverá service principal).
- Confusão entre App ID (global) e Object ID (por tenant).
- ID fora do seu escopo (por exemplo, de outro diretório/ambiente).
Quadro-resumo: onde buscar e com quais comandos
Alvo | Portal | PowerShell | Azure CLI | API Graph |
---|---|---|---|---|
Enterprise application (Service Principal) | Enterprise applications → All applications (filtrar por Application ID) | Get-MgServicePrincipal -Filter "appId eq 'GUID'" | az ad sp show --id <GUID> | GET /servicePrincipals?$filter=appId eq 'GUID' |
App registration | App registrations → All applications (filtrar por Application (client) ID) | Get-MgApplication -Filter "appId eq 'GUID'" | az ad app show --id <GUID> | GET /applications?$filter=appId eq 'GUID' |
Boas práticas e governança
- Menor privilégio: para leitura, prefira funções como Global Reader e delegue apenas o necessário (
Application.Read.All
,Directory.Read.All
). - Inventário contínuo: mantenha uma planilha/CMDB com Display name, App ID, tipo (SP ou App), proprietário e data de criação.
- Padronize nomes: use convenções claras no Display name (ex.: prefixo do domínio, ambiente, área de negócio).
- Auditoria: correlacione App IDs com logs de sign-in e concessões de consentimento para entender uso e riscos.
- Revisões periódicas: elimine service principals órfãos e app registrations obsoletos.
Diagnóstico: por que “não encontrei”?
- É mesmo App ID? Alguns times enviam o Object ID por engano. O App ID é compartilhado entre tenants; o Object ID muda de tenant para tenant.
- App multitenant sem consentimento: não haverá service principal até que alguém faça consentimento (admin ou usuário, conforme política).
- Outro tenant: o GUID pode pertencer a um diretório onde você não tem acesso (parceiros/fornecedores).
- Exclusão/soft-delete: apps removidos podem demorar para desaparecer ou podem não aparecer em listagens padrão.
- Erro de digitação: hífens faltando, letras fora de ordem, ou espaços extras.
Tabela de erros frequentes e correções
Sintoma | Causa provável | Como resolver |
---|---|---|
Nenhum resultado em Service Principals | App sem consentimento no tenant | Verifique App registrations; se for app de terceiro, aguarde/solicite consentimento quando apropriado |
Resultados duplicados | Múltiplas instâncias (cenários B2C/organizações múltiplas) | Confirme Object ID, proprietários e ambientes; remova duplicatas indesejadas |
“Access Denied” ao usar Graph | Permissões faltando | Solicite consentimento admin para Application.Read.All e Directory.Read.All |
HTTP 429 (limite de taxa) | Muitas consultas em curto intervalo | Implemente backoff exponencial e $select minimalista |
App ID válido, mas nome pouco informativo | Padrão de nomenclatura ruim | Adote convenções de nome (ex.: <Org>-<Sistema>-<Ambiente>) |
Dicas avançadas para listas grandes
- Retorne apenas o necessário: use
-Property
no PowerShell ou$select=displayName,appId,id
na API para reduzir payload. - Controle de fluxo: introduza
Start-Sleep
em lotes (ex.: a cada 100 GUIDs, pausar 2–3 s) para evitar restrições. - Normalização: converta GUIDs para minúsculas e remova espaços antes de consultar.
- Rastreabilidade: exporte CSV com carimbo de data e inclua colunas “Fonte” (SP/App), “Encontrado” (Sim/Não) e “Observações”.
Exemplos práticos
Validar rapidamente se um valor é GUID
$isGuid = 'f8d98a96-0999-43f5-8af3-69971c7bb423' -match '^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$'
Produzir um relatório amigável
$report = $results | Select-Object @{
Name='AppId';Expression={$_.AppId}
}, @{
Name='Nome';Expression={$_.Nome}
}, @{
Name='Tipo';Expression={$_.Tipo}
}, @{
Name='ObjectId';Expression={$_.ObjectId}
}
$report | Export-Csv ".\relatorio_appids.csv" -NoTypeInformation -Encoding UTF8
Combinar com “último uso” (quando aplicável)
Para priorizar saneamento, cruze a lista de App IDs com logs de uso/consentimento internos e sinalize apps inativos. Isso ajuda a identificar service principals sem uso atual.
Perguntas frequentes (FAQ)
App ID é sensível a maiúsculas/minúsculas? Não — é um GUID, e a comparação prática não diferencia caso.
Posso buscar por displayName ao invés de App ID? Sim, mas nomes podem repetir; o App ID é inequívoco. Para busca textual, use parâmetros de pesquisa e, na API, o cabeçalho de consistência quando usar $search
.
“App ID URI” é a mesma coisa que “Application (client) ID”? Não. O App ID URI identifica recursos (ex.: api://…
) para escopos de API, não é o GUID do cliente.
Por que a aplicação existe em App registrations, mas não em Enterprise applications? O registo representa o modelo do app. O service principal só é criado quando há consentimento/instanciação no tenant.
Posso usar contas sem privilégios elevados? Para leitura simples no portal, Global Reader costuma bastar. Para Graph, as permissões delegadas listadas exigem consentimento administrativo.
Checklist para produção
- ✔ Validou que os valores são GUIDs (App IDs) e não Object IDs?
- ✔ Pesquisou primeiro em Enterprise applications e depois em App registrations?
- ✔ Registrou Display name, App ID, Object ID e tipo (SP/App)?
- ✔ Exportou CSV e anexou à sua base de inventário (CMDB/ITAM)?
- ✔ Revisou permissões e proprietário do app (governança)?
Conclusão
Para identificar o Display name a partir de um App ID no Microsoft Entra, o fluxo mais eficiente é: procurar no portal (Enterprise applications → App registrations) e, para escala, automatizar com Microsoft Graph via PowerShell ou Azure CLI. Seguindo as rotas e scripts acima, você resolve listas inteiras de GUIDs com precisão, mantendo governança e trilhas de auditoria.
Referência rápida (comandos)
# PowerShell (Microsoft.Graph)
Connect-MgGraph -Scopes "Application.Read.All","Directory.Read.All"
Get-MgServicePrincipal -Filter "appId eq 'GUID'"
Get-MgApplication -Filter "appId eq 'GUID'"
# Azure CLI
az ad sp show --id <GUID> --query "{displayName:displayName,appId:appId,objectId:id}"
az ad app show --id <GUID> --query "{displayName:displayName,appId:appId,objectId:id}"
# API / Graph Explorer
GET /servicePrincipals?$filter=appId eq 'GUID'
GET /applications?$filter=appId eq 'GUID'
Apêndice: script completo (robusto) com tratamento básico de erros
# Instalação e conexão
Install-Module Microsoft.Graph -Scope CurrentUser -Force
Connect-MgGraph -Scopes "Application.Read.All","Directory.Read.All"
Carregar GUIDs de arquivo (um por linha)
\$ids = Get-Content ".\appids.txt" | Where-Object { $\_ -and \$.Trim() -ne "" } | ForEach-Object { \$.Trim() }
Função auxiliar para consulta com retry simples
function Get-AppById {
param(\[string]\$AppId)
\$maxRetries = 3
\$delay = 2
for (\$i=0; \$i -lt \$maxRetries; \$i++) {
try {
\$sp = Get-MgServicePrincipal -Filter "appId eq '\$AppId'" -ErrorAction Stop
if (\$sp) { return @{ Tipo='SP'; Objeto=\$sp } }```
$app = Get-MgApplication -Filter "appId eq '$AppId'" -ErrorAction Stop
if ($app) { return @{ Tipo='APP'; Objeto=$app } }
return $null
}
catch {
if ($_.Exception.Message -match 'Status: 429|Status: 5\d\d') {
Start-Sleep -Seconds $delay
$delay = [Math]::Min($delay*2, 15)
continue
}
throw
}
}
return $null
```
}
\$rows = foreach (\$id in \$ids) {
if (\$id -notmatch '^\[0-9a-fA-F]{8}-(\[0-9a-fA-F]{4}-){3}\[0-9a-fA-F]{12}\$') {
\[PSCustomObject]@{ AppId=\$id; Nome='Formato inválido'; Tipo='-'; ObjectId='-' }
continue
}
\$res = Get-AppById -AppId \$id
if (\$res -and \$res.Tipo -eq 'SP') {
\[PSCustomObject]@{ AppId=\$id; Nome=\$res.Objeto.DisplayName; Tipo='Enterprise application (Service Principal)'; ObjectId=\$res.Objeto.Id }
}
elseif (\$res -and \$res.Tipo -eq 'APP') {
\[PSCustomObject]@{ AppId=\$id; Nome=\$res.Objeto.DisplayName; Tipo='App registration'; ObjectId=\$res.Objeto.Id }
}
else {
\[PSCustomObject]@{ AppId=\$id; Nome='Não encontrado no tenant'; Tipo='-'; ObjectId='-' }
}
}
\$rows | Tee-Object -Variable Results | Format-Table -AutoSize
\$Results | Export-Csv ".\appids\_resolvidos.csv" -NoTypeInformation -Encoding UTF8
Em resumo: procure primeiro em Enterprise applications pelo App ID; se não existir, verifique App registrations; e para grandes volumes, use Microsoft Graph (PowerShell/CLI/API) para resolver listas inteiras de GUIDs com segurança e agilidade.