1+ <#
2+ . SYNOPSIS
3+ Retrieve Apps using a App Service Plan without VNET Integration in the current Tenant
4+
5+ . DESCRIPTION
6+ This script will do the following steps:
7+
8+ -Retrieve App Service Plan accross the Tenant
9+ -Check if they have a VNET Integration present
10+ -If Not, retrieve the WebApp using the App Service Plan
11+ -Output the result
12+ . EXAMPLE
13+ ./Apps_without_VNETIntegration.ps1
14+
15+ Output the Apps using a App Service Plan without VNET Integration
16+ . EXAMPLE
17+ ./Apps_without_VNETIntegration.ps1|
18+ Export-Csv report.csv
19+
20+ Send the output to an excel report
21+ . LINK
22+ https://github.com/lazywinadmin/PowerShell
23+ . NOTES
24+
25+ # TODO
26+ -Support for retries
27+
28+ # Resources
29+ * List VnetIntegration in a particular RG for a App Service Plan
30+ az appservice vnet-integration list -g <resource group name> --plan <app Service plan name>
31+ * Creating VNET Integration
32+ https://stackoverflow.com/questions/59976040/how-do-you-associate-an-azure-web-app-with-a-vnet-using-powershell-az
33+
34+ #>
35+ [CmdletBinding ()]
36+ PARAM ()
37+ try {
38+ # Load Module
39+ $Dependencies = @ (" Az.ResourceGraph" , " Az.Accounts" )
40+ if (-not (Get-Module - Name $Dependencies )){$Dependencies | import-Module }
41+ # Functions
42+ function Get-AzToken {
43+ <#
44+ . SYNOPSIS
45+ Retrieve token of the current Azure Context session
46+ . DESCRIPTION
47+ Retrieve token of the current Azure Context session
48+ This is using the Get-AzContext cmdlets from the module Az.Account and assume a session is already opened.
49+ . EXAMPLE
50+ $token=Get-AzToken
51+ $uri = "https://management.azure.com/tenants?api-version=2019-11-01"
52+ invoke-restmethod -method get -uri $uri -Headers @{Authorization="Bearer $token";'Content-Type'='application/json'}
53+ This leverate the token of the current session to query the Azure Management
54+ API and retrieves all the tenants information
55+ . LINK
56+ https://github.com/lazywinadmin/PowerShell
57+ #>
58+ [CmdletBinding ()]
59+ Param ()
60+ try {
61+ $currentAzureContext = Get-AzContext
62+ $azureRmProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider ]::Instance.Profile;
63+ $profileClient = New-Object - TypeName Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient($azureRmProfile )
64+ $profileClient.AcquireAccessToken ($currentAzureContext.Subscription.TenantId ).AccessToken
65+ }catch {
66+ throw $_
67+ }
68+ }
69+ # Connect to Azure
70+ if (-not (Get-AzContext )){Connect-AzAccount }
71+
72+ # Retrieve All the App Service Plan (ServerFarms) using Resource Graph
73+ $servicePlans = Search-AzGraph - Query " Resources | where type == 'microsoft.web/serverfarms'" - First 1000
74+
75+ # Get Current token
76+ $token = Get-AzToken
77+
78+ foreach ($sp in $serviceplans ){
79+ Write-Verbose - Message " Service Plan: '$ ( $sp.name ) ' - VNET Integration - Retrieving..."
80+ $uri = " https://management.azure.com/subscriptions/$ ( $sp.subscriptionId ) /resourceGroups/$ ( $sp.resourcegroup ) /providers/Microsoft.Web/serverfarms/$ ( $sp.name ) /virtualNetworkConnections?api-version=2019-08-01"
81+ $Result = invoke-restmethod - method get - uri $uri - Headers @ {Authorization = " Bearer $token " ;' Content-Type' = ' application/json' } - verbose:$false
82+
83+ if (-not $result ){
84+ Write-Verbose - Message " Service Plan: '$ ( $sp.name ) ' - VNET Integration - Not present..."
85+ Write-Verbose - Message " Service Plan: '$ ( $sp.name ) ' - Retrieving Apps using this App Service Plan..."
86+ $Apps = Search-AzGraph - Query " Resources |where properties.serverFarmId contains '$ ( $sp.id ) '" - first 1000
87+
88+ foreach ($app in $apps )
89+ {
90+ [pscustomobject ]@ {
91+ AppServicePlanName = $sp.name
92+ AppServicePlanResourceId = $sp.id
93+ AppName = $app.name
94+ AppResourceId = $app.id
95+ AppResourceType = $app.type
96+ }
97+
98+ }
99+ }
100+ }
101+ }catch {
102+ throw $_
103+ }
0 commit comments