I am trying to execute this script via Azure DevOps where I want to generate an assessment report for a particular Azure subscription and the resources inside it will give every detail about the resources.
so my script is working fine but the csv file is empty. Dont know why can anyone help me with what I am missing here?
here is the script that I am using:-
Parameters
$tenantId = “xxx”
$subscriptionId = “xxx”
Log in to Azure with tenant and subscription IDs
Connect-AzAccount -Tenant $tenantId -Subscription $subscriptionId -UseDeviceAuthentication
Create a report
$combinedReport = @()
Assess all the resources (Function #1: Button1)
Function Function-Assessment() {
Write-Host “n> Checking Resource Types...
n” -ForegroundColor Green
$vms = Get-AzVM
$Global:VMx = [System.Collections.ArrayList]::new()
foreach($vm in $vms)
{
$csvObject = New-Object PSObject
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Virtual Machine” -value $vm.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Resource Group” -value $vm.ResourceGroupName
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Location” -value $vm.Location
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Size” -value $vm.HardwareProfile.VmSize
if($vm.StorageProfile.OsDisk.ManagedDisk){
Add-Member -inputObject $csvObject -memberType NoteProperty -name “OS Disk Type” -value ‘Managed Disk’
Add-Member -inputObject $csvObject -memberType NoteProperty -name “VHD Uri” -value “”
}
else{
Add-Member -inputObject $csvObject -memberType NoteProperty -name “OS Disk Type” -value ‘Unmanaged Disk’ #$vm.StorageProfile.OsDisk
Add-Member -inputObject $csvObject -memberType NoteProperty -name “VHD Uri” -value $vm.StorageProfile.OsDisk.Vhd.Uri
}
Add-Member -inputObject $csvObject -memberType NoteProperty -name “DataDisk Count” -value $vm.StorageProfile.DataDisks.Count
$OperatingSys = '('+$vm.StorageProfile.ImageReference.Offer+' '+$vm.StorageProfile.ImageReference.Sku+')'
if($vm.StorageProfile.ImageReference -eq $null){ $OperatingSys = ''}
if($vm.StorageProfile.OsDisk.OsType -eq 0){
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Operating System" -value ("Windows "+$OperatingSys)
}else{Add-Member -inputObject $csvObject -memberType NoteProperty -name "Operating System" -value ("Linux "+$OperatingSys)}
if($vm.DiagnosticsProfile.BootDiagnostics.Enabled -eq $true){
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics" -value "Enabled"
}else{ Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics" -value "Disabled"}
if($vm.DiagnosticsProfile.BootDiagnostics.StorageUri){
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics Storage" -value $vm.DiagnosticsProfile.BootDiagnostics.StorageUri.Split('/')[2].Split('.')[0]
}else{ Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics Storage" -value " "}
if($vm.Plan){Add-Member -inputObject $csvObject -memberType NoteProperty -name "Plan associated?" -value 'Yes'}
else{Add-Member -inputObject $csvObject -memberType NoteProperty -name "Plan associated?" -value 'No'}
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Plan Name" -value $vm.Plan.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Publisher" -value $vm.Plan.Publisher
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Product" -value $vm.Plan.Product
$diskEncryption = Get-AzVMDiskEncryptionStatus -VMName $vm.Name -ResourceGroupName $vm.ResourceGroupName
if($diskEncryption.OsVolumeEncrypted -eq 'Encrypted'){
Add-Member -inputObject $csvObject -memberType NoteProperty -name "OsVolumeEncrypted" -value $diskEncryption.OsVolumeEncrypted
Add-Member -inputObject $csvObject -memberType NoteProperty -name "DiskEncryptionKey" -value $diskEncryption.OsVolumeEncryptionSettings.DiskEncryptionKey.SecretUrl
}else{
Add-Member -inputObject $csvObject -memberType NoteProperty -name "OsVolumeEncrypted" -value $diskEncryption.OsVolumeEncrypted
Add-Member -inputObject $csvObject -memberType NoteProperty -name "DiskEncryptionKey" -value " "
}
if($diskEncryption.OsVolumeEncryptionSettings.KeyEncryptionKey){
Add-Member -inputObject $csvObject -memberType NoteProperty -name "KeyEncryptionKey" -value $diskEncryption.OsVolumeEncryptionSettings.KeyEncryptionKey.KeyUrl
}else{
Add-Member -inputObject $csvObject -memberType NoteProperty -name "KeyEncryptionKey" -value " "
}
$i = $Global:VMx.Add($csvObject)
}
}
Check Marketplace VM (Function #2: Button2 )
Function Function-CheckMarketPlaceVM(){
Write-Host “n> Checking Virtual Machines...
n” -ForegroundColor Green
$vms = Get-AzVM
$Global:VMx = [System.Collections.ArrayList]::new()
foreach($vm in $vms)
{
$csvObject = New-Object PSObject
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Virtual Machine” -value $vm.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Resource Group” -value $vm.ResourceGroupName
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Location” -value $vm.Location
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Size” -value $vm.HardwareProfile.VmSize
if($vm.StorageProfile.OsDisk.ManagedDisk){
Add-Member -inputObject $csvObject -memberType NoteProperty -name “OS Disk Type” -value ‘Managed Disk’
Add-Member -inputObject $csvObject -memberType NoteProperty -name “VHD Uri” -value “”
}
else{
Add-Member -inputObject $csvObject -memberType NoteProperty -name “OS Disk Type” -value ‘Unmanaged Disk’ #$vm.StorageProfile.OsDisk
Add-Member -inputObject $csvObject -memberType NoteProperty -name “VHD Uri” -value $vm.StorageProfile.OsDisk.Vhd.Uri
}
Add-Member -inputObject $csvObject -memberType NoteProperty -name “DataDisk Count” -value $vm.StorageProfile.DataDisks.Count
$OperatingSys = '('+$vm.StorageProfile.ImageReference.Offer+' '+$vm.StorageProfile.ImageReference.Sku+')'
if($vm.StorageProfile.ImageReference -eq $null){ $OperatingSys = ''}
if($vm.StorageProfile.OsDisk.OsType -eq 0){
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Operating System" -value ("Windows "+$OperatingSys)
}else{Add-Member -inputObject $csvObject -memberType NoteProperty -name "Operating System" -value ("Linux "+$OperatingSys)}
if($vm.DiagnosticsProfile.BootDiagnostics.Enabled -eq $true){
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics" -value "Enabled"
}else{ Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics" -value "Disabled"}
if($vm.DiagnosticsProfile.BootDiagnostics.StorageUri){
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics Storage" -value $vm.DiagnosticsProfile.BootDiagnostics.StorageUri.Split('/')[2].Split('.')[0]
}else{ Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics Storage" -value " "}
if($vm.Plan){Add-Member -inputObject $csvObject -memberType NoteProperty -name "Plan associated?" -value 'Yes'}
else{Add-Member -inputObject $csvObject -memberType NoteProperty -name "Plan associated?" -value 'No'}
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Plan Name" -value $vm.Plan.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Publisher" -value $vm.Plan.Publisher
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Product" -value $vm.Plan.Product
$diskEncryption = Get-AzVMDiskEncryptionStatus -VMName $vm.Name -ResourceGroupName $vm.ResourceGroupName
if($diskEncryption.OsVolumeEncrypted -eq 'Encrypted'){
Add-Member -inputObject $csvObject -memberType NoteProperty -name "OsVolumeEncrypted" -value $diskEncryption.OsVolumeEncrypted
Add-Member -inputObject $csvObject -memberType NoteProperty -name "DiskEncryptionKey" -value $diskEncryption.OsVolumeEncryptionSettings.DiskEncryptionKey.SecretUrl
}else{
Add-Member -inputObject $csvObject -memberType NoteProperty -name "OsVolumeEncrypted" -value $diskEncryption.OsVolumeEncrypted
Add-Member -inputObject $csvObject -memberType NoteProperty -name "DiskEncryptionKey" -value " "
}
if($diskEncryption.OsVolumeEncryptionSettings.KeyEncryptionKey){
Add-Member -inputObject $csvObject -memberType NoteProperty -name "KeyEncryptionKey" -value $diskEncryption.OsVolumeEncryptionSettings.KeyEncryptionKey.KeyUrl
}else{
Add-Member -inputObject $csvObject -memberType NoteProperty -name "KeyEncryptionKey" -value " "
}
$i = $Global:VMx.Add($csvObject)
}
}
Classic Virtual Machines (Function #3: Button3)
Function Function-CheckClassicVirtualMachine(){
Write-Host “n> Checking Classic Virtual Machines...
n” -ForegroundColor Green
$ClassicVms = Get-AzResource -ResourceType Microsoft.ClassicCompute/virtualMachines -ExpandProperties
$Global:ClassicVMx = [System.Collections.ArrayList]::new()
foreach($ClassicVm in $ClassicVms){
$csvObject = New-Object PSObject
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Virtual Machine(Classic)” -value $ClassicVm.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Resource Group” -value $ClassicVm.ResourceGroupName
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Location” -value $ClassicVm.Location
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Status” -value $ClassicVm.Properties.instanceView.status
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Operating System” -value $ClassicVm.Properties.storageProfile.operatingSystemDisk.operatingSystem
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Cloud Service(Classic)” -value $ClassicVm.Properties.domainName.name
Add-Member -inputObject $csvObject -memberType NoteProperty -name “RG (Cloud Service)” -value $ClassicVm.Properties.domainName.id.Split(‘/’)[4]
if($ClassicVm.Properties.networkProfile.virtualNetwork){
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Virtual Network” -value $ClassicVm.Properties.networkProfile.virtualNetwork.name
}else{Add-Member -inputObject $csvObject -memberType NoteProperty -name “Virtual Network” -value ‘’}
if($ClassicVm.Properties.networkProfile.virtualNetwork.staticIpAddress){
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Static IP” -value $ClassicVm.Properties.networkProfile.virtualNetwork.staticIpAddress
}else{Add-Member -inputObject $csvObject -memberType NoteProperty -name “Static IP” -value ‘’}
if($ClassicVm.Properties.instanceView.publicIpAddresses){
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Public IP” -value $ClassicVm.Properties.instanceView.publicIpAddresses[0]
}else{Add-Member -inputObject $csvObject -memberType NoteProperty -name “Public IP” -value ‘’}
if($ClassicVm.Properties.networkProfile.reservedIps){
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Reserved IP” -value $ClassicVm.Properties.networkProfile.reservedIps[0].name
}else{Add-Member -inputObject $csvObject -memberType NoteProperty -name “Reserved IP” -value ‘’}
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Storage Account” -value $ClassicVm.Properties.storageProfile.operatingSystemDisk.storageAccount.name
$i = $Global:ClassicVMx.Add($csvObject)
}
}
Check App Services (Function #4: Button4)
Function Function-CheckAppServiceAndPlan(){
Write-Host “n> Checking App Service Plans and App Services...
n” -ForegroundColor Green
$Global:AppPlanx = [System.Collections.ArrayList]::new()
#$Appx = [System.Collections.ArrayList]::new()
$AppServices = Get-AzResource -ResourceType Microsoft.Web/sites -ExpandProperties
$WebApps = Get-AzResource -ResourceType Microsoft.Web/sites/slots -ExpandProperties
$WebAppPlans = Get-AzResource -ResourceType Microsoft.Web/serverfarms -ExpandProperties
foreach($Plan in $WebAppPlans){
$csvObject = New-Object PSObject
$AppS = $AppServices | Where-Object { $_.Properties.serverFarmId -eq $Plan.Id}
$SlotS = $WebApps | Where-Object { $_.Properties.serverFarmId -eq $Plan.Id}
$WebSpace = $Plan.Properties.webSpace
if($WebSpace.Contains('-')){
$OriginRG = $WebSpace.Substring(0,$WebSpace.LastIndexOf('-'))
}else{ $OriginRG = 'Not Found'}
$sites = "[ App-"+$AppS.Count + " | Slot-"+ $SlotS.count+" ]"
Add-Member -inputObject $csvObject -memberType NoteProperty -name "App Service Plan" -value $Plan.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name "App Service" -value $sites
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Status" -value $Plan.Properties.status
Add-Member -inputObject $csvObject -memberType NoteProperty -name "WebSpace" -value $WebSpace
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Origin RG" -value $OriginRG
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Current RG" -value $Plan.ResourceGroupName
if($Plan.ResourceGroupName -eq $OriginRG){
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Internal Move" -value "Not require"
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Move Resource" -value "---"
}
elseif($OriginRG -eq 'Not Found'){
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Internal Move" -value "Unknown"
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Move Resource" -value "Unknown"
}
else{
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Internal Move" -value "Require"
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Move Resource" -value ("From: "+ $Plan.ResourceGroupName + " -> To: " + $OriginRG)
}
$i = $Global:AppPlanx.Add($csvObject)
foreach($app in $AppS){
$csvObject2 = New-Object PSObject
$b = $app.Properties.serverFarmId -match "/providers/Microsoft.Web/serverfarms/(?<content>.*)"
$planname = $matches['content']
$appWebSpace = $app.Properties.webSpace
if($appWebSpace.Contains('-')){
$OriginRG = $appWebSpace.Substring(0,$appWebSpace.LastIndexOf('-'))
}else{ $OriginRG = 'Not Found'}
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "App Service Plan" -value (' ...')
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "App Service" -value $app.name
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Status" -value $app.Properties.state
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "WebSpace" -value $appWebSpace
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Origin RG" -value $OriginRG
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Current RG" -value $app.ResourceGroupName
if($app.ResourceGroupName -eq $OriginRG){
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Internal Move" -value "Not require"
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Move Resource" -value "---"
}
elseif($OriginRG -eq 'Not Found'){
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Internal Move" -value "Unknown"
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Move Resource" -value "Unknown"
}
else{
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Internal Move" -value "Require"
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Move Resource" -value ("From: "+ $app.ResourceGroupName + " -> To: " + $OriginRG)
}
$j = $Global:AppPlanx.Add($csvObject2)
}
foreach($slot in $SlotS){
$csvObject3 = New-Object PSObject
$b = $slot.Properties.serverFarmId -match "/providers/Microsoft.Web/serverfarms/(?<content>.*)"
$planname = $matches['content']
$appWebSpace = $slot.Properties.webSpace
if($appWebSpace.Contains('-')){
$OriginRG = $appWebSpace.Substring(0,$appWebSpace.LastIndexOf('-'))
}else{ $OriginRG = 'Not Found'}
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "App Service Plan" -value (' ...')
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "App Service" -value $slot.name
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Status" -value $slot.Properties.state
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "WebSpace" -value $appWebSpace
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Origin RG" -value $OriginRG
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Current RG" -value $slot.ResourceGroupName
if($slot.ResourceGroupName -eq $OriginRG){
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Internal Move" -value "Not require"
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Move Resource" -value "---"
}
elseif($OriginRG -eq 'Not Found'){
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Internal Move" -value "Unknown"
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Move Resource" -value "Unknown"
}
else{
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Internal Move" -value "Require"
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Move Resource" -value ("From: "+ $slot.ResourceGroupName + " -> To: " + $OriginRG)
}
$j = $Global:AppPlanx.Add($csvObject3)
}
}
}
Check App Services (Function #4: Button4)
Function Function-CheckAppServiceAndPlan(){
Write-Host “n> Checking App Service Plans and App Services...
n” -ForegroundColor Green
$Global:AppPlanx = [System.Collections.ArrayList]::new()
#$Appx = [System.Collections.ArrayList]::new()
$AppServices = Get-AzResource -ResourceType Microsoft.Web/sites -ExpandProperties
$WebApps = Get-AzResource -ResourceType Microsoft.Web/sites/slots -ExpandProperties
$WebAppPlans = Get-AzResource -ResourceType Microsoft.Web/serverfarms -ExpandProperties
foreach($Plan in $WebAppPlans){
$csvObject = New-Object PSObject
$AppS = $AppServices | Where-Object { $_.Properties.serverFarmId -eq $Plan.Id}
$SlotS = $WebApps | Where-Object { $_.Properties.serverFarmId -eq $Plan.Id}
$WebSpace = $Plan.Properties.webSpace
if($WebSpace.Contains('-')){
$OriginRG = $WebSpace.Substring(0,$WebSpace.LastIndexOf('-'))
}else{ $OriginRG = 'Not Found'}
$sites = "[ App-"+$AppS.Count + " | Slot-"+ $SlotS.count+" ]"
Add-Member -inputObject $csvObject -memberType NoteProperty -name "App Service Plan" -value $Plan.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name "App Service" -value $sites
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Status" -value $Plan.Properties.status
Add-Member -inputObject $csvObject -memberType NoteProperty -name "WebSpace" -value $WebSpace
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Origin RG" -value $OriginRG
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Current RG" -value $Plan.ResourceGroupName
if($Plan.ResourceGroupName -eq $OriginRG){
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Internal Move" -value "Not require"
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Move Resource" -value "---"
}
elseif($OriginRG -eq 'Not Found'){
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Internal Move" -value "Unknown"
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Move Resource" -value "Unknown"
}
else{
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Internal Move" -value "Require"
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Move Resource" -value ("From: "+ $Plan.ResourceGroupName + " -> To: " + $OriginRG)
}
$i = $Global:AppPlanx.Add($csvObject)
foreach($app in $AppS){
$csvObject2 = New-Object PSObject
$b = $app.Properties.serverFarmId -match "/providers/Microsoft.Web/serverfarms/(?<content>.*)"
$planname = $matches['content']
$appWebSpace = $app.Properties.webSpace
if($appWebSpace.Contains('-')){
$OriginRG = $appWebSpace.Substring(0,$appWebSpace.LastIndexOf('-'))
}else{ $OriginRG = 'Not Found'}
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "App Service Plan" -value (' ...')
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "App Service" -value $app.name
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Status" -value $app.Properties.state
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "WebSpace" -value $appWebSpace
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Origin RG" -value $OriginRG
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Current RG" -value $app.ResourceGroupName
if($app.ResourceGroupName -eq $OriginRG){
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Internal Move" -value "Not require"
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Move Resource" -value "---"
}
elseif($OriginRG -eq 'Not Found'){
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Internal Move" -value "Unknown"
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Move Resource" -value "Unknown"
}
else{
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Internal Move" -value "Require"
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Move Resource" -value ("From: "+ $app.ResourceGroupName + " -> To: " + $OriginRG)
}
$j = $Global:AppPlanx.Add($csvObject2)
}
foreach($slot in $SlotS){
$csvObject3 = New-Object PSObject
$b = $slot.Properties.serverFarmId -match "/providers/Microsoft.Web/serverfarms/(?<content>.*)"
$planname = $matches['content']
$appWebSpace = $slot.Properties.webSpace
if($appWebSpace.Contains('-')){
$OriginRG = $appWebSpace.Substring(0,$appWebSpace.LastIndexOf('-'))
}else{ $OriginRG = 'Not Found'}
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "App Service Plan" -value (' ...')
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "App Service" -value $slot.name
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Status" -value $slot.Properties.state
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "WebSpace" -value $appWebSpace
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Origin RG" -value $OriginRG
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Current RG" -value $slot.ResourceGroupName
if($slot.ResourceGroupName -eq $OriginRG){
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Internal Move" -value "Not require"
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Move Resource" -value "---"
}
elseif($OriginRG -eq 'Not Found'){
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Internal Move" -value "Unknown"
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Move Resource" -value "Unknown"
}
else{
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Internal Move" -value "Require"
Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Move Resource" -value ("From: "+ $slot.ResourceGroupName + " -> To: " + $OriginRG)
}
$j = $Global:AppPlanx.Add($csvObject3)
}
}
}
App Service SSL Bindings (Function #5: Button5)
Function Function-CheckAppServiceCertBinding(){
Write-Host “n> Checking App Service Certificate bindings...
n” -ForegroundColor Green
$appSerCerts = Get-AzWebAppCertificate
$hash = @{}
foreach($cer in $appSerCerts){
$RG = ($cer.Id.split(‘/’))[4]
$Thumb = $cer.Thumbprint
$hash[$Thumb+$RG]= @($RG,$cer.Name)
}
$AppServices = Get-AzResource -ResourceType Microsoft.Web/sites -ExpandProperties
$WebApps = Get-AzResource -ResourceType Microsoft.Web/sites/slots -ExpandProperties
$Global:BinDx = [System.Collections.ArrayList]::new()
foreach($App in $AppServices){
$appWebSpace = $App.Properties.webSpace
if($appWebSpace.Contains('-')){
$OriginRG = $appWebSpace.Substring(0,$appWebSpace.LastIndexOf('-'))
}else{ $OriginRG = 'Not Found'}
$sslBind = $App.Properties.hostNameSslstates
foreach($sb in $sslBind){
$csvObject = New-Object PSObject
if($sb.sslState -eq 'Disabled'){continue}
$tmp = $sb.thumbprint+$App.ResourceGroupName
$tmp1 = $sb.thumbprint
if($hash.$tmp){$certName = $hash.$tmp[1];$certRG = $hash.$tmp[0]}
else{$certName = ''; $certRG = '' }
Add-Member -inputObject $csvObject -memberType NoteProperty -name "App Service" -value $App.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Host Name" -value $sb.name
Add-Member -inputObject $csvObject -memberType NoteProperty -name "SSL State" -value $sb.sslState
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Thumbprint" -value $sb.thumbprint
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Thumbprint RG" -value $certRG
Add-Member -inputObject $csvObject -memberType NoteProperty -name "App Service Origin RG" -value $OriginRG
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Microsoft.web/certificate" -value $certName
$i = $Global:BinDx.Add($csvObject)
}
}
foreach($App in $WebApps){
$appWebSpace = $App.Properties.webSpace
if($appWebSpace.Contains('-')){
$OriginRG = $appWebSpace.Substring(0,$appWebSpace.LastIndexOf('-'))
}else{ $OriginRG = 'Not Found'}
$sslBind = $App.Properties.hostNameSslstates
foreach($sb in $sslBind){
$csvObject2 = New-Object PSObject
if($sb.sslState -eq 'Disabled'){continue}
$tmp = $sb.thumbprint+$App.ResourceGroupName
if($hash.$tmp){$certName = $hash.$tmp[1];$certRG = $hash.$tmp[0]}
else{$certName = "";$certRG = ""}
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "App Service" -value $App.Name
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Host Name" -value $sb.name
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "SSL State" -value $sb.sslState
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Thumbprint" -value $sb.thumbprint
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Thumbprint RG" -value $certRG
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "App Service Origin RG" -value $OriginRG
Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Microsoft.web/certificate" -value $certName
$i = $Global:BinDx.Add($csvObject2)
}
}
}
Call the functions to perform the assessments
Function-Assessment
Function-CheckMarketPlaceVM
Function-CheckClassicVirtualMachine
Function-CheckAppServiceCertBinding
Function-CheckAppServiceAndPlan
Export the combined report to a single CSV file
$combinedReport | Export-Csv -Path “test.csv” -NoTypeInformation
Write-Host “Resource report generated and saved to test.csv”
Please help me