#Connect-AzAccount function GetDeployment { param ( [string] $siteName, [string] $resourceGroupName, [string] $subscriptionId, [string] $slotName = "" ) $access_token = (Get-AzAccessToken -TenantId "e9792fd7-4044-47e7-a40d-3fba46f1cd09").Token $url = "" if ($slotName -ne "") { $url = "https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Web/sites/$siteName/slots/$slotName/deployments?api-version=2022-03-01" } else { $url = "https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Web/sites/$siteName/deployments?api-version=2022-03-01" } # GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Web/sites/{name}/slots/{slot}/deploymentStatus/{deploymentStatusId}?api-version=2022-03-01 $head = @{ Authorization =" Bearer $access_token" } $response = Invoke-RestMethod -Uri $url -Method GET -Headers $head $response | ForEach-Object { $responseValue = $_.value if ($responseValue.Length -gt 0) { return $responseValue[0].properties.last_success_end_time } else { return "" } } } class ResourceCheck { [string] $ResourceId = "" [string] $Kind = "" [string] $Location = "" [string] $ResourceName = "" [string] $ResourceGroup = "" [string] $ResourceType = "" [string] $State = "" [string] $ManagementGroupId = "" [string] $ManagementGroupName = "" [string] $SubscriptionId = "" [string] $SubscriptionName = "" [string] $Tag_Team = "" [string] $Tag_Product = "" [string] $Tag_Environment = "" [string] $Tag_Data = "" [string] $Tag_Deployment = "" [string] $Tag_CreatedOnDate = "" [string] $Prop_HttpsOnly = "" [string] $Prop_PhpVersion = "" [string] $Prop_RemoteDebuggingEnabled = "" [string] $Prop_MinTlsVersion = "" [string] $Prop_FtpsState = "" [string] $Prop_Http20Enabled = "" [string] $Prop_Identity = "" [string] $LastDeployDate = "" } Write-Host "======================================================================================================================================================================" Write-Host "Creating webapp resource overview." Write-Host "======================================================================================================================================================================" [string] $date = Get-Date -Format "yyyy-MM-dd HHmm" $fileName = ".\$date azure_webapps.csv" $managementGroups = Get-AzManagementGroup foreach ($managementGroup in $managementGroups) { Write-Host "----------------------------------------------------------------------------------------------------------------------------------------------------------------------" Write-Host "Management group [$($managementGroup.Name)]" $subscriptions = Get-AzManagementGroupSubscription -Group $managementGroup.Name | Where-Object State -eq "Active" foreach ($subscription in $subscriptions) { Write-Host "----------------------------------------------------------------------------------------------------------------------------------------------------------------------" $scope = $subscription.Id.Substring($subscription.Parent.Length, $subscription.Id.Length - $subscription.Parent.Length) $subscriptionId = $scope.Replace("/subscriptions/", "") Write-Host "Subscription [$($subscription.DisplayName) - $subscriptionId]" Set-AzContext -SubscriptionId $subscriptionId | Out-Null Write-Host "----------------------------------------------------------------------------------------------------------------------------------------------------------------------" $allResourceGroups = Get-AzResourceGroup [ResourceCheck[]]$Result = @() foreach ($group in $allResourceGroups) { Write-Host $group.ResourceGroupName $allWebApps = Get-AzWebApp -ResourceGroupName $group.ResourceGroupName foreach ($webApp in $allWebApps) { [ResourceCheck] $resourceCheck = [ResourceCheck]::new() $resourceCheck.ResourceId = $webApp.Id $resourceCheck.Kind = $webApp.Kind $resourceCheck.Location = $webApp.Location $resourceCheck.State = $webApp.State $resourceCheck.ResourceName = $webApp.Name $resourceCheck.ResourceGroup = $webApp.ResourceGroup $resourceCheck.ResourceType = $webApp.Type $resourceCheck.ManagementGroupId = $managementGroup.Id $resourceCheck.ManagementGroupName = $managementGroup.DisplayName $resourceCheck.SubscriptionId = $subscriptionId $resourceCheck.SubscriptionName = $subscription.DisplayName $resourceCheck.Tag_Team = $webApp.Tags.team $resourceCheck.Tag_Product = $webApp.Tags.product $resourceCheck.Tag_Environment = $webApp.Tags.environment $resourceCheck.Tag_Data = $webApp.Tags.data $resourceCheck.Tag_CreatedOnDate = $webApp.Tags.CreatedOnDate $resourceCheck.Tag_Deployment = $webApp.Tags.drp_deployment $resourceCheck.Prop_HttpsOnly = $webApp.HttpsOnly $resourceCheck.Prop_PhpVersion = $webApp.SiteConfig.PhpVersion $resourceCheck.Prop_RemoteDebuggingEnabled = $webApp.SiteConfig.RemoteDebuggingEnabled $resourceCheck.Prop_MinTlsVersion = $webApp.SiteConfig.MinTlsVersion $resourceCheck.Prop_FtpsState = $webApp.SiteConfig.FtpsState $resourceCheck.Prop_Http20Enabled = $webApp.SiteConfig.Http20Enabled $resourceCheck.Prop_Identity = $webApp.Identity.Type $resourceCheck.LastDeployDate = GetDeployment -siteName $webApp.Name -resourceGroupName $group.ResourceGroupName -subscriptionId $subscriptionId $Result += $resourceCheck $allSlots = Get-AzWebAppSlot -Name $webApp.Name -ResourceGroupName $webApp.ResourceGroup foreach ($slotTemp in $allSlots) { [string] $slotName = $slotTemp.Name.Split("/")[1] $slot = Get-AzWebAppSlot -Name $webApp.Name -ResourceGroupName $webApp.ResourceGroup -Slot $slotName [ResourceCheck] $resourceCheck = [ResourceCheck]::new() $resourceCheck.ResourceId = $slot.Id $resourceCheck.Kind = $slot.Kind $resourceCheck.Location = $slot.Location $resourceCheck.State = $slot.State $resourceCheck.ResourceName = $slot.Name $resourceCheck.ResourceGroup = $slot.ResourceGroup $resourceCheck.ResourceType = $slot.Type $resourceCheck.ManagementGroupId = $managementGroup.Id $resourceCheck.ManagementGroupName = $managementGroup.DisplayName $resourceCheck.SubscriptionId = $subscriptionId $resourceCheck.SubscriptionName = $subscription.DisplayName $resourceCheck.Tag_Team = $slot.Tags.team $resourceCheck.Tag_Product = $slot.Tags.product $resourceCheck.Tag_Environment = $slot.Tags.environment $resourceCheck.Tag_Data = $slot.Tags.data $resourceCheck.Tag_CreatedOnDate = $slot.Tags.CreatedOnDate $resourceCheck.Tag_Deployment = $slot.Tags.drp_deployment $resourceCheck.Prop_HttpsOnly = $slot.HttpsOnly $resourceCheck.Prop_PhpVersion = $slot.SiteConfig.PhpVersion $resourceCheck.Prop_RemoteDebuggingEnabled = $slot.SiteConfig.RemoteDebuggingEnabled $resourceCheck.Prop_MinTlsVersion = $slot.SiteConfig.MinTlsVersion $resourceCheck.Prop_FtpsState = $slot.SiteConfig.FtpsState $resourceCheck.Prop_Http20Enabled = $slot.SiteConfig.Http20Enabled $resourceCheck.Prop_Identity = $slot.Identity.Type $resourceCheck.LastDeployDate = GetDeployment -siteName $webApp.Name -resourceGroupName $group.ResourceGroupName -subscriptionId $subscriptionId -slotName $slotName $Result += $resourceCheck } } } $Result | Export-Csv -Path $fileName -Append -NoTypeInformation } } Write-Host "======================================================================================================================================================================" Write-Host "Done."