Esercitazione: Report personalizzati in Azure Data Explorer usando i dati di Microsoft Entra ID
Questa esercitazione illustra come creare report personalizzati in azure Data Explorer (ADX) usando i dati di Microsoft Entra ID e i servizi di governance di Microsoft Entra ID. Questa guida integra altre opzioni di creazione di rapporti, ad esempio il archivio & rapporti con Monitoraggio di Azure e la gestione dei diritti, che si concentra sull'esportazione del registro di controllo in Monitoraggio di Azure per la conservazione e l'analisi. Per confronto, l'esportazione dei dati di Microsoft Entra ID in Esplora dati di Azure offre flessibilità per la creazione di report personalizzati sugli oggetti Microsoft Entra, inclusi gli oggetti cronologici ed eliminati. Inoltre, l'uso di Esplora dati di Azure consente l'aggregazione dei dati da origini aggiuntive, con scalabilità elevata, schema flessibile e criteri di conservazione. Esplora dati di Azure è particolarmente utile quando è necessario conservare i dati di accesso per anni, eseguire indagini ad hoc o eseguire query personalizzate sui dati di accesso utente.
Questo articolo illustra come mostrare la configurazione, gli utenti e i diritti di accesso esportati da Microsoft Entra insieme ai dati esportati da altre origini, ad esempio le applicazioni con diritti di accesso nei propri database SQL. È quindi possibile usare il linguaggio di query Kusto (KQL) in Esplora dati di Azure per creare report personalizzati in base ai requisiti dell'organizzazione.
Per creare questi report, seguire questa procedura:
- Configurare Azure Data Explorer in una sottoscrizione di Azure, oppure creare un cluster gratuito.
- Estrarre dati da Microsoft Entra usando script di PowerShell e Microsoft Graph.
- Importare i dati in Azure Esplora dati, un servizio di analisi dei dati veloce e scalabile.
- Creare una query personalizzata usando Linguaggio di query Kusto.
Al termine di questa esercitazione, sarà possibile sviluppare visualizzazioni personalizzate dei diritti di accesso e delle autorizzazioni degli utenti. Queste visualizzazioni si estendono su applicazioni diverse usando gli strumenti supportati da Microsoft. È anche possibile inserire dati da database o applicazioni di terze parti per segnalare tali dati.
Prerequisiti
Se non si ha familiarità con Esplora dati di Azure e si vuole apprendere gli scenari illustrati in questo articolo, è possibile ottenere un cluster di Esplora dati di Azure gratuito . Per l'uso in produzione supportato con un contratto di servizio per Esplora dati di Azure, è necessario un abbonamento Azure per ospitare un cluster completo di Esplora dati di Azure.
Determinare i dati da includere nei report. Gli script di questo articolo forniscono esempi con dati specifici di utenti, gruppi e applicazioni di Microsoft Entra. Questi esempi sono destinati a illustrare i tipi di report che è possibile generare con questo approccio, ma le esigenze di creazione di report specifiche possono variare e richiedere dati diversi o aggiuntivi. È possibile iniziare con questi oggetti e inserire più tipi di oggetti Microsoft Entra nel tempo.
- Questo articolo illustra il recupero di dati da Microsoft Entra come utente connesso. A tale scopo, assicurarsi di disporre delle assegnazioni di ruolo necessarie per recuperare i dati da Microsoft Entra. Sono necessari i ruoli con le autorizzazioni appropriate per esportare il tipo di dati di Microsoft Entra con cui si vuole lavorare.
- Dati utente: Amministratore globale, Amministratore ruolo con privilegi, Amministratore utenti
- Dati dei gruppi: Amministratore globale, Amministratore ruolo con privilegi, Amministratore gruppo
- Applicazioni/Assegnazioni di ruolo app: Amministratore globale, Amministratore ruolo con privilegi, Amministratore applicazioni, Amministratore applicazioni cloud
- Microsoft Graph PowerShell deve essere autorizzato a consentire il recupero di oggetti Microsoft Entra tramite Microsoft Graph. Gli esempi di questa esercitazione richiedono le autorizzazioni Delegated User.Read.All, Group.Read.All, Application.Read.All e Directory.Read.All. Se si prevede di recuperare dati usando l'automazione senza un utente connesso, fornire invece il consenso alle autorizzazioni dell'applicazione corrispondenti. Per altre informazioni, vedere Informazioni di riferimento sulle autorizzazioni di Microsoft Graph. Se Microsoft Graph PowerShell non è già stato acconsentito a tali autorizzazioni, è necessario essere un amministratore globale per eseguire questa operazione di consenso.
- Questa esercitazione non illustra attributi personalizzati di sicurezza. Per impostazione predefinita, l'amministratore globale e altri ruoli di amministratore non includono le autorizzazioni per leggere gli attributi di sicurezza personalizzati dagli utenti di Microsoft Entra. Se si prevede di recuperare attributi di sicurezza personalizzati, potrebbero essere necessari altri ruoli e autorizzazioni.
- Sul computer in cui è installato Microsoft Graph PowerShell, assicurati di avere accesso in scrittura alla directory del file system. In questo caso si installano i moduli di PowerShell di Microsoft Graph necessari e in cui vengono salvati i dati di Microsoft Entra esportati.
- Assicurarsi di disporre delle autorizzazioni necessarie per recuperare i dati da altre origini dati oltre a Microsoft Entra.
1: Configurare Azure Data Explorer
Se non hai usato Esplora dati di Azure in precedenza, devi configurarlo prima. È possibile creare un cluster gratuito senza una sottoscrizione di Azure o una carta di credito o un cluster completo che richiede una sottoscrizione di Azure. Per iniziare, vedere Avvio rapido: Creare un cluster e un database di Azure Esplora dati.
2: Connettersi a Microsoft Graph ed estrarre dati Entra con PowerShell
In questa sezione si installare i moduli di PowerShell di Microsoft Graph e Connect to Microsoft Graph.
La prima volta che l'organizzazione usa questi moduli per questo scenario, è necessario trovarsi in un ruolo di amministratore globale per consentire a Microsoft Graph PowerShell di concedere il consenso per l'uso nel tenant. Le interazioni successive possono usare un ruolo con privilegi inferiori.
- Aprire PowerShell.
- Se non si dispone di tutti i moduli di PowerShell di Microsoft Graph già installati, installare i moduli di Microsoft Graph necessari. Per questa esercitazione sono necessari i moduli seguenti:
Microsoft.Graph.Authentication
,Microsoft.Graph.Users
,Microsoft.Graph.Groups
,Microsoft.Graph.Applications
,Microsoft.Graph.DirectoryObjects
.
$modules = @('Microsoft.Graph.Users', 'Microsoft.Graph.Groups', 'Microsoft.Graph.Applications', 'Microsoft.Graph.DirectoryObjects')
foreach ($module in $modules) {
Install-Module -Name $module -Scope CurrentUser -AllowClobber -Force
}
- Importare i moduli nella sessione di PowerShell corrente.
$modules = @('Microsoft.Graph.Users', 'Microsoft.Graph.Groups', 'Microsoft.Graph.Applications', 'Microsoft.Graph.DirectoryObjects')
foreach ($module in $modules) {
Import-Module -Name $module
}
- Connettersi a Microsoft Graph.
Connect-MgGraph -Scopes "User.Read.All", "Group.Read.All", "Application.Read.All", "Directory.Read.All" -ContextScope Process
Questo comando richiede di accedere con le credenziali di Microsoft Entra. Dopo l'accesso, potrebbe essere necessario fornire il consenso alle autorizzazioni necessarie se è la prima volta che ci si connette o se sono necessarie nuove autorizzazioni.
Query di PowerShell per estrarre i dati necessari per creare report personalizzati in Esplora dati di Azure
Le query seguenti estraggono i dati di Microsoft Entra da Microsoft Graph usando PowerShell ed esportano i dati in file JSON che vengono importati in Esplora dati di Azure nella sezione successiva 3. Possono essere presenti più scenari per la generazione di report con questo tipo di dati:
- Un revisore desidera visualizzare un report che elenca i membri del gruppo per 10 gruppi, organizzati dal reparto dei membri.
- Un revisore vuole visualizzare un report di tutti gli utenti che hanno accesso a un'applicazione tra due date.
Si possono anche inserire dati in Azure Data Explorer da altre origini oltre a Microsoft Entra. In questo modo si abilitano scenari come:
- Un amministratore vuole visualizzare tutti gli utenti aggiunti a un'applicazione da Microsoft Entra ID e i relativi diritti di accesso nel repository dell'applicazione, ad esempio i database SQL.
Questi tipi di report non sono incorporati in Microsoft Entra ID. È tuttavia possibile creare manualmente questi report estraendo i dati da Entra e combinandoli usando query personalizzate in Esplora dati di Azure.
Per questa esercitazione, i dati di Microsoft Entra vengono estratti da diverse aree:
- Informazioni sull'utente, ad esempio nome visualizzato, UPN e dettagli del processo
- Informazioni sul gruppo
- Assegnazioni di applicazioni e ruoli
Questo set di dati consente di eseguire un ampio set di query su chi ha concesso l'accesso a un'applicazione, alle informazioni sui ruoli e all'intervallo di tempo associato. Si noti che si tratta di query di esempio e i dati e requisiti specifici possono variare rispetto a quanto illustrato di seguito.
Nota
I tenant di dimensioni maggiori possono riscontrare errori di limitazione/429 gestiti dal modulo di Microsoft Graph. Esplora dati di Azure può anche limitare le dimensioni di caricamento dei file.
In questi script di PowerShell le proprietà selezionate vengono esportate dagli oggetti Microsoft Entra in file JSON. I dati di queste proprietà esportate vengono usati per generare report personalizzati in Esplora dati di Azure. Le proprietà specifiche seguenti sono state incluse in questi esempi, perché questi dati vengono usati per illustrare i tipi di report che è possibile creare in Esplora dati di Azure. Poiché è probabile che le tue esigenze specifiche di creazione di report varino rispetto a quanto mostrato qui, dovresti includere nei report le proprietà specifiche di cui desideri vedere nei tuoi script. Tuttavia, è possibile seguire lo stesso modello illustrato per compilare gli script.
Selezionare una data istantanea
È stata inclusa una data snapshot hardcoded che identifica i dati nel file JSON con una data specifica e consente di tenere traccia di set di dati simili nel tempo in Esplora dati di Azure. La data dello snapshot è utile anche per confrontare le modifiche apportate ai dati tra due date dello snapshot.
$SnapshotDate = "2024-01-11"
Ottenere i dati utente di Entra
Questo script esporta le proprietà selezionate dall'oggetto utente Entra in un file JSON. Questi dati verranno importati in Esplora dati di Azure in una sezione successiva di questa esercitazione.
function Export-EntraUsersToJson {
# Define a hash table for property mappings
$propertyMappings = @{
"Id" = "ObjectID"
"DisplayName" = "DisplayName"
"UserPrincipalName" = "UserPrincipalName"
"EmployeeId" = "EmployeeId"
"UserType" = "UserType"
"CreatedDateTime" = "CreatedDateTime"
"JobTitle" = "JobTitle"
"Department" = "Department"
"AccountEnabled" = "AccountEnabled"
# Add custom properties as needed
"custom_extension" = "CustomExtension"
}
# Retrieve users with specified properties and create custom objects directly
$users = Get-MgUser -Select ($propertyMappings.Keys) -All | ForEach-Object {
$userObject = @{}
foreach ($key in $propertyMappings.Keys) {
if ($key -eq "CreatedDateTime") {
# Convert date string directly to DateTime and format it
$date = [datetime]::Parse($_.$key)
$userObject[$propertyMappings[$key]] = $date.ToString("yyyy-MM-dd")
} else {
$userObject[$propertyMappings[$key]] = $_.$key
}
}
# Additional properties or transformations
$userObject["SnapshotDate"] = $SnapshotDate
[pscustomobject]$userObject
}
# Convert the user data to JSON and save it to a file
$users | ConvertTo-Json -Depth 2 | Set-Content ".\EntraUsers.json"
}
# Execute the function
Export-EntraUsersToJson
Ottenere i dati del gruppo
Generare un file JSON con nomi di gruppo e ID usati per creare visualizzazioni personalizzate in Esplora dati di Azure. L'esempio include tutti i gruppi, ma è possibile includere filtri aggiuntivi, se necessario. Se si filtra in modo che includa solo determinati gruppi, è possibile includere la logica nello script per verificare la presenza di gruppi annidati.
# Get all groups and select Id and DisplayName
$groups = Get-MgGroup -All | Select-Object Id,DisplayName
# Export the groups to a JSON file
$groups | ConvertTo-Json | Set-Content ".\EntraGroups.json"
Ottenere i dati di appartenenza al gruppo
Generare un file JSON con appartenenza al gruppo usato per creare visualizzazioni personalizzate in Esplora dati di Azure.
# Retrieve all groups from Microsoft Entra (Azure AD)
$groups = Get-MgGroup -All
# Initialize an array to store results
$results = @()
# Iterate over each group
foreach ($group in $groups) {
# Extract the group ID
$groupId = $group.Id
# Get members of the current group and select their IDs
$members = Get-MgGroupMember -GroupId $groupId | Select-Object -ExpandProperty Id
# Add a custom object with group ID and member IDs to the results array
$results += [PSCustomObject]@{
GroupId = $groupId
Members = $members
SnapshotDate = $SnapshotDate
}
# Pause for a short time to avoid rate limits
Start-Sleep -Milliseconds 200
}
# Convert the results array to JSON format and save it to a file
$results | ConvertTo-Json | Set-Content "EntraGroupMembership.json"
Ottenere i dati dell'applicazione e dell'entità servizio
Genera un file JSON con tutte le applicazioni e le entità servizio corrispondenti nel tenant. Questi dati verranno importati in Azure Data Explorer in una sezione successiva di questa esercitazione che consente di generare report personalizzati correlati alle applicazioni basati su questi dati.
# Fetch applications and their corresponding service principals, then export to JSON
Get-MgApplication -All | ForEach-Object {
$app = $_
$sp = Get-MgServicePrincipal -Filter "appId eq '$($app.AppId)'"
[pscustomobject]@{
Name = $app.DisplayName
ApplicationId = $app.AppId
ServicePrincipalId = $sp.Id
SnapshotDate = $SnapshotDate
}
} | ConvertTo-Json -Depth 10 | Set-Content "Applications.json"
Ottenere i dati di AppRole
Creare un file JSON di tutti i ruoli delle app per le applicazioni aziendali in Microsoft Entra. Dopo l'importazione in Azure Data Explorer, utilizziamo questi dati per generare report che coinvolgono le assegnazioni dei ruoli delle app agli utenti.
# Get a list of all applications, handle pagination manually if necessary
$apps = Get-MgApplication -All
# Loop through each application to gather the desired information
$results = foreach ($app in $apps) {
# Get the service principal for the application using its appId
$spFilter = "appId eq '$($app.AppId)'"
$sp = Get-MgServicePrincipal -Filter $spFilter | Select-Object -First 1
# Process AppRoles, if any, for the application
$appRoles = if ($app.AppRoles) {
$app.AppRoles | Where-Object { $_.AllowedMemberTypes -contains "User" } |
Select-Object Id, Value, DisplayName
}
# Construct a custom object with application and service principal details
[PSCustomObject]@{
ApplicationId = $app.AppId
DisplayName = $app.DisplayName
ServicePrincipalId = $sp.Id
AppRoles = $appRoles
SnapshotDate = $SnapshotDate
}
}
# Export the results to a JSON file
$results | ConvertTo-Json -Depth 4 | Out-File 'AppRoles.json'
Ottenere i dati dell'assegnazione di AppRole
Generare un file JSON di tutte le assegnazioni di ruolo dell'app nel tenant.
$users = Get-MgUser -All
$result = @()
foreach ($user in $users) {
Get-MgUserAppRoleAssignment -UserId $user.Id | ForEach-Object {
# Use the same date formatting approach
$createdDateTime = $_.CreatedDateTime -replace "\\/Date\((\d+)\)\\/", '$1'
# Convert the milliseconds timestamp to a readable date format if needed
$result += [PSCustomObject]@{
AppRoleId = $_.AppRoleId
CreatedDateTime = $createdDateTime
PrincipalDisplayName = $_.PrincipalDisplayName
PrincipalId = $_.PrincipalId
ResourceDisplayName = $_.ResourceDisplayName
ResourceId = $_.ResourceId
SnapshotDate = $SnapshotDate
}
}
}
$result | ConvertTo-Json -Depth 10 | Out-File "AppRoleAssignments.json"
3: Importare dati di file JSON in Esplora dati di Azure
In questa sezione vengono importati i file JSON appena creati per un'ulteriore analisi.
Dopo aver configurato un database nel cluster di Esplora dati di Azure o nel cluster gratuito, come descritto nella prima sezione di questo documento, accedere a quel database.
Seguire quindi questa procedura per ogni file JSON esportato per ottenere i dati esportati nel database di Esplora dati di Azure.
Selezionare con il pulsante destro del computer il nome del database in cui si desidera inserire i dati. Selezionare Recupera dati.
Selezionare l'origine dati dall'elenco disponibile. In questa esercitazione, stai inserendo dati da un file locale .
Selezionare + tabella Nuova e inserire un nome di tabella basato sul nome del file JSON che stai importando, ad esempio, se importa EntraUsers.json, dare alla tabella il nome EntraUsers. Dopo la prima importazione, la tabella esiste già ed è possibile selezionarla come tabella di destinazione per un'importazione successiva.
Seleziona Sfoglia file, seleziona il file JSON e fai clic su Avanti.
Azure Data Explorer rileva automaticamente lo schema e fornisce un'anteprima nella scheda ispeziona. Selezionare Fine per creare la tabella e importare i dati da quel file.
Ripetere ognuno dei passaggi precedenti per ognuno dei file JSON generati nella prima sezione.
4: Usare Esplora dati di Azure per creare report personalizzati
Con i dati ora disponibili in Esplora dati di Azure, è possibile iniziare a creare report personalizzati in base ai requisiti aziendali.
Azure Esplora dati è un potente strumento di analisi dei dati altamente scalabile e flessibile che offre un ambiente ideale per generare report di accesso utente personalizzati. Azure Data Explorer usa il linguaggio di query Kusto (KQL).
Le query seguenti forniscono esempi di report comuni, ma è possibile personalizzarli in base alle proprie esigenze e creare report aggiuntivi.
Esempio 1: Generare assegnazioni di ruolo dell'app per assegnazioni dirette e di gruppo per una data snapshot specifica
Questo report fornisce una visualizzazione degli utenti che hanno accesso e quando all'app di destinazione e possono essere usati per i controlli di sicurezza, la verifica della conformità e la comprensione dei modelli di accesso all'interno dell'organizzazione.
Questa query è destinata a un'applicazione specifica all'interno di Microsoft Entra AD e analizza le assegnazioni di ruolo a partire da una determinata data. La query recupera assegnazioni di ruolo dirette e basate su gruppo, unendo questi dati con i dettagli utente dalla tabella EntraUsers e dalle informazioni sul ruolo dalla tabella AppRoles.
/// Define constants
let targetServicePrincipalId = "<your service principal-id>"; // Target Service Principal ID
let targetSnapshotDate = datetime("2024-01-13"); // Target Snapshot Date for the data
// Extract role assignments for the target Service Principal and Snapshot Date
let roleAssignments = AppRoleAssignments
| where ResourceId == targetServicePrincipalId and startofday(SnapshotDate) == targetSnapshotDate
| extend AppRoleIdStr = tostring(AppRoleId); // Convert AppRoleId to string for easier comparison
// Prepare user data from EntraUsers table
let users = EntraUsers
| project ObjectID, UserPrincipalName, DisplayName, ObjectIDStr = tostring(ObjectID); // Include ObjectID as string for joining
// Prepare role data from AppRoles table
let roles = AppRoles
| mvexpand AppRoles // Expand AppRoles to handle multiple roles
| extend RoleName = AppRoles.DisplayName, RoleId = tostring(AppRoles.Id) // Extract Role Name and ID
| project RoleId, RoleName;
// Process direct assignments
let directAssignments = roleAssignments
| join kind=inner users on $left.PrincipalId == $right.ObjectID // Join with EntraUsers on PrincipalId
| join kind=inner roles on $left.AppRoleIdStr == $right.RoleId // Join with roles to get Role Names
| project UserPrincipalName, DisplayName, CreatedDateTime, RoleName, AssignmentType = "Direct", SnapshotDate;
// Process group-based assignments
let groupAssignments = roleAssignments
| join kind=inner EntraGroupMembership on $left.PrincipalId == $right.GroupId // Join with Group Membership
| mvexpand Members // Expand group members
| extend MembersStr = tostring(Members) // Convert member ID to string
| distinct MembersStr, CreatedDateTime, AppRoleIdStr, SnapshotDate // Get distinct values
| join kind=inner users on $left.MembersStr == $right.ObjectIDStr // Join with EntraUsers for user details
| join kind=inner roles on $left.AppRoleIdStr == $right.RoleId // Join with roles for role names
| project UserPrincipalName, DisplayName, CreatedDateTime, RoleName, AssignmentType = "Group", SnapshotDate;
// Combine results from direct and group-based assignments
directAssignments
| union groupAssignments
Esempio 2: Creare un report revisore di base con i dati entra che mostrano chi ha avuto accesso a un'app tra queste due date
Questo report fornisce una visualizzazione degli utenti che hanno accesso all'app di destinazione tra due date e possono essere usati per i controlli di sicurezza, la verifica della conformità e la comprensione dei modelli di accesso all'interno dell'organizzazione.
Questa query è destinata a un'applicazione specifica all'interno di Microsoft Entra ID e analizza le assegnazioni di ruolo tra due date. La query recupera le assegnazioni di ruolo dirette dalla tabella AppRoleAssignments e unisce questi dati con i dettagli utente dalla tabella EntraUsers e dalle informazioni sul ruolo dalla tabella AppRoles.
// Set the date range and service principal ID for the query
let startDate = datetime('2024-01-01');
let endDate = datetime('2024-03-14');
let servicePrincipalId = "<your service principal-id>";
// Query AppRoleAssignments for the specified service principal within the date range
AppRoleAssignments
| where ResourceId == servicePrincipalId and
todatetime(CreatedDateTime) between (startDate .. endDate)
// Extend AppRoleId to a string for joining
| extend AppRoleIdStr = tostring(AppRoleId)
// Project the necessary fields for the join with EntraUsers and AppRoles
| project PrincipalId, AppRoleIdStr, CreatedDateTime
// Join with EntraUsers to get user details
| join kind=inner (EntraUsers | project UserPrincipalName, DisplayName, ObjectID) on $left.PrincipalId == $right.ObjectID
// Join with AppRoles to get the role display names
| join kind=inner (
AppRoles | mvexpand AppRoles | project RoleIdStr = tostring(AppRoles.Id), RoleDisplayName = tostring(AppRoles.DisplayName)
) on $left.AppRoleIdStr == $right.RoleIdStr
// Final projection of the report with the current date and time
| project UserPrincipalName, DisplayName, RoleDisplayName, CreatedDateTime, ReportDate = now()
Esempio 3: Ottenere utenti aggiunti a un'app tra due date di snapshot dei dati
Questi report forniscono una visualizzazione delle assegnazioni di ruolo dell'app all'applicazione di destinazione tra due date. Questi report possono essere usati per tenere traccia delle modifiche apportate all'accesso alle app nel tempo.
Questa query è destinata a un'applicazione specifica all'interno di Microsoft Entra ID e modifiche alle assegnazioni di ruolo tra una data di inizio e di fine.
// Define the date range and service principal ID for the query
let startDate = datetime("2024-03-01");
let endDate = datetime("2024-03-14");
let servicePrincipalId = "<your service principal-id>";
let earlierDate = startDate; // Update this to your specific earlier date
AppRoleAssignments
| where SnapshotDate < endDate and ResourceId == servicePrincipalId
| project PrincipalId, AppRoleId2 = tostring(AppRoleId), CreatedDateTime
| join kind=anti (
AppRoleAssignments
| where SnapshotDate < earlierDate and ResourceId == servicePrincipalId
| project PrincipalId, AppRoleId1 = tostring(AppRoleId)
) on PrincipalId
| join kind=inner (EntraUsers) on $left.PrincipalId == $right.ObjectID
| join kind=inner (AppRoles
| mvexpand AppRoles
| project AppRoleId=tostring(AppRoles.Id), RoleDisplayName=tostring(AppRoles.DisplayName)
) on $left.AppRoleId2 == $right.AppRoleId
| project UserPrincipalName, DisplayName, RoleDisplayName, CreatedDateTime, PrincipalId, Change = "Added"
Inserire dati da altre origini
È anche possibile creare tabelle aggiuntive in Azure Data Explorer per acquisire dati da altre origini. Se i dati si trovano in un file JSON, simile agli esempi precedenti o in un file CSV, è possibile creare la tabella al momento della prima ottenere dati dal file.
Per ulteriori informazioni sull'acquisizione dei dati, vedere panoramica dell'acquisizione dei dati di Esplora dati di Azure.
Esempio 4: Combinare le assegnazioni di app da Entra e una seconda origine per creare un report di tutti gli utenti che avevano accesso a un'applicazione in un intervallo di due date.
Questo report illustra come combinare i dati di due sistemi separati per creare report personalizzati in Esplora dati di Azure. Aggrega i dati relativi a utenti, ruoli e altri attributi di due sistemi in un formato unificato per l'analisi o la creazione di report.
In questo esempio si presuppone che sia presente una tabella denominata salesforceAssignments
popolata tramite l'importazione di dati da un'altra applicazione.
// Define the date range and service principal ID for the query
let startDate = datetime("2023-06-01");
let endDate = datetime("2024-03-13");
let servicePrincipalId = "<your service principal-id>";
// Pre-process AppRoleAssignments with specific filters and projections
let processedAppRoleAssignments = AppRoleAssignments
| where ResourceId == servicePrincipalId and todatetime(CreatedDateTime) between (startDate .. endDate)
| extend AppRoleId = tostring(AppRoleId)
| project PrincipalId, AppRoleId, CreatedDateTime, ResourceDisplayName; // Exclude DeletedDateTime and keep ResourceDisplayName
// Pre-process AppRoles to get RoleDisplayName for each role
let processedAppRoles = AppRoles
| mvexpand AppRoles
| project AppRoleId = tostring(AppRoles.Id), RoleDisplayName = tostring(AppRoles.DisplayName);
// Main query: Process EntraUsers by joining with processed role assignments and roles
EntraUsers
| join kind=inner processedAppRoleAssignments on $left.ObjectID == $right.PrincipalId // Join with role assignments
| join kind=inner processedAppRoles on $left.AppRoleId == $right.AppRoleId // Join with roles to get display names
// Summarize to get the latest record for each unique combination of user and role attributes
| summarize arg_max(AccountEnabled, *) by UserPrincipalName, DisplayName, tostring(EmployeeId), Department, JobTitle, ResourceDisplayName, RoleDisplayName, CreatedDateTime
// Final projection of relevant fields including source indicator and report date
| project UserPrincipalName, DisplayName, EmployeeId=tostring(EmployeeId), Department, JobTitle, AccountEnabled=tostring(AccountEnabled), ResourceDisplayName, RoleDisplayName, CreatedDateTime, Source="EntraUsers", ReportDate = now()
// Union with processed salesforceAssignments to create a combined report
| union (
salesforceAssignments
// Project fields from salesforceAssignments to align with the EntraUsers data structure
| project UserPrincipalName = UserName, DisplayName = Name, EmployeeId = tostring(EmployeeId), Department, JobTitle, AccountEnabled = "N/A", ResourceDisplayName = AppName, RoleDisplayName = Role, CreatedDateTime, Source = "salesforceAssignments", ReportDate = now()
)