Identificar Display Name pelo App ID (Microsoft Entra/Azure AD): portal, PowerShell, CLI e Graph

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.

Índice

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

ConceitoOnde apareceEscopoUso típico
App ID (Application/Client ID)Applications e Service PrincipalsGlobal (mesmo GUID em todos os tenants)Identificar a aplicação em qualquer locatário
Object IDInstância no diretórioPor 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)

  1. Acesse o Microsoft Entra admin center.
  2. Vá a Enterprise applicationsAll applications.
  3. No painel de filtros/colunas, exiba a coluna “Application ID” e pesquise o GUID recebido.
  4. Quando encontrar, anote Display name (nome da aplicação) e, se necessário, o Object ID do service principal.
  5. Não achou? Vá a App registrationsAll 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)

  1. Confirme que o valor recebido é um GUID válido (formato 8-4-4-4-12).
  2. Pesquise primeiro em Enterprise applications (service principal) usando o App ID.
  3. Se não existir, pesquise em App registrations (pode existir o registo do app sem instância).
  4. 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

AlvoPortalPowerShellAzure CLIAPI 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 registrationApp 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

SintomaCausa provávelComo resolver
Nenhum resultado em Service PrincipalsApp sem consentimento no tenantVerifique App registrations; se for app de terceiro, aguarde/solicite consentimento quando apropriado
Resultados duplicadosMúltiplas instâncias (cenários B2C/organizações múltiplas)Confirme Object ID, proprietários e ambientes; remova duplicatas indesejadas
“Access Denied” ao usar GraphPermissões faltandoSolicite consentimento admin para Application.Read.All e Directory.Read.All
HTTP 429 (limite de taxa)Muitas consultas em curto intervaloImplemente backoff exponencial e $select minimalista
App ID válido, mas nome pouco informativoPadrão de nomenclatura ruimAdote 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 &lt;GUID&gt; --query "{displayName:displayName,appId:appId,objectId:id}"
az ad app show --id &lt;GUID&gt; --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.

Índice