Aracılığıyla paylaş


Öğretici: Azure Veri Gezgini'de (ADX) Microsoft Entra ID'den alınan verileri kullanan özelleştirilmiş raporlar

Bu öğreticide, Microsoft Entra Id'deki verileri kullanarak Azure Veri Gezgini'de (ADX) özelleştirilmiş raporlar oluşturmayı öğreneceksiniz. Bu öğretici, Daha uzun saklama ve analiz için denetim günlüğü verilerini dışarı aktarmaya odaklanan Arşivleme ve rapor ile Azure İzleyici ve yetkilendirme yönetimi gibi diğer raporlama seçeneklerini tamamlar. Karşılaştırmak gerekirse, Microsoft Entra ID verilerini Azure Veri Gezgini'a aktarmak, çok büyük ölçeklenebilirlik ve esnek şema ve bekletme ilkeleriyle birden çok kaynaktan veri toplamaya izin vererek özel raporlar oluşturmak için daha fazla esneklik sağlar.

Bu rapor, SQL veritabanlarına sahip uygulamalar gibi diğer kaynaklardan dışarı aktarılan verilerin yanı sıra Microsoft Entra'dan dışarı aktarılan yapılandırma, kullanıcılar ve erişim haklarının nasıl gösterilip gösterilmeyeceğini gösterir. Daha sonra kuruluşunuzun gereksinimlerine göre özel raporlar oluşturmak için Kusto Sorgu Dili (KQL) kullanabilirsiniz. Azure Veri Gezgini içinde bu tür raporları oluşturmak, erişim verilerini daha uzun süre saklamanız, geçici araştırmalar yapmanız veya kullanıcı erişim verileri üzerinde özel sorgular çalıştırmanız gerekiyorsa özellikle yararlı olabilir.

Bu raporları oluşturmak için aşağıdaki adımları uygulayacaksınız:

  1. Azure aboneliğinde Azure Veri Gezgini ayarlama.
  2. PowerShell betiklerini ve MS Graph'ı kullanarak Microsoft Entra'dan ve üçüncü taraf veritabanlarından veya uygulamalarından veri ayıklayın.
  3. Verileri hızlı ve ölçeklenebilir bir veri analizi hizmeti olan Azure Veri Gezgini'a aktarın.
  4. Kusto Sorgu Dili kullanarak özel bir sorgu oluşturun.

Bu öğreticinin sonunda, Microsoft tarafından desteklenen araçları kullanarak farklı uygulamalarda kullanıcıların erişim haklarına ve izinlerine ilişkin özelleştirilmiş görünümler geliştirmek için beceriler oluşturacaksınız.

Önkoşullar

  • Gerekli izinlere sahip olduğunuzdan emin olun. Çalışmak istediğiniz Entra verilerinin türünü dışarı aktarmak için doğru izinlere ve dışarı aktarılan JSON dosyalarını kaydetme izinlerine sahip olmanız gerekir.

    • Kullanıcı verileri: Genel Yönetici istrator, Privileged Role Yönetici istrator, User Yönetici istrator
    • Verileri gruplandırma: Genel Yönetici istrator, Privileged Role Yönetici istrator, Group Yönetici istrator
    • Uygulamalar/Uygulama Rolü Atamaları: Genel Yönetici, Ayrıcalıklı Rol Yönetici Istrator, Uygulama Yönetici sistrator, Bulut Uygulaması Yönetici Istrator
  • PowerShell User.Read.All, Group.Read.All, Application.Read.All ve Directory.Read.All için izin verecek şekilde ayarlanmalıdır. Ek bilgi için bkz . Microsoft Graph izin başvurusu .

  • Gerekli MS Graph PowerShell modüllerini yükleyebileceğiniz ve dışarı aktarılan Entra verilerinin kaydedileceği dizine yazma erişiminiz olduğundan emin olun.

  • Raporlarınıza hangi verileri eklemek istediğinizi belirleyin. Bu makaledeki betikler, Entra'daki kullanıcılardan, gruplardan ve uygulamalardan belirli verileri içeren örnekler sağlar. Bu örneklerin amacı, bu yaklaşımla oluşturabileceğiniz rapor türlerini göstermektir, ancak belirli raporlama gereksinimleriniz farklılık gösterebilir ve farklı veya ek veriler gerektirebilir.

1. Adım: Azure Veri Gezgini kurulumu

Daha önce Azure Veri Gezgini kullanmadıysanız önce bunu ayarlamanız gerekir. Azure aboneliği, kredi kartı veya Azure aboneliği gerektiren tam küme olmadan ücretsiz bir küme oluşturabilirsiniz. Başlamak için bkz. Hızlı Başlangıç: Azure Veri Gezgini kümesi ve veritabanı oluşturma.

2. Adım: PowerShell ile MS Graph'a Bağlan ve Entra verilerini ayıklama

MS Graph PowerShell modüllerini ve Bağlan MS Graph'a yükleyin.

  1. Gerekli MS Graph modüllerini yükleyin. Bu öğretici için aşağıdaki modüller gereklidir: 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
   } 
  1. Modülleri içeri aktarın:
  $modules = @('Microsoft.Graph.Users', 'Microsoft.Graph.Groups', 'Microsoft.Graph.Applications', 'Microsoft.Graph.DirectoryObjects') 
  foreach ($module in $modules) { 
  Import-Module -Name $module 
  } 
  1. Microsoft Graph'a Bağlan
  Connect-MgGraph -Scopes "User.Read.All", "Group.Read.All", "Application.Read.All", "Directory.Read.All" 

Bu komut, MS Graph kimlik bilgilerinizle oturum açmanızı ister. Gerekli İzinler: Oturum açtıktan sonra, ilk kez bağlanıyorsanız veya yeni izinler gerekiyorsa gerekli izinleri onaylamanız gerekebilir.

ADX'te özel raporlar oluşturmak için gereken verileri ayıklamak için PowerShell Sorguları

Aşağıdaki sorgular PowerShell kullanarak MS Graph'ten Entra verilerini ayıklar ve verileri 3. Adımda Azure Veri Gezgini'a aktarılacak JSON dosyalarına aktarır. Bu tür verilerle rapor oluşturmak için birden çok senaryo olabilir:

  • Denetçi, üyelerin departmanı tarafından düzenlenen 10 grubun grup üyelerini listeleyen bir rapor görmek istiyor.
  • Denetçi, iki tarih arasında bir uygulamaya erişimi olan tüm kullanıcıların raporunu görmek istiyor.
  • Yönetici, Microsoft Entra Id ve SQL veritabanlarından bir uygulamaya eklenen tüm kullanıcıları görüntülemek istiyor.

Bu tür raporlar Microsoft Entra Id'de yerleşik değildir, ancak Entra'dan veri ayıklayarak ve Bunları Azure Veri Gezgini'de özel sorgular kullanarak birleştirerek bu raporları kendiniz oluşturabilirsiniz.

Bu öğreticide, çeşitli alanlardan Entra verilerini ayıklayacağız:

  • Görünen ad, UPN ve iş ayrıntıları gibi kullanıcı bilgileri
  • Grup bilgileri
  • Uygulama ve rol atamaları

Bu veri kümesi, bir uygulamaya, rol bilgilerine ve ilişkili zaman çerçevesine kimlerin erişimi verildiğine ilişkin geniş bir sorgu kümesi gerçekleştirmemizi sağlar. Bunların örnek sorgular olduğunu ve verilerinizin ve belirli gereksinimlerinizin burada gösterilenden farklı olabileceğini unutmayın.

Not

Daha büyük kiracılar MS Graph modülü tarafından işlenecek azaltma / 429 hatalarıyla karşılaşabilir.

Bu PowerShell betiklerinde, Entra nesnelerinden seçilen özellikleri JSON dosyalarına aktaracağız. Daha sonra bu dışarı aktarılan özelliklerden alınan veriler, Azure Veri Gezgini'da özel raporlar oluşturmak için kullanılır. Azure Veri Gezgini'da oluşturabileceğiniz rapor türlerini göstermek için bu verileri kullandığımız için aşağıdaki özellikler bu örneklere dahil edildi. Belirli raporlama gereksinimleriniz büyük olasılıkla aşağıda gösterilenden farklı olacağından, raporlarınızda görüntülemek istediğiniz belirli özellikleri bu betiklere eklemeniz gerekir, ancak betiklerinizi oluşturmaya yardımcı olmak için aşağıda gösterilen desenin aynısını izleyebilirsiniz.

Ayrıca, JSON dosyasındaki verileri belirli bir tarihle tanımlayan ve azure Veri Gezgini zaman içinde benzer veri kümelerini izlememize olanak tanıyan sabit kodlanmış bir anlık görüntü tarihi de ekledik. Anlık görüntü tarihi, iki anlık görüntü tarihi arasındaki verilerdeki değişiklikleri karşılaştırmak için de kullanışlıdır.

Entra kullanıcı verilerini alma

Bu betik, Entra kullanıcı nesnesinden seçilen özellikleri bir JSON dosyasına aktarır. Bu verileri 3. Adımda Azure Veri Gezgini'a aktaracağız.

  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"] = "2024-01-11" 
      [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 

Grup verilerini alma

ADX'te özel görünümler oluşturmak için kullanılacak grup adlarına ve kimliklere sahip bir JSON dosyası oluşturun. Örnek tüm grupları içerir, ancak gerekirse ek filtreleme dahil edilebilir. Yalnızca belirli grupları içerecek şekilde filtre kullanıyorsanız, iç içe grupları denetlemek için betiğinize mantık eklemek isteyebilirsiniz.

    # 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" 

Grup Üyeliği verilerini alma

ADX'te özel görünümler oluşturmak için kullanılacak grup üyeliğine sahip bir JSON dosyası oluşturun.

    # 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 
      } 
      # 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" 

Uygulama ve Hizmet Sorumlusu verilerini alma

Tüm uygulamalarla ve kiracıdaki ilgili hizmet sorumlularıyla JSON dosyası oluşturur. 3. Adımda bu verileri ADX'e aktaracağız ve bu sayede bu verileri temel alan uygulamalarla ilgili özel raporlar oluşturacağız.

    # 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 
      } 
    } | ConvertTo-Json -Depth 10 | Set-Content "Applications.json" 

AppRole verilerini alma

Entra'da kurumsal uygulamalar için tüm appRoles'lerden oluşan bir JSON dosyası oluşturun. ADX'e aktarıldıktan sonra, kullanıcılar için uygulama rolü atamalarını içeren raporlar oluşturmak için bu verileri kullanacağız.

    # 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 
      } 
    } 
    # Export the results to a JSON file 
    $results | ConvertTo-Json -Depth 4 | Out-File 'AppRoles.json' 

AppRole Atama verilerini alma

Kiracıdaki tüm uygulama rolü atamalarından oluşan bir JSON dosyası oluşturun.

    $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     = "2024-03-13" # Hard-coded date 
        } 
      } 
    } 
    $result | ConvertTo-Json -Depth 10 | Out-File "AppRoleAssignments.json" 

3. Adım: JSON dosya verilerini Azure Veri Gezgini içeri aktarma

3. Adımda, daha fazla analiz için yeni oluşturulan JSON dosyalarını içeri aktaracağız. Azure Veri Gezgini henüz ayarlamadıysanız lütfen yukarıdaki 1. adıma bakın.

Azure Veri Gezgini, özelleştirilmiş kullanıcı erişim raporları oluşturmak için ideal bir ortam sağlayan yüksek oranda ölçeklenebilir ve esnek güçlü bir veri çözümleme aracıdır. ADX, Kusto Sorgu Dili (KQL) kullanır.

Bir veritabanı ayarladıktan sonra, dışarı aktarılan verilerinizi ADX'e almak için bu adımları izleyin.

  1. Veritabanı adına sağ tıklayın ve Veri Al'ı seçin
  2. Yeni Tablo'yu seçin ve içeri aktardığınız JSON dosyasının adını girin; örneğin, EntraUsers.json içeri aktarıyorsanız tabloyu EntraUsers olarak adlandırın. İlk içeri aktarma işleminden sonra tablo zaten var olur ve içeri aktarma için hedef tablo olarak seçebilirsiniz.
  3. JSON dosyasını seçin.
  4. ADX şemayı otomatik olarak algılar ve bir önizleme sağlar. Tabloyu oluşturmak ve verileri içeri aktarmak için Son'a tıklayın.
  5. 1. Adımda oluşturduğunuz JSON dosyalarının her biri için 1-4 arası adımları izleyin.

4. Adım: Özel raporlar oluşturmak için ADX kullanma

Veriler ADX'te kullanıma sunulduğundan, iş gereksinimlerinize göre özelleştirilmiş raporlar oluşturmaya başlayabilirsiniz. Aşağıdaki sorgular yaygın raporlara örnekler sağlar, ancak bu raporları gereksinimlerinize uyacak şekilde özelleştirebilir ve ek raporlar oluşturabilirsiniz.

Örnek 1: Belirli bir anlık görüntü tarihi için doğrudan ve grup atamaları için uygulama rolü atamaları oluşturma

Bu rapor, kimlerin hedef uygulamaya hangi erişime ve ne zaman eriştiğine ilişkin bir görünüm sağlar ve kuruluş içindeki güvenlik denetimleri, uyumluluk doğrulaması ve erişim düzenlerini anlamak için kullanılabilir.

Bu sorgu, Entra AD içindeki belirli bir uygulamayı hedefler ve belirli bir tarihten itibaren rol atamalarını analiz eder. Sorgu, bu verileri EntraUsers tablosundaki kullanıcı ayrıntıları ve AppRoles tablosundaki rol bilgileriyle birleştirerek hem doğrudan hem de grup tabanlı rol atamalarını alır.

/// 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 

Örnek 2: Bu iki tarih arasında bir uygulamaya kimlerin erişimi olduğunu gösteren Entra verileriyle Temel Denetçi Raporu oluşturma

Bu rapor, hedef uygulamaya iki tarih arasında kimlerin erişimi olduğunu gösteren bir görünüm sağlar ve kuruluş içindeki güvenlik denetimleri, uyumluluk doğrulaması ve erişim düzenlerini anlamak için kullanılabilir.

Bu sorgu, Microsoft Entra Id içindeki belirli bir uygulamayı hedefler ve iki tarih arasındaki rol atamalarını analiz eder. Sorgu, AppRoleAssignments tablosundan doğrudan rol atamalarını alır ve bu verileri EntraUsers tablosundaki kullanıcı ayrıntılarıyla ve AppRoles tablosundaki rol bilgileriyle birleştirir.

// 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() 

Örnek 3: İki veri anlık görüntüsü tarihi arasında uygulamaya kullanıcı ekleme

Bu raporlar, hedef uygulamaya iki tarih arasında hangi kullanıcılara uygulama rolü ataması verildiğine ilişkin bir görünüm sağlar. Bu raporlar, zaman içinde uygulama erişimindeki değişiklikleri izlemek için kullanılabilir.

Bu sorgu, Microsoft Entra Id içindeki belirli bir uygulamayı hedefler ve başlangıç ve bitiş tarihi arasındaki rol atamalarında değişiklik gösterir.

// 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" 

Örnek 4: İki tarih arasında Salesforce'a erişimi olan tüm kullanıcıların (Entra atamaları ve yerel atamalar) raporunu oluşturmak için Bir Entra ve ikinci bir kaynaktan (örneğin, SQL dışarı aktarma) Uygulama Atamalarını birleştirme

Bu rapor, ADX'te özel raporlar oluşturmak için iki ayrı sistemdeki verileri nasıl birleştirebileceğinizi gösterir. İki sistemdeki kullanıcılar, rolleri ve diğer öznitelikler hakkındaki verileri analiz veya raporlama için birleşik bir biçime toplar.

// 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() 
) 

Sonraki adımlar