Blog Post

Azure Migration and Modernization Blog
12 MIN READ

Using Azure Functions to read AVS data via Powershell, PowerCLI, and the API

FastTrack_Mark's avatar
Apr 20, 2025

This function enables you to pull data from Azure VMware Solution vCenter, NSX-T and HCX appliances that is not currently surfaced through Azure Diagnostics. The data is then stored in a Log Analytics Workspace that can be queried (and alerted on) using standard Azure tools. You can create these resource in multiple Resource Groups (RG) depending on your RBAC and overall architecture. For this example, a single RG is being used, that is called AVS-Canada-Central. Note that Functions are Region specific, they cannot span regions and the storage account required must also be in the same region.

Gotcha’s

  • Functions are region specific.
  • Functions require a small (ie /28)
  • Do not use “ –  “ if Azure functions, use “ _ “ if you need a spacer.
  • Pay attention to the sections on RBAC and system managed identities.

 

Build Order

 

  1. Create or identify the Log Analytics Workspace that will be used for storage diagnostics.

 

  1. Create a KeyVault and set the RBAC properties to allow creation of secrets.

 

  1. Create KeyVault secrets to hold the account IDs and account passwords that will be used to authenticate to the vCenter, NSX-T and HCX appliances.

 

  1. Create/identify a storage account and an empty subnet that will be used by the function.

 

  1. Create the Function App

 

  1. Creating the Functions App common variable retrieval code (shared by all functions)

 

  1. Example 1: Retrieving vCenter data

 

  1. Example 2: Retrieving NSXT data

 

  1. Example 3: Retrieving PowerCLI data from HCX

 

 

 

 

 

 

1.      Create or identify a Log Analytics Workspace

If you are running Azure VMware Solution already, you should have Diagnostics enabled and be forwarding logs to that workspace.

To identify the workspace, select the ‘Diagnostics’ option and record the name of the log space.  In this case it is ‘AVSRelatedLogsOnly’.

 

 

If you have not yet enabled diagnostics, follow the instructions found here.  Configure Azure VMware Solution diagnostics.

 

Do not proceed to the next step until this is complete.

 

 

 

 

2.      Create a KeyVault

Create a KeyVault if there isn’t one already.  This example uses the default settings so once the Basics tab is complete, select the ‘Review + Create’, then ‘Create’.

 

  

 

 
 


The summary page should look like this

 

 

 

 

 

Note, the creation of private endpoints for this scenario will be covered in the future.

 

 

 

Before you can store secrets RBAC settings need to be applied because by default the user who creates the KeyVault cannot create secrets.

  1. a) Go to Access Control, add a Role Assignment, add yourself as the KeyVault Administrator.

 

 

 

  1. b) Then click ‘Review and assign’

 

  1. c) Next, switch back to the function, and under Identity, select System assigned, then click Save.

 

 

Note that this will use this identity for every function in the function app

 

 

 

  1. d) Once that has been created – click on the ‘Azure role Assignment’

 

 

  1. e) Select ‘Add role assignment’ then select a scope of ‘KeyVault’, make sure you’ve got the right subscription, and then select name of the KeyVault you are using. The Role required is ‘Key Vault Secrets User’

 

 

  1. f) Click ‘Save’

 

3.      Add KeyVault Secrets

  1. a) Return to KeyVault and select ‘Secrets’. Now you should be able to click on the ‘Generate/Import’ option to create a secret. If this fails, go back and check the role assignment requirements above.

 

 

 

 

 

  1. b) Using the Generate/Import we will fill the following five secrets, one for each variable required in the function: $sharedKey, $avs-VCenterAdmin, $avs-VCenterAdminPassword, $avs-NSXTAdmin, $avs-NSXTAdminPassword.

 

 

Note:  There a number of options here.  In this example we are using the CloudAdmin@vsphere.local to access the vCenter and HCX APIs.  For the NSX-T, we will use the CloudAdmin account.  In production you would likely use an LDAP account with administrative access to both environments, or two separate accounts for added security.

 

  1. $sharedKey

 

Open a second portal tab and go to the log analytics workspace we identified above called AVSRelatedLogsOnly and select Agents, then copy the primary key.

 

 

 

Return to the Generate/Import screen and fill in the Name “sharedKey” and the Secret value with the primary key copied from log analytics workspace.  Fill in the content type description.

 

 

 

Click Create

 

 

  1. $avs-vCenterAdmin

 

Click on the Generate/Import to create the next secret.  For queries that will connect to vCenter or HCX go to the AVS SDDC instance in the portal, select VMware Credential, and then copy the username, ‘cloudadmin@vsphere.local’ .  Note that in production you should use an identity that has read-only rights.

 

Add the ‘cloudadmin@vsphere.local” as the Secret value for the avs-vCenterAdmin secret.

 

 

Click Create

 

  1. $avs-vCenterAdminPassword

 

Click on the Generate/Import to create the next secret.  For queries that will connect to vCenter or HCX go to the AVS private cloud instance in the portal, select ‘VMware credentials’, and then copy the cloudadmin@vsphere.local password.  Paste it in as the ‘Secret value’

 

 

 

Click Create

 

  1. $avs-NSXTAdmin

 

Add the user account that can read the NSXT data. In this example, the NSXT cloudadmin account is being used. 

 

 

Click Create

 

 

  1. $avs-NSXTAdminPassword

Add the password for the user account that will be used to read the NSXT data.

 

 

             Click ‘Create’

When this is complete, the Secrets view of the KeyVault should look something like this.

 

 

 

 

4.      Create a storage account and an empty subnet for the Function App.

 

  1. Create a storage account

A storage account is required in the same region as the Function App.  Create a storage account with the following configuration.

 

 

 

The other parameter tabs are not required for this example.

Click ‘Create’

 

  1. Create an empty subnet

The function has to be able to reach the vCenter, NSXT and HCX appliances by IP address.  Function Apps require an empty subnet on a network that is connected to the AVS environment.

Create a subnet on an network that is able to reach the AVS environment and check to make sure there are no Firewalls or other restrictions in place.

In this example, on the vNet called Core-vNet, a subnet called AV-CC-FunctionSubnet has been created.  The minimum size is a /30.  Generally a larger subnet should be used if multiple Function Apps will use it.

 

              

 

 

 

5.      Initial Function App Build

Select Function App in the Azure portal then click on ‘+ Create’.  This will launch the Function App wizard.

 

  1. Select a hosting plan:  Choose Functions Premium, it is the most cost effective plan that supports network integration, which is required for this function. Then click ‘Select’

 

 

 

 

  1. Fill in the basics tab – we are using names specific to this lab, follow your own naming conventions.
  2. Subscription where your SDDC exists
  3. Resource Group                     “AVS-Canada-Central”
  4. Function App name                     “AVS-CC-FunctionApp
  5. Deploy code/container        “Code”
  6. Runtime stack               “PowerShell Core”
  7. Version                                  “7.4”  (minimum)
  8. Region                     Canada-Central
  9. Operating System               “Windows”
  10. Windows Plan                     “CC-ASP-AVS”
  11. Pricing plan*                     “Elastic Premium EP1”   (start small)
  12. Zone redundancy               “Disabled”  (go to Enabled when moving to prod)

 

*Note that not all service plans are available in all regions.

 

 

 

 

Click Next: Storage

 

 

 

  1. If a storage account was not created, you can create one here, otherwise, select the storage account completed above in Part 4.

Select ‘Configure basic diagnostics settings now” and select the Log Analytics Workspace identified in part 1.

 

Storage account:       avsccfunctionapp (v2)

LAW:                  AVSRelatedLogsOnly

 

 

 

Click Next: Networking

 

 

 

  1. The Function App needs to be able to connect to a subnet that can reach the AVS management servers.  For this example we are not using private endpoints.  Select ‘Enable vNet Integration and then select the subnet connected in step 3.

 

 

 

Click Next: Monitoring

 

  1. Under monitoring, set ‘Enable application insights’ to yes so that we can see the logs.  Create a new Application insights.  This is useful for troubleshooting.

 

 

 

 

 

 

And then use the Log Ananytics Workspace that was defined in the prerequisites or one that already exists

 

 

 

Click OK to close the ‘New Application Insights’ pane

Click Next:Deployment

 

  1. Under deployment, leave this empty, this example will not use CI/DC or store any code in Github.  However, it is strongly recommended that you do use infrastructure as code to deploy this function if you have multiple  SDDCs.  (Each function app is available only to SDDCs located in the same region).

 

  1. Click Next: Tags

 

  1. Add any tags you want applied

Click Next: Review + Create , then when the validation is completed

 

 

 

Click:  Create 

 

Note:

There is an option beside the Create button to download a template for this function app.

 

 

 

  1. Once the validation is complete and the build runs the following screen should be visible.

 

 

 

 

Click on “Go to resource”

 

CHECK FUNCTION NETWORK INTEGRATION (Outbound Internet Traffic is enabled – might need to disable – don’t know what this actually means).

 

  1. Install the relevant modules (KeyVault, LogAnalytics, PowerCLI).

 

These are the modules that will load so that the function works with the various services and commands.

 

Click on the App Files and then using the pull-down, select ‘requirements.psd1’

 

 

 

 

 

Now insert the following text below line 7.  These are the PowerShell modules required to run the commands that are being called from the Function code.

 

'Az.KeyVault' = '5.3.0'

'Az.LogAnalytics' = '1.0.1'

'VMware.PowerCLI' = '13.2.1.22851661'

 

So that it looks like this:

 

 

 

Add in the az.vmware version 0.7.1  to this list

 

To check for the latest version, go to the www.powershellgallery.com.  This example looks for the PowerCLI latest verions, search for az.KeyVault and az.LogAnalytics as well.

 

 

 

 

 

  1. Create a managed identity for the function so that it can access the KeyVault.

From the Function App portal page, click on Identity, turn the Status to On, and then click on the Save icon, and click Yes to enable it.

 

 

 

 

 

Now we need configure the ‘Azure role assignments’

 

 

 

 

Then click on the ‘+Add role assignments (Preview) and complete the assignment by selecting the Scope as KeyVault, the correct subscription, the KeyVault we are using (CC-AVS-KeyVault) and the Role of “KeyVault Secrets User.  This role is the minimum required permission for the system assigned identity to read the secret values.

 

 

 

 

The click Save

 

 

 

6.      Creating the Functions App common variable retrieval code

Now that the function app has been configured to support the function we want to execute, the functions themselves need to be defined.

  1. From the Function App screen click on ‘Create function’

 

 

 

 

Select the ‘Timer trigger’ as this function, as most in this category of monitoring/alerting, will be run on a schedule.

 

 

 

Click Create.

 

 

On the template details screen, change the ‘Function name’ to match the function’s function.

Use the Schedule to determine how often the function should run.  Note the format is based on Cron job scheduling (see link in the ‘Appendix’).  In this case, the function is set to run every 5 minutes.

 

 

             Then click ‘Create’ at the bottom of the screen.

 

  1. This will result in the following screen

 

 

Save this for now. Close the window using the  X  in the top right hand corner and select ‘Environment Variables’ from the menu on the left hand side.

 

 

 

  1. On the Environment variables page, click on +Add and enter the following variables. For multi-region vCenters, use a more complex naming convention (ie when you have multiple SDDCs).

 

  1. Name:              vCenterURL

Value:                https://10.4.0.2                (your vCenter instance IP address)

 

  1. Name:              NSXTURL

Value:                https://10.4.0.3                (your NSX-T instance IP address)

 

  1. Name: HCXRL

Value:                https://10.4.0.9                (your HCX instance IP address)

 

  1. Name:              KeyVaultName

Value:                 CC-AVS-Keyvault             (name of the KeyVault created in the prereqs)

 

             Click on the +Add and enter the values above for each of the 4 variables.

 

 

 

 

 

 

 

 

 

 

 

The result should end up with app settings that look like this

 

 

Click ‘Apply’ to save the Environment variables.

 

  1. Add the Environment variables and KeyVault secrets to the Get-vCenter-Data app.

Click on the Overview to show the functions page, and select the ‘CheckStorageTime’ function we created above.

 

 

Delete lines 4 to 14.

Step 1 – Add the Environment Variables

 

# Environment Variables

$LogType="AVSLogs"

$KeyVaultName=$env:KeyVaultName

$HCX-URL = $env:HCXURL

$vCenter-URL = $env:vCenterURL

$NSXT-URL = $env:NSXTURL

 

                           The result should look like this:

 

 

 

 

Step 2 – Add the KeyVault Variables

# KeyVault Secret Variables

$SharedKey=                               Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name                                                                           "sharedkey" -asplaintext

$avs-vCenterAdmin=                  Get-AzKeyVaultSecret -VaultName $KeyVaultName
                                                     -Name "avs-vCenterAdmin" -asplaintext

$avs-NSXTAdmin=                      Get-AzKeyVaultSecret -VaultName $KeyVaultName
                                                     -Name "avs-NSXTAdmin" -asplaintext

$avs-vCenterAdminPassword=              Get-AzKeyVaultSecret -VaultName $KeyVaultName
                                                     -Name " avs-vCenterAdminPassword " -asplaintext

$avs-NSXTAdminPassword=              Get-AzKeyVaultSecret -VaultName $KeyVaultName
                                                                   -Name " avs- NSXTAdminPassword " -asplaintext

 

The result should look like this:

 

 

 

Resources

Cron job format and time zone: https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules

 

Troubleshooting

 

Variable retrievals

If you run a Code+Test, then lines 18 to 31 can be used to validate the environment variables and KeyVault secrets are being retrieved successfully.

 

OUTPUT: vCenterURL: https://10.2.0.2

OUTPUT: HCXURL: https://10.2.0.9

OUTPUT: NSXTURL: https://10.2.0.3

OUTPUT: KeyVault: CC-AVS-Keyvault

OUTPUT: LogAnalyticsKey:pHtIGvsRJurkTC4dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

OUTPUT: avsvCenterAdmin:cloudadmin@vsphere.local

OUTPUT: avsNSXTAdmin:cloudadmin

OUTPUT: avsvCenterAdminPassword:03Kxxxxxxxx

OUTPUT: avsNSXTAdminPassword:j1hQbxxxxxxxx

 

Lines 33 to 40 are used to validate network connectivity between the function the and the IP address of the vCenter, HCX and NSXT virtual machines.

The results should look like this and show True:

 

 

 

Sample showing the code required to retrieve the variables from KeyVault:

 

  1. $sharedKey=Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name "SharedKey" -asplaintext

  2. $avsVCenterAdmin=Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name "avsVCenterAdmin" -asplaintext
  3. $avsVCenterAdminPassword=Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name "avsVCenterAdminPassword" -asplaintext

  4. $avsNSXTAdmin= Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name "avsNSXTAdmin" -asplaintext
  5. $avsNSXTAdminPassword= Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name "avsNSXTAdminPassword" -asplaintext

 

 

 

 

Example 1 - Diagnostics Available

This is a simple script to check that the diagnostics for the service is turned on.  I've left in lots of lines as comments that were used during troubleshooting and validation.  The output is to the AVS_Diagnostics table; which is automatically created the first time you run the script.

 

# Input bindings are passed in via param block.

param($Timer)

# Environment Variables

$LogType="AVS_DiagnosticsStatus"

$KeyVaultName=$env:KeyVaultName

$HCXURL = $env:HCXURL

$vCenterURL = $env:vCenterURL

$NSXTURL = $env:NSXTURL

$CustomerID = $env:LAW_WorkSpace_ID

# KeyVault Secrets

$SharedKey=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name "avsLAWKey" -asplaintext

$avsvCenterAdmin=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name "avsvCenterAdmin" -asplaintext

$avsNSXTAdmin=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name "avsNSXTAdmin" -asplaintext

$avsvCenterAdminPassword=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name "AVSSDDCvCentrerAdminAccountPassword" -asplaintext

$avsNSXTAdminPassword=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name "avsNSXTAdminPassword" -asplaintext

$avsLAWSecret=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name "avsLAWKey" -asplaintext

$avsTenantID=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name "avsTenantID" -asplaintext

#Note this example uses the cloudadmin@vsphere.local account to authenticate with both vCenter and HCX

#Note this example uses cloudadmin account to authenticate with NSXT

# The following are used for checking that environment variables and keyvault secrets are being retrieved.

 "LAWSharedKey: $sharedKey"

 "CustomerID: $CustomerID"

# "vCenterURL: $vCenterURL"

# "HCXURL: $HCXURL"

# "NSXTURL: $NSXTURL"

# "KeyVault: $KeyVaultName"

# "LogAnalyticsKey:$SharedKey”

# “avsvCenterAdmin:$avsvCenterAdmin”

# “avsNSXTAdmin:$avsNSXTAdmin”

# “avsvCenterAdminPassword:$avsvCenterAdminPassword”

# “avsNSXTAdminPassword:$avsNSXTAdminPassword”

# The following are used to verify network connectivity to the vCenter, HCX and NSXT

# $vCenter=Test-connection $vCenterURL.trim("https://") -tcpport 443

# $VCntr=Test-connection $vCenterURL.trim("https://") -tcpport 443

# $HCX=Test-connection $HCXURL.trim("https://") -tcpport 443

# $NSXT=Test-connection $NSXTURL.trim("https://") -tcpport 443

# "VC Network connection valid: $vCntr"

# "HC Network connection valid: $HCX"

# Create Credential Automatically for NSXT (ENABLED)

# END of the variable definitions and authentication process - this is repeatable for all powershell and URI queries.

# ___________________________________________________________________________________________________________________

#Get list of private clouds

$ListOfSDDCs = Get-AzVmwarePrivateCloud

$result = @()

$counter = 0

ForEach ($SDDCName in $ListOfSDDCs.Name) {

   

    # Get the diagnostics setting for the cloud

    $RGName=$ListOfSDDCs[$counter].ResourceGroupName

    $SDDCName=$ListOfSDDCs[$counter].Name

 

    $counter += 1

    $SDDCResourceID = get-azresource -Resourcegroupname $RGName -resourcename $SDDCName | Select-Object -ExpandProperty ResourceId

    $DiagName =Get-AzDiagnosticSetting -ResourceId $SDDCResourceID | Select-Object -ExpandProperty Name

           

    if ($DiagName) {

        $LAWworkspace = Get-AzDiagnosticSetting -ResourceId $SDDCResourceID | Select-Object -ExpandProperty WorkspaceId

        $LAWworkspace = split-path $LAWworkspace -Leaf

        $Enabled = "Yes"

    } else {

       $Enabled = "No"

       $Diagname = "-"

       $LAWworkspace = "-"

    }

   

    $object = [PSCustomOBject]@{

        SDDC = $SDDCName

        Enabled = $Enabled

        LAW_Workspace = $LAWworkspace

        Diagnostics = $DiagName

    }

     $result += $object

}

# $result

#"___________________________________________________________"

 

$ResultData = $result | ConvertTo-Json -Depth 100

$ResultData

 Send-LogToLogAnalytics -CustomerId $CustomerId `

                         -SharedKey $sharedKey `

                         -Log $ResultData `

                         -LogType $LogType

 

 

Example 2:  vCenter Alerts

In this example we use the PowerCLI add on to pull all open alerts from vCenter.  Note again that I have left in a number of lines commented out that were used for troubleshooting.

 

# Input bindings are passed in via param block.

param($Timer)

# Environment Variables

$LogTable="TempTable"

$KeyVaultName=$env:KeyVaultName

$HCXURL = $env:HCXURL

$vCenterURL = $env:vCenterURL

$NSXTURL = $env:NSXTURL

$CustomerID = $env:LAW_WorkSpace_ID

# KeyVault Secrets

$SharedKey=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name "avsLAWKey" -asplaintext

$avsvCenterAdmin=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name "avsvCenterAdmin" -asplaintext

$avsNSXTAdmin=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name "avsNSXTAdmin" -asplaintext

$avsvCenterAdminPassword=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name "AVSSDDCvCentrerAdminAccountPassword" -asplaintext

$avsNSXTAdminPassword=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name "avsNSXTAdminPassword" -asplaintext

$avsLAWSecret=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name "avsLAWKey" -asplaintext

#Note this example uses the cloudadmin@vsphere.local account to authenticate with both vCenter and HCX

#Note this example uses cloudadmin account to authenticate with NSXT

# The following are used for checking that environment variables and keyvault secrets are being retrieved.

# "LAWSharedKey: $sharedKey"

# "CustomerID: $CustomerID"

# "vCenterURL: $vCenterURL"

# "HCXURL: $HCXURL"

# "NSXTURL: $NSXTURL"

# "KeyVault: $KeyVaultName"

# "LogAnalyticsKey:$SharedKey”

# “avsvCenterAdminPassword:$avsvCenterAdminPassword”

# “avsNSXTAdminPassword:$avsNSXTAdminPassword”

 Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false

# END of the variable definitions and authentication process - this is repeatable for all powershell and URI queries.

# ___________________________________________________________________________________________________________________

$vCenter = Connect-viserver $vCenterURL.trim('https://') -protocol https -user $avsvCenterAdmin -password $avsvCenterAdminPassword

function Get-TriggeredAlarm {

    [CmdletBinding()]

    param(

        [string]$VM,

        [string]$VMHost,

        [string]$Datacenter

    )

    BEGIN {

        switch ($PSBoundParameters.Keys) {

            'VM' {$entity = Get-VM -Name $VM -ErrorAction SilentlyContinue}

            'VMHost' {$entity = Get-VMHost -Name $VMHost -ErrorAction SilentlyContinue}

            'Datacenter' {$entity = Get-Datacenter -Name $Datacenter -ErrorAction SilentlyContinue}

            default {$entity = $null}

        }

        if ($null -eq $entity) {

            Write-Warning "No vSphere object found."

            break

        }

    }

    PROCESS {

        if ($entity.ExtensionData.TriggeredAlarmState -ne "") {

            $alarmOutput = @()

            foreach ($alarm in $entity.ExtensionData.TriggeredAlarmState) {

                $tempObj = "" | Select-Object -Property Entity, Alarm, AlarmStatus

                $tempObj.Entity = Get-View $alarm.Entity | Select-Object -ExpandProperty Name

                $tempObj.Alarm = Get-View $alarm.Alarm | Select-Object -ExpandProperty Info | Select-Object -ExpandProperty Name

                $tempObj.AlarmStatus = $alarm.OverallStatus

#                $tempObj.AlarmMoRef = $alarm.Alarm

#                $tempObj.EntityMoRef = $alarm.Entity

                $alarmOutput += $tempObj

            }

            $alarmOutput | Format-Table -AutoSize

        }

    }

    END {

        if ($entity -ne $null -and $entity.ExtensionData.TriggeredAlarmState -ne "") {

             #$jsonArray = $alarmOutput  | ConvertTo-Json -Depth 100

             #"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

             #Write-Output "JSON Array Output #1:"

             #Write-Output $jsonArray

             #"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

            return $alarmOutput | ConvertTo-Json -Depth 100

        }

    }

}

$result = Get-TriggeredAlarm -Datacenter "sddc-datacenter"

# Print the output

"_____________________________________________"

Write-Output "Result Output #2:"

Write-Output $result

"_____________________________________________"

 

Send-LogToLogAnalytics -CustomerId $CustomerId `

                         -SharedKey $sharedKey `

                         -Log $result `

                         -LogType "NewLogTable"

# Disconnect from vCenter Server

Disconnect-VIServer -Confirm:$false

Updated Apr 20, 2025
Version 1.0
"}},"componentScriptGroups({\"componentId\":\"custom.widget.MicrosoftFooter\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/QueryHandler\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCoverImage\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCoverImage-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeTitle\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeTitle-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTimeToRead\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTimeToRead-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserRank\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserRank-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCustomFields\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCustomFields-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRevision\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRevision-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageReplyButton\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageReplyButton-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageAuthorBio\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/ranks/UserRankLabel\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserRegistrationDate\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserRegistrationDate-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeAvatar-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeDescription\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeDescription-1745505309750"}],"message({\"id\":\"message:4406095\"})":{"__ref":"BlogReplyMessage:message:4406095"},"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1745505309750"}]},"CachedAsset:pages-1745486122162":{"__typename":"CachedAsset","id":"pages-1745486122162","value":[{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"UserBlogPermissions.Page","type":"COMMUNITY","urlPath":"/c/user-blog-permissions/page","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"AllEvents","type":"CUSTOM","urlPath":"/Events","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"CommunityHub.Page","type":"CUSTOM","urlPath":"/Directory","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"AllBlogs.Page","type":"CUSTOM","urlPath":"/blogs","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Deleted","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"MMM dd yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":"en","possibleValues":["en-US"]}},"deleted":false},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"Category:category:Azure":{"__typename":"Category","id":"category:Azure","entityType":"CATEGORY","displayId":"Azure","nodeType":"category","depth":3,"title":"Azure","shortTitle":"Azure","parent":{"__ref":"Category:category:products-services"},"categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:top":{"__typename":"Category","id":"category:top","displayId":"top","nodeType":"category","depth":0,"title":"Top","entityType":"CATEGORY","shortTitle":"Top"},"Category:category:communities":{"__typename":"Category","id":"category:communities","displayId":"communities","nodeType":"category","depth":1,"parent":{"__ref":"Category:category:top"},"title":"Communities","entityType":"CATEGORY","shortTitle":"Communities"},"Category:category:products-services":{"__typename":"Category","id":"category:products-services","displayId":"products-services","nodeType":"category","depth":2,"parent":{"__ref":"Category:category:communities"},"title":"Products","entityType":"CATEGORY","shortTitle":"Products"},"Blog:board:AzureMigrationBlog":{"__typename":"Blog","id":"board:AzureMigrationBlog","entityType":"BLOG","displayId":"AzureMigrationBlog","nodeType":"board","depth":4,"conversationStyle":"BLOG","title":"Azure Migration and Modernization Blog","description":"","avatar":null,"profileSettings":{"__typename":"ProfileSettings","language":null},"parent":{"__ref":"Category:category:Azure"},"ancestors":{"__typename":"CoreNodeConnection","edges":[{"__typename":"CoreNodeEdge","node":{"__ref":"Community:community:gxcuf89792"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:communities"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:products-services"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:Azure"}}]},"userContext":{"__typename":"NodeUserContext","canAddAttachments":false,"canUpdateNode":false,"canPostMessages":false,"isSubscribed":false},"boardPolicies":{"__typename":"BoardPolicies","canPublishArticleOnCreate":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","args":[]}}},"shortTitle":"Azure Migration and Modernization Blog","repliesProperties":{"__typename":"RepliesProperties","sortOrder":"REVERSE_PUBLISH_TIME","repliesFormat":"threaded"},"eventPath":"category:Azure/category:products-services/category:communities/community:gxcuf89792board:AzureMigrationBlog/","tagProperties":{"__typename":"TagNodeProperties","tagsEnabled":{"__typename":"PolicyResult","failureReason":null}},"requireTags":false,"tagType":"PRESET_ONLY"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc","height":512,"width":512,"mimeType":"image/png"},"Rank:rank:4":{"__typename":"Rank","id":"rank:4","position":6,"name":"Microsoft","color":"333333","icon":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc\"}"},"rankStyle":"OUTLINE"},"User:user:221818":{"__typename":"User","id":"user:221818","uid":221818,"login":"FastTrack_Mark","deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0yMjE4MTgtNTUzMjU2aTkwOTBBMDUwN0ZGQjJBQ0U"},"rank":{"__ref":"Rank:rank:4"},"email":"","messagesCount":6,"biography":null,"topicsCount":4,"kudosReceivedCount":3,"kudosGivenCount":2,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2018-10-02T21:39:34.290-07:00","confirmEmailStatus":null},"followersCount":null,"solutionsCount":0},"BlogTopicMessage:message:4403200":{"__typename":"BlogTopicMessage","uid":4403200,"subject":"Using Azure Functions to read AVS data via Powershell, PowerCLI, and the API","id":"message:4403200","revisionNum":3,"repliesCount":1,"author":{"__ref":"User:user:221818"},"depth":0,"hasGivenKudo":false,"board":{"__ref":"Blog:board:AzureMigrationBlog"},"conversation":{"__ref":"Conversation:conversation:4403200"},"messagePolicies":{"__typename":"MessagePolicies","canPublishArticleOnEdit":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","args":[]}},"canModerateSpamMessage":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","key":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","args":[]}}},"contentWorkflow":{"__typename":"ContentWorkflow","state":"PUBLISH","scheduledPublishTime":null,"scheduledTimezone":null,"userContext":{"__typename":"MessageWorkflowContext","canSubmitForReview":null,"canEdit":false,"canRecall":null,"canSubmitForPublication":null,"canReturnToAuthor":null,"canPublish":null,"canReturnToReview":null,"canSchedule":false},"shortScheduledTimezone":null},"readOnly":false,"editFrozen":false,"moderationData":{"__ref":"ModerationData:moderation_data:4403200"},"teaser":"","body":"

Gotcha’s

\n\n

 

\n

Build Order

\n

 

\n
    \n
  1. Create or identify the Log Analytics Workspace that will be used for storage diagnostics.
  2. \n
\n

 

\n
    \n
  1. Create a KeyVault and set the RBAC properties to allow creation of secrets.
  2. \n
\n

 

\n
    \n
  1. Create KeyVault secrets to hold the account IDs and account passwords that will be used to authenticate to the vCenter, NSX-T and HCX appliances.
  2. \n
\n

 

\n
    \n
  1. Create/identify a storage account and an empty subnet that will be used by the function.
  2. \n
\n

 

\n
    \n
  1. Create the Function App
  2. \n
\n

 

\n
    \n
  1. Creating the Functions App common variable retrieval code (shared by all functions)
  2. \n
\n

 

\n
    \n
  1. Example 1: Retrieving vCenter data
  2. \n
\n

 

\n
    \n
  1. Example 2: Retrieving NSXT data
  2. \n
\n

 

\n
    \n
  1. Example 3: Retrieving PowerCLI data from HCX
  2. \n
\n

 

\n

 

\n

 

\n

 

\n

 

\n

 

\n

1.      Create or identify a Log Analytics Workspace

\n

If you are running Azure VMware Solution already, you should have Diagnostics enabled and be forwarding logs to that workspace.

\n

To identify the workspace, select the ‘Diagnostics’ option and record the name of the log space.  In this case it is ‘AVSRelatedLogsOnly’.

\n

 

\n\n

 

\n

If you have not yet enabled diagnostics, follow the instructions found here.  Configure Azure VMware Solution diagnostics.

\n

 

\n

Do not proceed to the next step until this is complete.

\n

 

\n

 

\n

 

\n

 

\n

2.      Create a KeyVault

\n

Create a KeyVault if there isn’t one already.  This example uses the default settings so once the Basics tab is complete, select the ‘Review + Create’, then ‘Create’.

\n

 

\n\n

  

\n

 

\n
 
 
\n


The summary page should look like this

\n

 

\n

 

\n

 

\n

 

\n

 

\n

Note, the creation of private endpoints for this scenario will be covered in the future.

\n

 

\n

 

\n

 

\n

Before you can store secrets RBAC settings need to be applied because by default the user who creates the KeyVault cannot create secrets.

\n
    \n
  1. a) Go to Access Control, add a Role Assignment, add yourself as the KeyVault Administrator.
  2. \n
\n

 

\n\n

 

\n

 

\n
    \n
  1. b) Then click ‘Review and assign’
  2. \n
\n

 

\n
    \n
  1. c) Next, switch back to the function, and under Identity, select System assigned, then click Save.
  2. \n
\n

 

\n\n

 

\n

Note that this will use this identity for every function in the function app

\n

 

\n

 

\n

 

\n
    \n
  1. d) Once that has been created – click on the ‘Azure role Assignment’
  2. \n
\n

 

\n\n

 

\n
    \n
  1. e) Select ‘Add role assignment’ then select a scope of ‘KeyVault’, make sure you’ve got the right subscription, and then select name of the KeyVault you are using. The Role required is ‘Key Vault Secrets User’
  2. \n
\n

 

\n\n

 

\n
    \n
  1. f) Click ‘Save’
  2. \n
\n

 

\n

3.      Add KeyVault Secrets

\n
    \n
  1. a) Return to KeyVault and select ‘Secrets’. Now you should be able to click on the ‘Generate/Import’ option to create a secret. If this fails, go back and check the role assignment requirements above.
  2. \n
\n

 

\n\n

 

\n

 

\n

 

\n

 

\n
    \n
  1. b) Using the Generate/Import we will fill the following five secrets, one for each variable required in the function: $sharedKey, $avs-VCenterAdmin, $avs-VCenterAdminPassword, $avs-NSXTAdmin, $avs-NSXTAdminPassword.
  2. \n
\n

 

\n

 

\n

Note:  There a number of options here.  In this example we are using the CloudAdmin@vsphere.local to access the vCenter and HCX APIs.  For the NSX-T, we will use the CloudAdmin account.  In production you would likely use an LDAP account with administrative access to both environments, or two separate accounts for added security.

\n

 

\n
    \n
  1. $sharedKey
  2. \n
\n

 

\n

Open a second portal tab and go to the log analytics workspace we identified above called AVSRelatedLogsOnly and select Agents, then copy the primary key.

\n

 

\n\n

 

\n

 

\n

Return to the Generate/Import screen and fill in the Name “sharedKey” and the Secret value with the primary key copied from log analytics workspace.  Fill in the content type description.

\n

 

\n\n

 

\n

 

\n

Click Create

\n

 

\n

 

\n
    \n
  1. $avs-vCenterAdmin
  2. \n
\n

 

\n

Click on the Generate/Import to create the next secret.  For queries that will connect to vCenter or HCX go to the AVS SDDC instance in the portal, select VMware Credential, and then copy the username, ‘cloudadmin@vsphere.local’ .  Note that in production you should use an identity that has read-only rights.

\n

 

\n

Add the ‘cloudadmin@vsphere.local” as the Secret value for the avs-vCenterAdmin secret.

\n

 

\n\n

 

\n

Click Create

\n

 

\n
    \n
  1. $avs-vCenterAdminPassword
  2. \n
\n

 

\n

Click on the Generate/Import to create the next secret.  For queries that will connect to vCenter or HCX go to the AVS private cloud instance in the portal, select ‘VMware credentials’, and then copy the cloudadmin@vsphere.local password.  Paste it in as the ‘Secret value’

\n

 

\n

 

\n\n

 

\n

Click Create

\n

 

\n
    \n
  1. $avs-NSXTAdmin
  2. \n
\n

 

\n

Add the user account that can read the NSXT data. In this example, the NSXT cloudadmin account is being used. 

\n

 

\n\n

 

\n

Click Create

\n

 

\n

 

\n
    \n
  1. $avs-NSXTAdminPassword
  2. \n
\n

Add the password for the user account that will be used to read the NSXT data.

\n

 

\n\n

 

\n

             Click ‘Create’

\n

When this is complete, the Secrets view of the KeyVault should look something like this.

\n

 

\n\n

 

\n

 

\n

 

\n

4.      Create a storage account and an empty subnet for the Function App.

\n

 

\n
    \n
  1. Create a storage account
  2. \n
\n

A storage account is required in the same region as the Function App.  Create a storage account with the following configuration.

\n

 

\n\n

 

\n

 

\n

The other parameter tabs are not required for this example.

\n

Click ‘Create’

\n

 

\n
    \n
  1. Create an empty subnet
  2. \n
\n

The function has to be able to reach the vCenter, NSXT and HCX appliances by IP address.  Function Apps require an empty subnet on a network that is connected to the AVS environment.

\n

Create a subnet on an network that is able to reach the AVS environment and check to make sure there are no Firewalls or other restrictions in place.

\n

In this example, on the vNet called Core-vNet, a subnet called AV-CC-FunctionSubnet has been created.  The minimum size is a /30.  Generally a larger subnet should be used if multiple Function Apps will use it.

\n

 

\n\n

              

\n\n

 

\n

 

\n

 

\n

5.      Initial Function App Build

\n

Select Function App in the Azure portal then click on ‘+ Create’.  This will launch the Function App wizard.

\n

 

\n
    \n
  1. Select a hosting plan:  Choose Functions Premium, it is the most cost effective plan that supports network integration, which is required for this function. Then click ‘Select’
  2. \n
\n

 

\n

 

\n\n

 

\n

 

\n
    \n
  1. Fill in the basics tab – we are using names specific to this lab, follow your own naming conventions.
  2. \n
  3. Subscription where your SDDC exists
  4. \n
  5. Resource Group                     “AVS-Canada-Central”
  6. \n
  7. Function App name                     “AVS-CC-FunctionApp
  8. \n
  9. Deploy code/container        “Code”
  10. \n
  11. Runtime stack               “PowerShell Core”
  12. \n
  13. Version                                  “7.4”  (minimum)
  14. \n
  15. Region                     Canada-Central
  16. \n
  17. Operating System               “Windows”
  18. \n
  19. Windows Plan                     “CC-ASP-AVS”
  20. \n
  21. Pricing plan*                     “Elastic Premium EP1”   (start small)
  22. \n
  23. Zone redundancy               “Disabled”  (go to Enabled when moving to prod)
  24. \n
\n

 

\n

*Note that not all service plans are available in all regions.

\n

 

\n\n

 

\n

 

\n

 

\n

Click Next: Storage

\n

 

\n

 

\n

 

\n
    \n
  1. If a storage account was not created, you can create one here, otherwise, select the storage account completed above in Part 4.
  2. \n
\n

Select ‘Configure basic diagnostics settings now” and select the Log Analytics Workspace identified in part 1.

\n

 

\n

Storage account:       avsccfunctionapp (v2)

\n

LAW:                  AVSRelatedLogsOnly

\n

 

\n

 

\n\n

 

\n

Click Next: Networking

\n

 

\n

 

\n

 

\n
    \n
  1. The Function App needs to be able to connect to a subnet that can reach the AVS management servers.  For this example we are not using private endpoints.  Select ‘Enable vNet Integration and then select the subnet connected in step 3.
  2. \n
\n

 

\n

 

\n\n

 

\n

Click Next: Monitoring

\n

 

\n
    \n
  1. Under monitoring, set ‘Enable application insights’ to yes so that we can see the logs.  Create a new Application insights.  This is useful for troubleshooting.
  2. \n
\n

 

\n

 

\n\n

 

\n

 

\n

 

\n

 

\n

And then use the Log Ananytics Workspace that was defined in the prerequisites or one that already exists

\n

 

\n

 

\n\n

 

\n

Click OK to close the ‘New Application Insights’ pane

\n

Click Next:Deployment

\n

 

\n
    \n
  1. Under deployment, leave this empty, this example will not use CI/DC or store any code in Github.  However, it is strongly recommended that you do use infrastructure as code to deploy this function if you have multiple  SDDCs.  (Each function app is available only to SDDCs located in the same region).
  2. \n
\n

 

\n
    \n
  1. Click Next: Tags
  2. \n
\n

 

\n
    \n
  1. Add any tags you want applied
  2. \n
\n

Click Next: Review + Create , then when the validation is completed

\n

 

\n\n

 

\n

 

\n

Click:  Create 

\n

 

\n

Note:

\n

There is an option beside the Create button to download a template for this function app.

\n

 

\n

 

\n

 

\n
    \n
  1. Once the validation is complete and the build runs the following screen should be visible.
  2. \n
\n

 

\n

 

\n\n

 

\n

 

\n

Click on “Go to resource”

\n

 

\n

CHECK FUNCTION NETWORK INTEGRATION (Outbound Internet Traffic is enabled – might need to disable – don’t know what this actually means).

\n

 

\n
    \n
  1. Install the relevant modules (KeyVault, LogAnalytics, PowerCLI).
  2. \n
\n

 

\n

These are the modules that will load so that the function works with the various services and commands.

\n

 

\n

Click on the App Files and then using the pull-down, select ‘requirements.psd1’

\n

 

\n\n

 

\n

 

\n

 

\n

 

\n

Now insert the following text below line 7.  These are the PowerShell modules required to run the commands that are being called from the Function code.

\n

 

\n

'Az.KeyVault' = '5.3.0'

\n

'Az.LogAnalytics' = '1.0.1'

\n

'VMware.PowerCLI' = '13.2.1.22851661'

\n

 

\n

So that it looks like this:

\n

 

\n

 

\n\n

 

\n

Add in the az.vmware version 0.7.1  to this list

\n

 

\n

To check for the latest version, go to the www.powershellgallery.com.  This example looks for the PowerCLI latest verions, search for az.KeyVault and az.LogAnalytics as well.

\n

 

\n

 

\n\n

 

\n

 

\n

 

\n
    \n
  1. Create a managed identity for the function so that it can access the KeyVault.
  2. \n
\n

From the Function App portal page, click on Identity, turn the Status to On, and then click on the Save icon, and click Yes to enable it.

\n

 

\n\n

 

\n

 

\n\n

 

\n

 

\n

Now we need configure the ‘Azure role assignments’

\n

 

\n

 

\n\n

 

\n

 

\n

Then click on the ‘+Add role assignments (Preview) and complete the assignment by selecting the Scope as KeyVault, the correct subscription, the KeyVault we are using (CC-AVS-KeyVault) and the Role of “KeyVault Secrets User.  This role is the minimum required permission for the system assigned identity to read the secret values.

\n

 

\n

 

\n\n

 

\n

 

\n

The click Save

\n

 

\n

 

\n

 

\n

6.      Creating the Functions App common variable retrieval code

\n

Now that the function app has been configured to support the function we want to execute, the functions themselves need to be defined.

\n
    \n
  1. From the Function App screen click on ‘Create function’
  2. \n
\n

 

\n\n

 

\n

 

\n

 

\n

Select the ‘Timer trigger’ as this function, as most in this category of monitoring/alerting, will be run on a schedule.

\n

 

\n\n

 

\n

 

\n

Click Create.

\n

 

\n

 

\n

On the template details screen, change the ‘Function name’ to match the function’s function.

\n

Use the Schedule to determine how often the function should run.  Note the format is based on Cron job scheduling (see link in the ‘Appendix’).  In this case, the function is set to run every 5 minutes.

\n

 

\n\n

 

\n

             Then click ‘Create’ at the bottom of the screen.

\n

 

\n
    \n
  1. This will result in the following screen
  2. \n
\n

 

\n\n

 

\n

Save this for now. Close the window using the  X  in the top right hand corner and select ‘Environment Variables’ from the menu on the left hand side.

\n

 

\n

 

\n

 

\n
    \n
  1. On the Environment variables page, click on +Add and enter the following variables. For multi-region vCenters, use a more complex naming convention (ie when you have multiple SDDCs).
  2. \n
\n

 

\n
    \n
  1. Name:              vCenterURL
  2. \n
\n

Value:                https://10.4.0.2                (your vCenter instance IP address)

\n

 

\n
    \n
  1. Name:              NSXTURL
  2. \n
\n

Value:                https://10.4.0.3                (your NSX-T instance IP address)

\n

 

\n
    \n
  1. Name: HCXRL
  2. \n
\n

Value:                https://10.4.0.9                (your HCX instance IP address)

\n

 

\n
    \n
  1. Name:              KeyVaultName
  2. \n
\n

Value:                 CC-AVS-Keyvault             (name of the KeyVault created in the prereqs)

\n

 

\n

             Click on the +Add and enter the values above for each of the 4 variables.

\n

 

\n

 

\n\n

 

\n

 

\n\n

 

\n

 

\n\n

 

\n

 

\n\n

 

\n

 

\n

 

\n

The result should end up with app settings that look like this

\n

 

\n\n

 

\n

Click ‘Apply’ to save the Environment variables.

\n

 

\n
    \n
  1. Add the Environment variables and KeyVault secrets to the Get-vCenter-Data app.
  2. \n
\n

Click on the Overview to show the functions page, and select the ‘CheckStorageTime’ function we created above.

\n

 

\n\n

 

\n

Delete lines 4 to 14.

\n

Step 1 – Add the Environment Variables

\n

 

\n

# Environment Variables

\n

$LogType=\"AVSLogs\"

\n

$KeyVaultName=$env:KeyVaultName

\n

$HCX-URL = $env:HCXURL

\n

$vCenter-URL = $env:vCenterURL

\n

$NSXT-URL = $env:NSXTURL

\n

 

\n

                           The result should look like this:

\n

 

\n\n

 

\n

 

\n

 

\n

Step 2 – Add the KeyVault Variables

\n

# KeyVault Secret Variables

\n

$SharedKey=                               Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name                                                                           \"sharedkey\" -asplaintext

\n

$avs-vCenterAdmin=                  Get-AzKeyVaultSecret -VaultName $KeyVaultName
                                                     -Name \"avs-vCenterAdmin\" -asplaintext

\n

$avs-NSXTAdmin=                      Get-AzKeyVaultSecret -VaultName $KeyVaultName
                                                     -Name \"avs-NSXTAdmin\" -asplaintext

\n

$avs-vCenterAdminPassword=              Get-AzKeyVaultSecret -VaultName $KeyVaultName
                                                     -Name \" avs-vCenterAdminPassword \" -asplaintext

\n

$avs-NSXTAdminPassword=              Get-AzKeyVaultSecret -VaultName $KeyVaultName
                                                                   -Name \" avs- NSXTAdminPassword \" -asplaintext

\n

 

\n

The result should look like this:

\n

 

\n\n

 

\n

 

\n

Resources

\n

Cron job format and time zone: https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules

\n

 

\n

Troubleshooting

\n

 

\n

Variable retrievals

\n

If you run a Code+Test, then lines 18 to 31 can be used to validate the environment variables and KeyVault secrets are being retrieved successfully.

\n

 

\n
\n

OUTPUT: vCenterURL: https://10.2.0.2

\n

OUTPUT: HCXURL: https://10.2.0.9

\n

OUTPUT: NSXTURL: https://10.2.0.3

\n

OUTPUT: KeyVault: CC-AVS-Keyvault

\n

OUTPUT: LogAnalyticsKey:pHtIGvsRJurkTC4dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\n

OUTPUT: avsvCenterAdmin:cloudadmin@vsphere.local

\n

OUTPUT: avsNSXTAdmin:cloudadmin

\n

OUTPUT: avsvCenterAdminPassword:03Kxxxxxxxx

\n

OUTPUT: avsNSXTAdminPassword:j1hQbxxxxxxxx

\n
\n

 

\n

Lines 33 to 40 are used to validate network connectivity between the function the and the IP address of the vCenter, HCX and NSXT virtual machines.

\n

The results should look like this and show True:

\n

 

\n\n

 

\n

 

\n

Sample showing the code required to retrieve the variables from KeyVault:

\n

 

\n
    \n
  1. $sharedKey=Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name \"SharedKey\" -asplaintext

  2. \n
  3. $avsVCenterAdmin=Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name \"avsVCenterAdmin\" -asplaintext
  4. \n
  5. $avsVCenterAdminPassword=Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name \"avsVCenterAdminPassword\" -asplaintext

  6. \n
  7. $avsNSXTAdmin= Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name \"avsNSXTAdmin\" -asplaintext
  8. \n
  9. $avsNSXTAdminPassword= Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name \"avsNSXTAdminPassword\" -asplaintext
  10. \n
\n

 

\n

 

\n

 

\n

 

\n

Example 1 - Diagnostics Available

\n

This is a simple script to check that the diagnostics for the service is turned on.  I've left in lots of lines as comments that were used during troubleshooting and validation.  The output is to the AVS_Diagnostics table; which is automatically created the first time you run the script.

\n

 

\n

# Input bindings are passed in via param block.

\n

param($Timer)

\n

# Environment Variables

\n

$LogType=\"AVS_DiagnosticsStatus\"

\n

$KeyVaultName=$env:KeyVaultName

\n

$HCXURL = $env:HCXURL

\n

$vCenterURL = $env:vCenterURL

\n

$NSXTURL = $env:NSXTURL

\n

$CustomerID = $env:LAW_WorkSpace_ID

\n

# KeyVault Secrets

\n

$SharedKey=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsLAWKey\" -asplaintext

\n

$avsvCenterAdmin=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsvCenterAdmin\" -asplaintext

\n

$avsNSXTAdmin=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsNSXTAdmin\" -asplaintext

\n

$avsvCenterAdminPassword=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"AVSSDDCvCentrerAdminAccountPassword\" -asplaintext

\n

$avsNSXTAdminPassword=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsNSXTAdminPassword\" -asplaintext

\n

$avsLAWSecret=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsLAWKey\" -asplaintext

\n

$avsTenantID=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsTenantID\" -asplaintext

\n

#Note this example uses the cloudadmin@vsphere.local account to authenticate with both vCenter and HCX

\n

#Note this example uses cloudadmin account to authenticate with NSXT

\n

# The following are used for checking that environment variables and keyvault secrets are being retrieved.

\n

 \"LAWSharedKey: $sharedKey\"

\n

 \"CustomerID: $CustomerID\"

\n

# \"vCenterURL: $vCenterURL\"

\n

# \"HCXURL: $HCXURL\"

\n

# \"NSXTURL: $NSXTURL\"

\n

# \"KeyVault: $KeyVaultName\"

\n

# \"LogAnalyticsKey:$SharedKey”

\n

# “avsvCenterAdmin:$avsvCenterAdmin”

\n

# “avsNSXTAdmin:$avsNSXTAdmin”

\n

# “avsvCenterAdminPassword:$avsvCenterAdminPassword”

\n

# “avsNSXTAdminPassword:$avsNSXTAdminPassword”

\n

# The following are used to verify network connectivity to the vCenter, HCX and NSXT

\n

# $vCenter=Test-connection $vCenterURL.trim(\"https://\") -tcpport 443

\n

# $VCntr=Test-connection $vCenterURL.trim(\"https://\") -tcpport 443

\n

# $HCX=Test-connection $HCXURL.trim(\"https://\") -tcpport 443

\n

# $NSXT=Test-connection $NSXTURL.trim(\"https://\") -tcpport 443

\n

# \"VC Network connection valid: $vCntr\"

\n

# \"HC Network connection valid: $HCX\"

\n

# Create Credential Automatically for NSXT (ENABLED)

\n

# END of the variable definitions and authentication process - this is repeatable for all powershell and URI queries.

\n

# ___________________________________________________________________________________________________________________

\n

#Get list of private clouds

\n

$ListOfSDDCs = Get-AzVmwarePrivateCloud

\n

$result = @()

\n

$counter = 0

\n

ForEach ($SDDCName in $ListOfSDDCs.Name) {

\n

   

\n

    # Get the diagnostics setting for the cloud

\n

    $RGName=$ListOfSDDCs[$counter].ResourceGroupName

\n

    $SDDCName=$ListOfSDDCs[$counter].Name

\n

 

\n

    $counter += 1

\n

    $SDDCResourceID = get-azresource -Resourcegroupname $RGName -resourcename $SDDCName | Select-Object -ExpandProperty ResourceId

\n

    $DiagName =Get-AzDiagnosticSetting -ResourceId $SDDCResourceID | Select-Object -ExpandProperty Name

\n

           

\n

    if ($DiagName) {

\n

        $LAWworkspace = Get-AzDiagnosticSetting -ResourceId $SDDCResourceID | Select-Object -ExpandProperty WorkspaceId

\n

        $LAWworkspace = split-path $LAWworkspace -Leaf

\n

        $Enabled = \"Yes\"

\n

    } else {

\n

       $Enabled = \"No\"

\n

       $Diagname = \"-\"

\n

       $LAWworkspace = \"-\"

\n

    }

\n

   

\n

    $object = [PSCustomOBject]@{

\n

        SDDC = $SDDCName

\n

        Enabled = $Enabled

\n

        LAW_Workspace = $LAWworkspace

\n

        Diagnostics = $DiagName

\n

    }

\n

     $result += $object

\n

}

\n

# $result

\n

#\"___________________________________________________________\"

\n

 

\n

$ResultData = $result | ConvertTo-Json -Depth 100

\n

$ResultData

\n

 Send-LogToLogAnalytics -CustomerId $CustomerId `

\n

                         -SharedKey $sharedKey `

\n

                         -Log $ResultData `

\n

                         -LogType $LogType

\n

 

\n

 

\n

Example 2:  vCenter Alerts

\n

In this example we use the PowerCLI add on to pull all open alerts from vCenter.  Note again that I have left in a number of lines commented out that were used for troubleshooting.

\n

 

\n

# Input bindings are passed in via param block.

\n

param($Timer)

\n

# Environment Variables

\n

$LogTable=\"TempTable\"

\n

$KeyVaultName=$env:KeyVaultName

\n

$HCXURL = $env:HCXURL

\n

$vCenterURL = $env:vCenterURL

\n

$NSXTURL = $env:NSXTURL

\n

$CustomerID = $env:LAW_WorkSpace_ID

\n

# KeyVault Secrets

\n

$SharedKey=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsLAWKey\" -asplaintext

\n

$avsvCenterAdmin=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsvCenterAdmin\" -asplaintext

\n

$avsNSXTAdmin=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsNSXTAdmin\" -asplaintext

\n

$avsvCenterAdminPassword=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"AVSSDDCvCentrerAdminAccountPassword\" -asplaintext

\n

$avsNSXTAdminPassword=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsNSXTAdminPassword\" -asplaintext

\n

$avsLAWSecret=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsLAWKey\" -asplaintext

\n

#Note this example uses the cloudadmin@vsphere.local account to authenticate with both vCenter and HCX

\n

#Note this example uses cloudadmin account to authenticate with NSXT

\n

# The following are used for checking that environment variables and keyvault secrets are being retrieved.

\n

# \"LAWSharedKey: $sharedKey\"

\n

# \"CustomerID: $CustomerID\"

\n

# \"vCenterURL: $vCenterURL\"

\n

# \"HCXURL: $HCXURL\"

\n

# \"NSXTURL: $NSXTURL\"

\n

# \"KeyVault: $KeyVaultName\"

\n

# \"LogAnalyticsKey:$SharedKey”

\n

# “avsvCenterAdminPassword:$avsvCenterAdminPassword”

\n

# “avsNSXTAdminPassword:$avsNSXTAdminPassword”

\n

 Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false

\n

# END of the variable definitions and authentication process - this is repeatable for all powershell and URI queries.

\n

# ___________________________________________________________________________________________________________________

\n

$vCenter = Connect-viserver $vCenterURL.trim('https://') -protocol https -user $avsvCenterAdmin -password $avsvCenterAdminPassword

\n

function Get-TriggeredAlarm {

\n

    [CmdletBinding()]

\n

    param(

\n

        [string]$VM,

\n

        [string]$VMHost,

\n

        [string]$Datacenter

\n

    )

\n

    BEGIN {

\n

        switch ($PSBoundParameters.Keys) {

\n

            'VM' {$entity = Get-VM -Name $VM -ErrorAction SilentlyContinue}

\n

            'VMHost' {$entity = Get-VMHost -Name $VMHost -ErrorAction SilentlyContinue}

\n

            'Datacenter' {$entity = Get-Datacenter -Name $Datacenter -ErrorAction SilentlyContinue}

\n

            default {$entity = $null}

\n

        }

\n

        if ($null -eq $entity) {

\n

            Write-Warning \"No vSphere object found.\"

\n

            break

\n

        }

\n

    }

\n

    PROCESS {

\n

        if ($entity.ExtensionData.TriggeredAlarmState -ne \"\") {

\n

            $alarmOutput = @()

\n

            foreach ($alarm in $entity.ExtensionData.TriggeredAlarmState) {

\n

                $tempObj = \"\" | Select-Object -Property Entity, Alarm, AlarmStatus

\n

                $tempObj.Entity = Get-View $alarm.Entity | Select-Object -ExpandProperty Name

\n

                $tempObj.Alarm = Get-View $alarm.Alarm | Select-Object -ExpandProperty Info | Select-Object -ExpandProperty Name

\n

                $tempObj.AlarmStatus = $alarm.OverallStatus

\n

#                $tempObj.AlarmMoRef = $alarm.Alarm

\n

#                $tempObj.EntityMoRef = $alarm.Entity

\n

                $alarmOutput += $tempObj

\n

            }

\n

            $alarmOutput | Format-Table -AutoSize

\n

        }

\n

    }

\n

    END {

\n

        if ($entity -ne $null -and $entity.ExtensionData.TriggeredAlarmState -ne \"\") {

\n

             #$jsonArray = $alarmOutput  | ConvertTo-Json -Depth 100

\n

             #\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"

\n

             #Write-Output \"JSON Array Output #1:\"

\n

             #Write-Output $jsonArray

\n

             #\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"

\n

            return $alarmOutput | ConvertTo-Json -Depth 100

\n

        }

\n

    }

\n

}

\n

$result = Get-TriggeredAlarm -Datacenter \"sddc-datacenter\"

\n

# Print the output

\n

\"_____________________________________________\"

\n

Write-Output \"Result Output #2:\"

\n

Write-Output $result

\n

\"_____________________________________________\"

\n

 

\n

Send-LogToLogAnalytics -CustomerId $CustomerId `

\n

                         -SharedKey $sharedKey `

\n

                         -Log $result `

\n

                         -LogType \"NewLogTable\"

\n

# Disconnect from vCenter Server

\n

Disconnect-VIServer -Confirm:$false

","body@stringLength":"53464","rawBody":"

Gotcha’s

\n\n

 

\n

Build Order

\n

 

\n
    \n
  1. Create or identify the Log Analytics Workspace that will be used for storage diagnostics.
  2. \n
\n

 

\n
    \n
  1. Create a KeyVault and set the RBAC properties to allow creation of secrets.
  2. \n
\n

 

\n
    \n
  1. Create KeyVault secrets to hold the account IDs and account passwords that will be used to authenticate to the vCenter, NSX-T and HCX appliances.
  2. \n
\n

 

\n
    \n
  1. Create/identify a storage account and an empty subnet that will be used by the function.
  2. \n
\n

 

\n
    \n
  1. Create the Function App
  2. \n
\n

 

\n
    \n
  1. Creating the Functions App common variable retrieval code (shared by all functions)
  2. \n
\n

 

\n
    \n
  1. Example 1: Retrieving vCenter data
  2. \n
\n

 

\n
    \n
  1. Example 2: Retrieving NSXT data
  2. \n
\n

 

\n
    \n
  1. Example 3: Retrieving PowerCLI data from HCX
  2. \n
\n

 

\n

 

\n

 

\n

 

\n

 

\n

 

\n

1.      Create or identify a Log Analytics Workspace

\n

If you are running Azure VMware Solution already, you should have Diagnostics enabled and be forwarding logs to that workspace.

\n

To identify the workspace, select the ‘Diagnostics’ option and record the name of the log space.  In this case it is ‘AVSRelatedLogsOnly’.

\n

 

\n\n

 

\n

If you have not yet enabled diagnostics, follow the instructions found here.  Configure Azure VMware Solution diagnostics.

\n

 

\n

Do not proceed to the next step until this is complete.

\n

 

\n

 

\n

 

\n

 

\n

2.      Create a KeyVault

\n

Create a KeyVault if there isn’t one already.  This example uses the default settings so once the Basics tab is complete, select the ‘Review + Create’, then ‘Create’.

\n

 

\n\n

  

\n

 

\n
  
\n


The summary page should look like this

\n

 

\n

 

\n

 

\n

 

\n

 

\n

Note, the creation of private endpoints for this scenario will be covered in the future.

\n

 

\n

 

\n

 

\n

Before you can store secrets RBAC settings need to be applied because by default the user who creates the KeyVault cannot create secrets.

\n
    \n
  1. a) Go to Access Control, add a Role Assignment, add yourself as the KeyVault Administrator.
  2. \n
\n

 

\n\n

 

\n

 

\n
    \n
  1. b) Then click ‘Review and assign’
  2. \n
\n

 

\n
    \n
  1. c) Next, switch back to the function, and under Identity, select System assigned, then click Save.
  2. \n
\n

 

\n\n

 

\n

Note that this will use this identity for every function in the function app

\n

 

\n

 

\n

 

\n
    \n
  1. d) Once that has been created – click on the ‘Azure role Assignment’
  2. \n
\n

 

\n\n

 

\n
    \n
  1. e) Select ‘Add role assignment’ then select a scope of ‘KeyVault’, make sure you’ve got the right subscription, and then select name of the KeyVault you are using. The Role required is ‘Key Vault Secrets User’
  2. \n
\n

 

\n\n

 

\n
    \n
  1. f) Click ‘Save’
  2. \n
\n

 

\n

3.      Add KeyVault Secrets

\n
    \n
  1. a) Return to KeyVault and select ‘Secrets’. Now you should be able to click on the ‘Generate/Import’ option to create a secret. If this fails, go back and check the role assignment requirements above.
  2. \n
\n

 

\n\n

 

\n

 

\n

 

\n

 

\n
    \n
  1. b) Using the Generate/Import we will fill the following five secrets, one for each variable required in the function: $sharedKey, $avs-VCenterAdmin, $avs-VCenterAdminPassword, $avs-NSXTAdmin, $avs-NSXTAdminPassword.
  2. \n
\n

 

\n

 

\n

Note:  There a number of options here.  In this example we are using the CloudAdmin@vsphere.local to access the vCenter and HCX APIs.  For the NSX-T, we will use the CloudAdmin account.  In production you would likely use an LDAP account with administrative access to both environments, or two separate accounts for added security.

\n

 

\n
    \n
  1. $sharedKey
  2. \n
\n

 

\n

Open a second portal tab and go to the log analytics workspace we identified above called AVSRelatedLogsOnly and select Agents, then copy the primary key.

\n

 

\n\n

 

\n

 

\n

Return to the Generate/Import screen and fill in the Name “sharedKey” and the Secret value with the primary key copied from log analytics workspace.  Fill in the content type description.

\n

 

\n\n

 

\n

 

\n

Click Create

\n

 

\n

 

\n
    \n
  1. $avs-vCenterAdmin
  2. \n
\n

 

\n

Click on the Generate/Import to create the next secret.  For queries that will connect to vCenter or HCX go to the AVS SDDC instance in the portal, select VMware Credential, and then copy the username, ‘cloudadmin@vsphere.local’ .  Note that in production you should use an identity that has read-only rights.

\n

 

\n

Add the ‘cloudadmin@vsphere.local” as the Secret value for the avs-vCenterAdmin secret.

\n

 

\n\n

 

\n

Click Create

\n

 

\n
    \n
  1. $avs-vCenterAdminPassword
  2. \n
\n

 

\n

Click on the Generate/Import to create the next secret.  For queries that will connect to vCenter or HCX go to the AVS private cloud instance in the portal, select ‘VMware credentials’, and then copy the cloudadmin@vsphere.local password.  Paste it in as the ‘Secret value’

\n

 

\n

 

\n\n

 

\n

Click Create

\n

 

\n
    \n
  1. $avs-NSXTAdmin
  2. \n
\n

 

\n

Add the user account that can read the NSXT data. In this example, the NSXT cloudadmin account is being used. 

\n

 

\n\n

 

\n

Click Create

\n

 

\n

 

\n
    \n
  1. $avs-NSXTAdminPassword
  2. \n
\n

Add the password for the user account that will be used to read the NSXT data.

\n

 

\n\n

 

\n

             Click ‘Create’

\n

When this is complete, the Secrets view of the KeyVault should look something like this.

\n

 

\n\n

 

\n

 

\n

 

\n

4.      Create a storage account and an empty subnet for the Function App.

\n

 

\n
    \n
  1. Create a storage account
  2. \n
\n

A storage account is required in the same region as the Function App.  Create a storage account with the following configuration.

\n

 

\n\n

 

\n

 

\n

The other parameter tabs are not required for this example.

\n

Click ‘Create’

\n

 

\n
    \n
  1. Create an empty subnet
  2. \n
\n

The function has to be able to reach the vCenter, NSXT and HCX appliances by IP address.  Function Apps require an empty subnet on a network that is connected to the AVS environment.

\n

Create a subnet on an network that is able to reach the AVS environment and check to make sure there are no Firewalls or other restrictions in place.

\n

In this example, on the vNet called Core-vNet, a subnet called AV-CC-FunctionSubnet has been created.  The minimum size is a /30.  Generally a larger subnet should be used if multiple Function Apps will use it.

\n

 

\n\n

              

\n\n

 

\n

 

\n

 

\n

5.      Initial Function App Build

\n

Select Function App in the Azure portal then click on ‘+ Create’.  This will launch the Function App wizard.

\n

 

\n
    \n
  1. Select a hosting plan:  Choose Functions Premium, it is the most cost effective plan that supports network integration, which is required for this function. Then click ‘Select’
  2. \n
\n

 

\n

 

\n\n

 

\n

 

\n
    \n
  1. Fill in the basics tab – we are using names specific to this lab, follow your own naming conventions.
  2. \n
  3. Subscription where your SDDC exists
  4. \n
  5. Resource Group                     “AVS-Canada-Central”
  6. \n
  7. Function App name                     “AVS-CC-FunctionApp
  8. \n
  9. Deploy code/container        “Code”
  10. \n
  11. Runtime stack               “PowerShell Core”
  12. \n
  13. Version                                  “7.4”  (minimum)
  14. \n
  15. Region                     Canada-Central
  16. \n
  17. Operating System               “Windows”
  18. \n
  19. Windows Plan                     “CC-ASP-AVS”
  20. \n
  21. Pricing plan*                     “Elastic Premium EP1”   (start small)
  22. \n
  23. Zone redundancy               “Disabled”  (go to Enabled when moving to prod)
  24. \n
\n

 

\n

*Note that not all service plans are available in all regions.

\n

 

\n\n

 

\n

 

\n

 

\n

Click Next: Storage

\n

 

\n

 

\n

 

\n
    \n
  1. If a storage account was not created, you can create one here, otherwise, select the storage account completed above in Part 4.
  2. \n
\n

Select ‘Configure basic diagnostics settings now” and select the Log Analytics Workspace identified in part 1.

\n

 

\n

Storage account:       avsccfunctionapp (v2)

\n

LAW:                  AVSRelatedLogsOnly

\n

 

\n

 

\n\n

 

\n

Click Next: Networking

\n

 

\n

 

\n

 

\n
    \n
  1. The Function App needs to be able to connect to a subnet that can reach the AVS management servers.  For this example we are not using private endpoints.  Select ‘Enable vNet Integration and then select the subnet connected in step 3.
  2. \n
\n

 

\n

 

\n\n

 

\n

Click Next: Monitoring

\n

 

\n
    \n
  1. Under monitoring, set ‘Enable application insights’ to yes so that we can see the logs.  Create a new Application insights.  This is useful for troubleshooting.
  2. \n
\n

 

\n

 

\n\n

 

\n

 

\n

 

\n

 

\n

And then use the Log Ananytics Workspace that was defined in the prerequisites or one that already exists

\n

 

\n

 

\n\n

 

\n

Click OK to close the ‘New Application Insights’ pane

\n

Click Next:Deployment

\n

 

\n
    \n
  1. Under deployment, leave this empty, this example will not use CI/DC or store any code in Github.  However, it is strongly recommended that you do use infrastructure as code to deploy this function if you have multiple  SDDCs.  (Each function app is available only to SDDCs located in the same region).
  2. \n
\n

 

\n
    \n
  1. Click Next: Tags
  2. \n
\n

 

\n
    \n
  1. Add any tags you want applied
  2. \n
\n

Click Next: Review + Create , then when the validation is completed

\n

 

\n\n

 

\n

 

\n

Click:  Create 

\n

 

\n

Note:

\n

There is an option beside the Create button to download a template for this function app.

\n

 

\n

 

\n

 

\n
    \n
  1. Once the validation is complete and the build runs the following screen should be visible.
  2. \n
\n

 

\n

 

\n\n

 

\n

 

\n

Click on “Go to resource”

\n

 

\n

CHECK FUNCTION NETWORK INTEGRATION (Outbound Internet Traffic is enabled – might need to disable – don’t know what this actually means).

\n

 

\n
    \n
  1. Install the relevant modules (KeyVault, LogAnalytics, PowerCLI).
  2. \n
\n

 

\n

These are the modules that will load so that the function works with the various services and commands.

\n

 

\n

Click on the App Files and then using the pull-down, select ‘requirements.psd1’

\n

 

\n\n

 

\n

 

\n

 

\n

 

\n

Now insert the following text below line 7.  These are the PowerShell modules required to run the commands that are being called from the Function code.

\n

 

\n

'Az.KeyVault' = '5.3.0'

\n

'Az.LogAnalytics' = '1.0.1'

\n

'VMware.PowerCLI' = '13.2.1.22851661'

\n

 

\n

So that it looks like this:

\n

 

\n

 

\n\n

 

\n

Add in the az.vmware version 0.7.1  to this list

\n

 

\n

To check for the latest version, go to the www.powershellgallery.com.  This example looks for the PowerCLI latest verions, search for az.KeyVault and az.LogAnalytics as well.

\n

 

\n

 

\n\n

 

\n

 

\n

 

\n
    \n
  1. Create a managed identity for the function so that it can access the KeyVault.
  2. \n
\n

From the Function App portal page, click on Identity, turn the Status to On, and then click on the Save icon, and click Yes to enable it.

\n

 

\n\n

 

\n

 

\n\n

 

\n

 

\n

Now we need configure the ‘Azure role assignments’

\n

 

\n

 

\n\n

 

\n

 

\n

Then click on the ‘+Add role assignments (Preview) and complete the assignment by selecting the Scope as KeyVault, the correct subscription, the KeyVault we are using (CC-AVS-KeyVault) and the Role of “KeyVault Secrets User.  This role is the minimum required permission for the system assigned identity to read the secret values.

\n

 

\n

 

\n\n

 

\n

 

\n

The click Save

\n

 

\n

 

\n

 

\n

6.      Creating the Functions App common variable retrieval code

\n

Now that the function app has been configured to support the function we want to execute, the functions themselves need to be defined.

\n
    \n
  1. From the Function App screen click on ‘Create function’
  2. \n
\n

 

\n\n

 

\n

 

\n

 

\n

Select the ‘Timer trigger’ as this function, as most in this category of monitoring/alerting, will be run on a schedule.

\n

 

\n\n

 

\n

 

\n

Click Create.

\n

 

\n

 

\n

On the template details screen, change the ‘Function name’ to match the function’s function.

\n

Use the Schedule to determine how often the function should run.  Note the format is based on Cron job scheduling (see link in the ‘Appendix’).  In this case, the function is set to run every 5 minutes.

\n

 

\n\n

 

\n

             Then click ‘Create’ at the bottom of the screen.

\n

 

\n
    \n
  1. This will result in the following screen
  2. \n
\n

 

\n\n

 

\n

Save this for now. Close the window using the  X  in the top right hand corner and select ‘Environment Variables’ from the menu on the left hand side.

\n

 

\n

 

\n

 

\n
    \n
  1. On the Environment variables page, click on +Add and enter the following variables. For multi-region vCenters, use a more complex naming convention (ie when you have multiple SDDCs).
  2. \n
\n

 

\n
    \n
  1. Name:              vCenterURL
  2. \n
\n

Value:                https://10.4.0.2                (your vCenter instance IP address)

\n

 

\n
    \n
  1. Name:              NSXTURL
  2. \n
\n

Value:                https://10.4.0.3                (your NSX-T instance IP address)

\n

 

\n
    \n
  1. Name: HCXRL
  2. \n
\n

Value:                https://10.4.0.9                (your HCX instance IP address)

\n

 

\n
    \n
  1. Name:              KeyVaultName
  2. \n
\n

Value:                 CC-AVS-Keyvault             (name of the KeyVault created in the prereqs)

\n

 

\n

             Click on the +Add and enter the values above for each of the 4 variables.

\n

 

\n

 

\n\n

 

\n

 

\n\n

 

\n

 

\n\n

 

\n

 

\n\n

 

\n

 

\n

 

\n

The result should end up with app settings that look like this

\n

 

\n\n

 

\n

Click ‘Apply’ to save the Environment variables.

\n

 

\n
    \n
  1. Add the Environment variables and KeyVault secrets to the Get-vCenter-Data app.
  2. \n
\n

Click on the Overview to show the functions page, and select the ‘CheckStorageTime’ function we created above.

\n

 

\n\n

 

\n

Delete lines 4 to 14.

\n

Step 1 – Add the Environment Variables

\n

 

\n

# Environment Variables

\n

$LogType=\"AVSLogs\"

\n

$KeyVaultName=$env:KeyVaultName

\n

$HCX-URL = $env:HCXURL

\n

$vCenter-URL = $env:vCenterURL

\n

$NSXT-URL = $env:NSXTURL

\n

 

\n

                           The result should look like this:

\n

 

\n\n

 

\n

 

\n

 

\n

Step 2 – Add the KeyVault Variables

\n

# KeyVault Secret Variables

\n

$SharedKey=                               Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name                                                                           \"sharedkey\" -asplaintext

\n

$avs-vCenterAdmin=                  Get-AzKeyVaultSecret -VaultName $KeyVaultName
                                                     -Name \"avs-vCenterAdmin\" -asplaintext

\n

$avs-NSXTAdmin=                      Get-AzKeyVaultSecret -VaultName $KeyVaultName
                                                     -Name \"avs-NSXTAdmin\" -asplaintext

\n

$avs-vCenterAdminPassword=              Get-AzKeyVaultSecret -VaultName $KeyVaultName
                                                     -Name \" avs-vCenterAdminPassword \" -asplaintext

\n

$avs-NSXTAdminPassword=              Get-AzKeyVaultSecret -VaultName $KeyVaultName
                                                                   -Name \" avs- NSXTAdminPassword \" -asplaintext

\n

 

\n

The result should look like this:

\n

 

\n\n

 

\n

 

\n

Resources

\n

Cron job format and time zone: https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules

\n

 

\n

Troubleshooting

\n

 

\n

Variable retrievals

\n

If you run a Code+Test, then lines 18 to 31 can be used to validate the environment variables and KeyVault secrets are being retrieved successfully.

\n

 

\n
\n

OUTPUT: vCenterURL: https://10.2.0.2

\n

OUTPUT: HCXURL: https://10.2.0.9

\n

OUTPUT: NSXTURL: https://10.2.0.3

\n

OUTPUT: KeyVault: CC-AVS-Keyvault

\n

OUTPUT: LogAnalyticsKey:pHtIGvsRJurkTC4dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\n

OUTPUT: avsvCenterAdmin:cloudadmin@vsphere.local

\n

OUTPUT: avsNSXTAdmin:cloudadmin

\n

OUTPUT: avsvCenterAdminPassword:03Kxxxxxxxx

\n

OUTPUT: avsNSXTAdminPassword:j1hQbxxxxxxxx

\n
\n

 

\n

Lines 33 to 40 are used to validate network connectivity between the function the and the IP address of the vCenter, HCX and NSXT virtual machines.

\n

The results should look like this and show True:

\n

 

\n\n

 

\n

 

\n

Sample showing the code required to retrieve the variables from KeyVault:

\n

 

\n
    \n
  1. $sharedKey=Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name \"SharedKey\" -asplaintext

  2. \n
  3. $avsVCenterAdmin=Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name \"avsVCenterAdmin\" -asplaintext
  4. \n
  5. $avsVCenterAdminPassword=Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name \"avsVCenterAdminPassword\" -asplaintext

  6. \n
  7. $avsNSXTAdmin= Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name \"avsNSXTAdmin\" -asplaintext
  8. \n
  9. $avsNSXTAdminPassword= Get-AzKeyvaultSecret -VaultName $KeyVaultName -Name \"avsNSXTAdminPassword\" -asplaintext
  10. \n
\n

 

\n

 

\n

 

\n

 

\n

Example 1 - Diagnostics Available

\n

This is a simple script to check that the diagnostics for the service is turned on.  I've left in lots of lines as comments that were used during troubleshooting and validation.  The output is to the AVS_Diagnostics table; which is automatically created the first time you run the script.

\n

 

\n

# Input bindings are passed in via param block.

\n

param($Timer)

\n

# Environment Variables

\n

$LogType=\"AVS_DiagnosticsStatus\"

\n

$KeyVaultName=$env:KeyVaultName

\n

$HCXURL = $env:HCXURL

\n

$vCenterURL = $env:vCenterURL

\n

$NSXTURL = $env:NSXTURL

\n

$CustomerID = $env:LAW_WorkSpace_ID

\n

# KeyVault Secrets

\n

$SharedKey=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsLAWKey\" -asplaintext

\n

$avsvCenterAdmin=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsvCenterAdmin\" -asplaintext

\n

$avsNSXTAdmin=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsNSXTAdmin\" -asplaintext

\n

$avsvCenterAdminPassword=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"AVSSDDCvCentrerAdminAccountPassword\" -asplaintext

\n

$avsNSXTAdminPassword=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsNSXTAdminPassword\" -asplaintext

\n

$avsLAWSecret=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsLAWKey\" -asplaintext

\n

$avsTenantID=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsTenantID\" -asplaintext

\n

#Note this example uses the cloudadmin@vsphere.local account to authenticate with both vCenter and HCX

\n

#Note this example uses cloudadmin account to authenticate with NSXT

\n

# The following are used for checking that environment variables and keyvault secrets are being retrieved.

\n

 \"LAWSharedKey: $sharedKey\"

\n

 \"CustomerID: $CustomerID\"

\n

# \"vCenterURL: $vCenterURL\"

\n

# \"HCXURL: $HCXURL\"

\n

# \"NSXTURL: $NSXTURL\"

\n

# \"KeyVault: $KeyVaultName\"

\n

# \"LogAnalyticsKey:$SharedKey”

\n

# “avsvCenterAdmin:$avsvCenterAdmin”

\n

# “avsNSXTAdmin:$avsNSXTAdmin”

\n

# “avsvCenterAdminPassword:$avsvCenterAdminPassword”

\n

# “avsNSXTAdminPassword:$avsNSXTAdminPassword”

\n

# The following are used to verify network connectivity to the vCenter, HCX and NSXT

\n

# $vCenter=Test-connection $vCenterURL.trim(\"https://\") -tcpport 443

\n

# $VCntr=Test-connection $vCenterURL.trim(\"https://\") -tcpport 443

\n

# $HCX=Test-connection $HCXURL.trim(\"https://\") -tcpport 443

\n

# $NSXT=Test-connection $NSXTURL.trim(\"https://\") -tcpport 443

\n

# \"VC Network connection valid: $vCntr\"

\n

# \"HC Network connection valid: $HCX\"

\n

# Create Credential Automatically for NSXT (ENABLED)

\n

# END of the variable definitions and authentication process - this is repeatable for all powershell and URI queries.

\n

# ___________________________________________________________________________________________________________________

\n

#Get list of private clouds

\n

$ListOfSDDCs = Get-AzVmwarePrivateCloud

\n

$result = @()

\n

$counter = 0

\n

ForEach ($SDDCName in $ListOfSDDCs.Name) {

\n

   

\n

    # Get the diagnostics setting for the cloud

\n

    $RGName=$ListOfSDDCs[$counter].ResourceGroupName

\n

    $SDDCName=$ListOfSDDCs[$counter].Name

\n

 

\n

    $counter += 1

\n

    $SDDCResourceID = get-azresource -Resourcegroupname $RGName -resourcename $SDDCName | Select-Object -ExpandProperty ResourceId

\n

    $DiagName =Get-AzDiagnosticSetting -ResourceId $SDDCResourceID | Select-Object -ExpandProperty Name

\n

           

\n

    if ($DiagName) {

\n

        $LAWworkspace = Get-AzDiagnosticSetting -ResourceId $SDDCResourceID | Select-Object -ExpandProperty WorkspaceId

\n

        $LAWworkspace = split-path $LAWworkspace -Leaf

\n

        $Enabled = \"Yes\"

\n

    } else {

\n

       $Enabled = \"No\"

\n

       $Diagname = \"-\"

\n

       $LAWworkspace = \"-\"

\n

    }

\n

   

\n

    $object = [PSCustomOBject]@{

\n

        SDDC = $SDDCName

\n

        Enabled = $Enabled

\n

        LAW_Workspace = $LAWworkspace

\n

        Diagnostics = $DiagName

\n

    }

\n

     $result += $object

\n

}

\n

# $result

\n

#\"___________________________________________________________\"

\n

 

\n

$ResultData = $result | ConvertTo-Json -Depth 100

\n

$ResultData

\n

 Send-LogToLogAnalytics -CustomerId $CustomerId `

\n

                         -SharedKey $sharedKey `

\n

                         -Log $ResultData `

\n

                         -LogType $LogType

\n

 

\n

 

\n

Example 2:  vCenter Alerts

\n

In this example we use the PowerCLI add on to pull all open alerts from vCenter.  Note again that I have left in a number of lines commented out that were used for troubleshooting.

\n

 

\n

# Input bindings are passed in via param block.

\n

param($Timer)

\n

# Environment Variables

\n

$LogTable=\"TempTable\"

\n

$KeyVaultName=$env:KeyVaultName

\n

$HCXURL = $env:HCXURL

\n

$vCenterURL = $env:vCenterURL

\n

$NSXTURL = $env:NSXTURL

\n

$CustomerID = $env:LAW_WorkSpace_ID

\n

# KeyVault Secrets

\n

$SharedKey=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsLAWKey\" -asplaintext

\n

$avsvCenterAdmin=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsvCenterAdmin\" -asplaintext

\n

$avsNSXTAdmin=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsNSXTAdmin\" -asplaintext

\n

$avsvCenterAdminPassword=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"AVSSDDCvCentrerAdminAccountPassword\" -asplaintext

\n

$avsNSXTAdminPassword=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsNSXTAdminPassword\" -asplaintext

\n

$avsLAWSecret=Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name \"avsLAWKey\" -asplaintext

\n

#Note this example uses the cloudadmin@vsphere.local account to authenticate with both vCenter and HCX

\n

#Note this example uses cloudadmin account to authenticate with NSXT

\n

# The following are used for checking that environment variables and keyvault secrets are being retrieved.

\n

# \"LAWSharedKey: $sharedKey\"

\n

# \"CustomerID: $CustomerID\"

\n

# \"vCenterURL: $vCenterURL\"

\n

# \"HCXURL: $HCXURL\"

\n

# \"NSXTURL: $NSXTURL\"

\n

# \"KeyVault: $KeyVaultName\"

\n

# \"LogAnalyticsKey:$SharedKey”

\n

# “avsvCenterAdminPassword:$avsvCenterAdminPassword”

\n

# “avsNSXTAdminPassword:$avsNSXTAdminPassword”

\n

 Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false

\n

# END of the variable definitions and authentication process - this is repeatable for all powershell and URI queries.

\n

# ___________________________________________________________________________________________________________________

\n

$vCenter = Connect-viserver $vCenterURL.trim('https://') -protocol https -user $avsvCenterAdmin -password $avsvCenterAdminPassword

\n

function Get-TriggeredAlarm {

\n

    [CmdletBinding()]

\n

    param(

\n

        [string]$VM,

\n

        [string]$VMHost,

\n

        [string]$Datacenter

\n

    )

\n

    BEGIN {

\n

        switch ($PSBoundParameters.Keys) {

\n

            'VM' {$entity = Get-VM -Name $VM -ErrorAction SilentlyContinue}

\n

            'VMHost' {$entity = Get-VMHost -Name $VMHost -ErrorAction SilentlyContinue}

\n

            'Datacenter' {$entity = Get-Datacenter -Name $Datacenter -ErrorAction SilentlyContinue}

\n

            default {$entity = $null}

\n

        }

\n

        if ($null -eq $entity) {

\n

            Write-Warning \"No vSphere object found.\"

\n

            break

\n

        }

\n

    }

\n

    PROCESS {

\n

        if ($entity.ExtensionData.TriggeredAlarmState -ne \"\") {

\n

            $alarmOutput = @()

\n

            foreach ($alarm in $entity.ExtensionData.TriggeredAlarmState) {

\n

                $tempObj = \"\" | Select-Object -Property Entity, Alarm, AlarmStatus

\n

                $tempObj.Entity = Get-View $alarm.Entity | Select-Object -ExpandProperty Name

\n

                $tempObj.Alarm = Get-View $alarm.Alarm | Select-Object -ExpandProperty Info | Select-Object -ExpandProperty Name

\n

                $tempObj.AlarmStatus = $alarm.OverallStatus

\n

#                $tempObj.AlarmMoRef = $alarm.Alarm

\n

#                $tempObj.EntityMoRef = $alarm.Entity

\n

                $alarmOutput += $tempObj

\n

            }

\n

            $alarmOutput | Format-Table -AutoSize

\n

        }

\n

    }

\n

    END {

\n

        if ($entity -ne $null -and $entity.ExtensionData.TriggeredAlarmState -ne \"\") {

\n

             #$jsonArray = $alarmOutput  | ConvertTo-Json -Depth 100

\n

             #\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"

\n

             #Write-Output \"JSON Array Output #1:\"

\n

             #Write-Output $jsonArray

\n

             #\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"

\n

            return $alarmOutput | ConvertTo-Json -Depth 100

\n

        }

\n

    }

\n

}

\n

$result = Get-TriggeredAlarm -Datacenter \"sddc-datacenter\"

\n

# Print the output

\n

\"_____________________________________________\"

\n

Write-Output \"Result Output #2:\"

\n

Write-Output $result

\n

\"_____________________________________________\"

\n

 

\n

Send-LogToLogAnalytics -CustomerId $CustomerId `

\n

                         -SharedKey $sharedKey `

\n

                         -Log $result `

\n

                         -LogType \"NewLogTable\"

\n

# Disconnect from vCenter Server

\n

Disconnect-VIServer -Confirm:$false

","kudosSumWeight":0,"postTime":"2025-04-20T08:07:44.323-07:00","images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWZrWkpzcw?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLVluQmlrNw?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLU9XY05CUg?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLVBTSVJzWA?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUZyQTZQdg?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWc2RUhnZw?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDc","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUkwNTFaVA?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDg","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLU5WbHhwNg?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDk","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTBhZGhPZA?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDEw","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTNFOE1ZQQ?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDEx","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUNwZzhUYg?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDEy","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLVRJT01DTw?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDEz","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTRhQU85Ug?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDE0","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWxHVzg4Zg?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDE1","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTRMVkd3Qw?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDE2","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLU8wamlxeQ?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDE3","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUMzNmlEcA?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDE4","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWRQaEdsRg?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDE5","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTlNck5pbw?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDIw","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWtQSlp3WA?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDIx","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLVNTaWV2WA?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDIy","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUdlZkxUSA?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDIz","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUZuWW1PUw?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDI0","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWRRN1M0Qg?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDI1","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLXQ5THBTYw?revision=3\"}"}}],"totalCount":47,"pageInfo":{"__typename":"PageInfo","hasNextPage":true,"endCursor":"MjUuMXwyLjF8b3wyNXxfTlZffDI1","hasPreviousPage":false,"startCursor":null}},"attachments":{"__typename":"AttachmentConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"tags":{"__typename":"TagConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"timeToRead":12,"rawTeaser":"","introduction":"This function enables you to pull data from Azure VMware Solution vCenter, NSX-T and HCX appliances that is not currently surfaced through Azure Diagnostics. The data is then stored in a Log Analytics Workspace that can be queried (and alerted on) using standard Azure tools.\nYou can create these resource in multiple Resource Groups (RG) depending on your RBAC and overall architecture. For this example, a single RG is being used, that is called AVS-Canada-Central.\nNote that Functions are Region specific, they cannot span regions and the storage account required must also be in the same region.\n","coverImage":{"__typename":"UploadedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWZrWkpzcw?revision=3","width":844,"height":400},"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""},"currentRevision":{"__ref":"Revision:revision:4403200_3"},"latestVersion":{"__typename":"FriendlyVersion","major":"1","minor":"0"},"metrics":{"__typename":"MessageMetrics","views":129},"visibilityScope":"PUBLIC","canonicalUrl":"","seoTitle":"","seoDescription":null,"placeholder":false,"originalMessageForPlaceholder":null,"contributors":{"__typename":"UserConnection","edges":[]},"nonCoAuthorContributors":{"__typename":"UserConnection","edges":[]},"coAuthors":{"__typename":"UserConnection","edges":[]},"blogMessagePolicies":{"__typename":"BlogMessagePolicies","canDoAuthoringActionsOnBlog":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.blog.action_can_do_authoring_action.accessDenied","key":"error.lithium.policies.blog.action_can_do_authoring_action.accessDenied","args":[]}}},"archivalData":null,"replies":{"__typename":"MessageConnection","edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDQwNjA5NSw0NDA2MDk1","node":{"__ref":"BlogReplyMessage:message:4406095"}}],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[],"revisions({\"constraints\":{\"isPublished\":{\"eq\":true}},\"first\":1})":{"__typename":"RevisionConnection","totalCount":3}},"Conversation:conversation:4403200":{"__typename":"Conversation","id":"conversation:4403200","solved":false,"topic":{"__ref":"BlogTopicMessage:message:4403200"},"lastPostingActivityTime":"2025-04-20T23:36:28.730-07:00","lastPostTime":"2025-04-20T23:36:28.730-07:00","unreadReplyCount":1,"isSubscribed":false},"ModerationData:moderation_data:4403200":{"__typename":"ModerationData","id":"moderation_data:4403200","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWZrWkpzcw?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWZrWkpzcw?revision=3","title":"Blog Image.png","associationType":"COVER","width":844,"height":400,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLVluQmlrNw?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLVluQmlrNw?revision=3","title":"clipboard_image-1-1744325584790.png","associationType":"BODY","width":1629,"height":615,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLU9XY05CUg?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLU9XY05CUg?revision=3","title":"clipboard_image-2-1744325584793.png","associationType":"BODY","width":797,"height":1175,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLVBTSVJzWA?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLVBTSVJzWA?revision=3","title":"clipboard_image-3-1744325584796.png","associationType":"BODY","width":546,"height":710,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUZyQTZQdg?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUZyQTZQdg?revision=3","title":"clipboard_image-4-1744325584807.png","associationType":"BODY","width":1100,"height":775,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWc2RUhnZw?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWc2RUhnZw?revision=3","title":"clipboard_image-5-1744325584819.png","associationType":"BODY","width":724,"height":667,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUkwNTFaVA?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUkwNTFaVA?revision=3","title":"image.png","associationType":"BODY","width":450,"height":315,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLU5WbHhwNg?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLU5WbHhwNg?revision=3","title":"clipboard_image-7-1744325584829.png","associationType":"BODY","width":1900,"height":417,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTBhZGhPZA?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTBhZGhPZA?revision=3","title":"clipboard_image-8-1744325584832.png","associationType":"BODY","width":1153,"height":538,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTNFOE1ZQQ?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTNFOE1ZQQ?revision=3","title":"clipboard_image-9-1744325584838.png","associationType":"BODY","width":1658,"height":898,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUNwZzhUYg?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUNwZzhUYg?revision=3","title":"clipboard_image-10-1744325584840.png","associationType":"BODY","width":1771,"height":438,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLVRJT01DTw?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLVRJT01DTw?revision=3","title":"clipboard_image-11-1744325584842.png","associationType":"BODY","width":1790,"height":452,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTRhQU85Ug?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTRhQU85Ug?revision=3","title":"clipboard_image-12-1744325584843.png","associationType":"BODY","width":1727,"height":435,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWxHVzg4Zg?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWxHVzg4Zg?revision=3","title":"clipboard_image-13-1744325584845.png","associationType":"BODY","width":1731,"height":426,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTRMVkd3Qw?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTRMVkd3Qw?revision=3","title":"clipboard_image-14-1744325584846.png","associationType":"BODY","width":1729,"height":434,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLU8wamlxeQ?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLU8wamlxeQ?revision=3","title":"clipboard_image-15-1744325584849.png","associationType":"BODY","width":1418,"height":377,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUMzNmlEcA?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUMzNmlEcA?revision=3","title":"clipboard_image-16-1744325584852.png","associationType":"BODY","width":952,"height":882,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWRQaEdsRg?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWRQaEdsRg?revision=3","title":"clipboard_image-17-1744325584853.png","associationType":"BODY","width":1459,"height":590,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTlNck5pbw?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLTlNck5pbw?revision=3","title":"clipboard_image-18-1744325584854.png","associationType":"BODY","width":461,"height":281,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWtQSlp3WA?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWtQSlp3WA?revision=3","title":"clipboard_image-19-1744325584858.png","associationType":"BODY","width":2236,"height":1207,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLVNTaWV2WA?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLVNTaWV2WA?revision=3","title":"clipboard_image-20-1744325584863.png","associationType":"BODY","width":763,"height":1212,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUdlZkxUSA?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUdlZkxUSA?revision=3","title":"clipboard_image-21-1744325584866.png","associationType":"BODY","width":731,"height":653,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUZuWW1PUw?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLUZuWW1PUw?revision=3","title":"clipboard_image-22-1744325584869.png","associationType":"BODY","width":819,"height":1125,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWRRN1M0Qg?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLWRRN1M0Qg?revision=3","title":"clipboard_image-23-1744325584871.png","associationType":"BODY","width":752,"height":419,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLXQ5THBTYw?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00NDAzMjAwLXQ5THBTYw?revision=3","title":"clipboard_image-24-1744325584872.png","associationType":"BODY","width":568,"height":258,"altText":""},"Revision:revision:4403200_3":{"__typename":"Revision","id":"revision:4403200_3","lastEditTime":"2025-04-20T08:07:44.323-07:00"},"CachedAsset:theme:customTheme1-1745486121533":{"__typename":"CachedAsset","id":"theme:customTheme1-1745486121533","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["default"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"favicon-1730836283320.png","imageLastModified":"1730836286415","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"favicon-1730836271365.png","imageLastModified":"1730836274203","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1300px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_BROWSER","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"3px","borderRadius":"3px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"16px","paddingXHero":"60px","fontStyle":"NORMAL","fontWeight":"700","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-200)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-200)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"LIGHT","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.16)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.12)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-link-color)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","forumColor":"#4099E2","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#148563","blogColor":"#1CBAA0","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#4C6B90","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#FF8000","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#D13A1F","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#333333","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#717171","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0069D4","secondary":"#333333","bodyText":"#1E1E1E","bodyBg":"#FFFFFF","info":"#409AE2","success":"#41C5AE","warning":"#FCC844","danger":"#BC341B","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#D3F5A4","#243A5E"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Segoe UI","fontStyle":"NORMAL","fontWeight":"400","h1FontSize":"34px","h2FontSize":"32px","h3FontSize":"28px","h4FontSize":"24px","h5FontSize":"20px","h6FontSize":"16px","lineHeight":"1.3","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":"","imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"40px","defaultMessageHeaderMarginBottom":"20px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"40px","specialMessageHeaderMarginBottom":"20px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Segoe UI","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.5","fontSizeBase":"16px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"14px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[{"source":"SERVER","name":"Segoe UI","styles":[{"style":"NORMAL","weight":"400","__typename":"FontStyleData"},{"style":"NORMAL","weight":"300","__typename":"FontStyleData"},{"style":"NORMAL","weight":"600","__typename":"FontStyleData"},{"style":"NORMAL","weight":"700","__typename":"FontStyleData"},{"style":"ITALIC","weight":"400","__typename":"FontStyleData"}],"assetNames":["SegoeUI-normal-400.woff2","SegoeUI-normal-300.woff2","SegoeUI-normal-600.woff2","SegoeUI-normal-700.woff2","SegoeUI-italic-400.woff2"],"__typename":"CustomFont"},{"source":"SERVER","name":"MWF Fluent Icons","styles":[{"style":"NORMAL","weight":"400","__typename":"FontStyleData"}],"assetNames":["MWFFluentIcons-normal-400.woff2"],"__typename":"CustomFont"}],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1745505309750","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1745505309750","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:quilt:o365.prod:pages/blogs/BlogMessagePage:board:AzureMigrationBlog-1745502712655":{"__typename":"CachedAsset","id":"quilt:o365.prod:pages/blogs/BlogMessagePage:board:AzureMigrationBlog-1745502712655","value":{"id":"BlogMessagePage","container":{"id":"Common","headerProps":{"backgroundImageProps":null,"backgroundColor":null,"addComponents":null,"removeComponents":["community.widget.bannerWidget"],"componentOrder":null,"__typename":"QuiltContainerSectionProps"},"headerComponentProps":{"community.widget.breadcrumbWidget":{"disableLastCrumbForDesktop":false}},"footerProps":null,"footerComponentProps":null,"items":[{"id":"blog-article","layout":"ONE_COLUMN","bgColor":null,"showTitle":null,"showDescription":null,"textPosition":null,"textColor":null,"sectionEditLevel":"LOCKED","bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"OneColumnQuiltSection","columnMap":{"main":[{"id":"blogs.widget.blogArticleWidget","className":"lia-blog-container","props":null,"__typename":"QuiltComponent"}],"__typename":"OneSectionColumns"}},{"id":"section-1729184836777","layout":"MAIN_SIDE","bgColor":"transparent","showTitle":false,"showDescription":false,"textPosition":"CENTER","textColor":"var(--lia-bs-body-color)","sectionEditLevel":null,"bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"MainSideQuiltSection","columnMap":{"main":[],"side":[],"__typename":"MainSideSectionColumns"}}],"__typename":"QuiltContainer"},"__typename":"Quilt","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-pages/blogs/BlogMessagePage-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-pages/blogs/BlogMessagePage-1745505309750","value":{"title":"{contextMessageSubject} | {communityTitle}","errorMissing":"This blog post cannot be found","name":"Blog Message Page","section.blog-article.title":"Blog Post","archivedMessageTitle":"This Content Has Been Archived","section.section-1729184836777.title":"","section.section-1729184836777.description":"","section.CncIde.title":"Blog Post","section.tifEmD.description":"","section.tifEmD.title":""},"localOverride":false},"CachedAsset:quiltWrapper:o365.prod:Common:1745505310233":{"__typename":"CachedAsset","id":"quiltWrapper:o365.prod:Common:1745505310233","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"community.widget.navbarWidget","props":{"showUserName":true,"showRegisterLink":true,"useIconLanguagePicker":true,"useLabelLanguagePicker":true,"className":"QuiltComponent_lia-component-edit-mode__0nCcm","links":{"sideLinks":[],"mainLinks":[{"children":[],"linkType":"INTERNAL","id":"gxcuf89792","params":{},"routeName":"CommunityPage"},{"children":[],"linkType":"EXTERNAL","id":"external-link","url":"/Directory","target":"SELF"},{"children":[{"linkType":"INTERNAL","id":"microsoft365","params":{"categoryId":"microsoft365"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"windows","params":{"categoryId":"Windows"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"Common-microsoft365-copilot-link","params":{"categoryId":"Microsoft365Copilot"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-teams","params":{"categoryId":"MicrosoftTeams"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-securityand-compliance","params":{"categoryId":"microsoft-security"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"azure","params":{"categoryId":"Azure"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"Common-content_management-link","params":{"categoryId":"Content_Management"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"exchange","params":{"categoryId":"Exchange"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"windows-server","params":{"categoryId":"Windows-Server"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"outlook","params":{"categoryId":"Outlook"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-endpoint-manager","params":{"categoryId":"microsoftintune"},"routeName":"CategoryPage"},{"linkType":"EXTERNAL","id":"external-link-2","url":"/Directory","target":"SELF"}],"linkType":"EXTERNAL","id":"communities","url":"/","target":"BLANK"},{"children":[{"linkType":"INTERNAL","id":"a-i","params":{"categoryId":"AI"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"education-sector","params":{"categoryId":"EducationSector"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"partner-community","params":{"categoryId":"PartnerCommunity"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"i-t-ops-talk","params":{"categoryId":"ITOpsTalk"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"healthcare-and-life-sciences","params":{"categoryId":"HealthcareAndLifeSciences"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-mechanics","params":{"categoryId":"MicrosoftMechanics"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"public-sector","params":{"categoryId":"PublicSector"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"s-m-b","params":{"categoryId":"MicrosoftforNonprofits"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"io-t","params":{"categoryId":"IoT"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"startupsat-microsoft","params":{"categoryId":"StartupsatMicrosoft"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"driving-adoption","params":{"categoryId":"DrivingAdoption"},"routeName":"CategoryPage"},{"linkType":"EXTERNAL","id":"external-link-1","url":"/Directory","target":"SELF"}],"linkType":"EXTERNAL","id":"communities-1","url":"/","target":"SELF"},{"children":[],"linkType":"EXTERNAL","id":"external","url":"/Blogs","target":"SELF"},{"children":[],"linkType":"EXTERNAL","id":"external-1","url":"/Events","target":"SELF"},{"children":[{"linkType":"INTERNAL","id":"microsoft-learn-1","params":{"categoryId":"MicrosoftLearn"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-learn-blog","params":{"boardId":"MicrosoftLearnBlog","categoryId":"MicrosoftLearn"},"routeName":"BlogBoardPage"},{"linkType":"EXTERNAL","id":"external-10","url":"https://learningroomdirectory.microsoft.com/","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-3","url":"https://docs.microsoft.com/learn/dynamics365/?WT.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-4","url":"https://docs.microsoft.com/learn/m365/?wt.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-5","url":"https://docs.microsoft.com/learn/topics/sci/?wt.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-6","url":"https://docs.microsoft.com/learn/powerplatform/?wt.mc_id=techcom_header-webpage-powerplatform","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-7","url":"https://docs.microsoft.com/learn/github/?wt.mc_id=techcom_header-webpage-github","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-8","url":"https://docs.microsoft.com/learn/teams/?wt.mc_id=techcom_header-webpage-teams","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-9","url":"https://docs.microsoft.com/learn/dotnet/?wt.mc_id=techcom_header-webpage-dotnet","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-2","url":"https://docs.microsoft.com/learn/azure/?WT.mc_id=techcom_header-webpage-m365","target":"BLANK"}],"linkType":"INTERNAL","id":"microsoft-learn","params":{"categoryId":"MicrosoftLearn"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"community-info-center","params":{"categoryId":"Community-Info-Center"},"routeName":"CategoryPage"}]},"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","controllerHighlightColor":"hsla(30, 100%, 50%)","linkFontWeight":"400","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkBoxShadowHover":"none","linkFontSize":"14px","backgroundOpacity":0.8,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","hamburgerColor":"var(--lia-nav-controller-icon-color)","linkTextBorderBottom":"none","brandLogoHeight":"30px","linkBgHoverColor":"transparent","linkLetterSpacing":"normal","collapseMenuDividerOpacity":0.16,"dropdownPaddingBottom":"15px","paddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"1px solid var(--lia-bs-border-color)","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","collapseMenuDividerBg":"var(--lia-nav-link-color)","linkColor":"var(--lia-bs-body-color)","linkJustifyContent":"flex-start","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","controllerTextColor":"var(--lia-nav-controller-icon-color)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-body-color)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid var(--lia-bs-body-color)","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","linkPaddingX":"10px","linkPaddingY":"5px","paddingTop":"15px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkBgColor":"transparent","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkDropdownPaddingY":"9px","controllerIconColor":"var(--lia-bs-body-color)","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"var(--lia-bs-body-color)"},"showSearchIcon":false,"languagePickerStyle":"iconAndLabel"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"transparent","linkHighlightColor":"var(--lia-bs-primary)","visualEffects":{"showBottomBorder":true},"linkTextColor":"var(--lia-bs-gray-700)"},"__typename":"QuiltComponent"},{"id":"custom.widget.community_banner","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"usePageWidth":false,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.HeroBanner","props":{"widgetVisibility":"signedInOrAnonymous","usePageWidth":false,"useTitle":true,"cMax_items":3,"useBackground":false,"title":"","lazyLoad":false,"widgetChooser":"custom.widget.HeroBanner"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"custom.widget.MicrosoftFooter","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1745505309750","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.community_banner-en-1745486158577":{"__typename":"CachedAsset","id":"component:custom.widget.community_banner-en-1745486158577","value":{"component":{"id":"custom.widget.community_banner","template":{"id":"community_banner","markupLanguage":"HANDLEBARS","style":".community-banner {\n a.top-bar.btn {\n top: 0px;\n width: 100%;\n z-index: 999;\n text-align: center;\n left: 0px;\n background: #0068b8;\n color: white;\n padding: 10px 0px;\n display: block;\n box-shadow: none !important;\n border: none !important;\n border-radius: none !important;\n margin: 0px !important;\n font-size: 14px;\n }\n}\n","texts":null,"defaults":{"config":{"applicablePages":[],"description":"community announcement text","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.community_banner","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"community announcement text","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":{"css":".custom_widget_community_banner_community-banner_1x9u2_1 {\n a.custom_widget_community_banner_top-bar_1x9u2_2.custom_widget_community_banner_btn_1x9u2_2 {\n top: 0;\n width: 100%;\n z-index: 999;\n text-align: center;\n left: 0;\n background: #0068b8;\n color: white;\n padding: 0.625rem 0;\n display: block;\n box-shadow: none !important;\n border: none !important;\n border-radius: none !important;\n margin: 0 !important;\n font-size: 0.875rem;\n }\n}\n","tokens":{"community-banner":"custom_widget_community_banner_community-banner_1x9u2_1","top-bar":"custom_widget_community_banner_top-bar_1x9u2_2","btn":"custom_widget_community_banner_btn_1x9u2_2"}},"form":null},"localOverride":false},"CachedAsset:component:custom.widget.HeroBanner-en-1745486158577":{"__typename":"CachedAsset","id":"component:custom.widget.HeroBanner-en-1745486158577","value":{"component":{"id":"custom.widget.HeroBanner","template":{"id":"HeroBanner","markupLanguage":"REACT","style":null,"texts":{"searchPlaceholderText":"Search this community","followActionText":"Follow","unfollowActionText":"Following","searchOnHoverText":"Please enter your search term(s) and then press return key to complete a search.","blogs.sidebar.pagetitle":"Latest Blogs | Microsoft Tech Community","followThisNode":"Follow this node","unfollowThisNode":"Unfollow this node"},"defaults":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[{"id":"max_items","dataType":"NUMBER","list":false,"defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"control":"INPUT","__typename":"PropDefinition"}],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.HeroBanner","form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"},"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[{"id":"max_items","dataType":"NUMBER","list":false,"defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"control":"INPUT","__typename":"PropDefinition"}],"__typename":"ComponentProperties"},"form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"},"__typename":"Component","localOverride":false},"globalCss":null,"form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"}},"localOverride":false},"CachedAsset:component:custom.widget.MicrosoftFooter-en-1745486158577":{"__typename":"CachedAsset","id":"component:custom.widget.MicrosoftFooter-en-1745486158577","value":{"component":{"id":"custom.widget.MicrosoftFooter","template":{"id":"MicrosoftFooter","markupLanguage":"HANDLEBARS","style":".context-uhf {\n min-width: 280px;\n font-size: 15px;\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n & *,\n & *:before,\n & *:after {\n box-sizing: inherit;\n }\n a.c-uhff-link {\n color: #616161;\n word-break: break-word;\n text-decoration: none;\n }\n &a:link,\n &a:focus,\n &a:hover,\n &a:active,\n &a:visited {\n text-decoration: none;\n color: inherit;\n }\n & div {\n font-family: 'Segoe UI', SegoeUI, 'Helvetica Neue', Helvetica, Arial, sans-serif;\n }\n}\n.c-uhff {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.c-uhff-nav {\n margin: 0 auto;\n max-width: calc(1600px + 10%);\n padding: 0 5%;\n box-sizing: inherit;\n &:before,\n &:after {\n content: ' ';\n display: table;\n clear: left;\n }\n @media only screen and (max-width: 1083px) {\n padding-left: 12px;\n }\n .c-heading-4 {\n color: #616161;\n word-break: break-word;\n font-size: 15px;\n line-height: 20px;\n padding: 36px 0 4px;\n font-weight: 600;\n }\n .c-uhff-nav-row {\n .c-uhff-nav-group {\n display: block;\n float: left;\n min-height: 1px;\n vertical-align: text-top;\n padding: 0 12px;\n width: 100%;\n zoom: 1;\n &:first-child {\n padding-left: 0;\n @media only screen and (max-width: 1083px) {\n padding-left: 12px;\n }\n }\n @media only screen and (min-width: 540px) and (max-width: 1082px) {\n width: 33.33333%;\n }\n @media only screen and (min-width: 1083px) {\n width: 16.6666666667%;\n }\n ul.c-list.f-bare {\n font-size: 11px;\n line-height: 16px;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n list-style-type: none;\n li {\n word-break: break-word;\n padding: 8px 0;\n margin: 0;\n }\n }\n }\n }\n}\n.c-uhff-base {\n background: #f2f2f2;\n margin: 0 auto;\n max-width: calc(1600px + 10%);\n padding: 30px 5% 16px;\n &:before,\n &:after {\n content: ' ';\n display: table;\n }\n &:after {\n clear: both;\n }\n a.c-uhff-ccpa {\n font-size: 11px;\n line-height: 16px;\n float: left;\n margin: 3px 0;\n }\n a.c-uhff-ccpa:hover {\n text-decoration: underline;\n }\n ul.c-list {\n font-size: 11px;\n line-height: 16px;\n float: right;\n margin: 3px 0;\n color: #616161;\n li {\n padding: 0 24px 4px 0;\n display: inline-block;\n }\n }\n .c-list.f-bare {\n padding-left: 0;\n list-style-type: none;\n }\n @media only screen and (max-width: 1083px) {\n display: flex;\n flex-wrap: wrap;\n padding: 30px 24px 16px;\n }\n}\n\n.social-share {\n position: fixed;\n top: 60%;\n transform: translateY(-50%);\n left: 0;\n z-index: 1000;\n}\n\n.sharing-options {\n list-style: none;\n padding: 0;\n margin: 0;\n display: block;\n flex-direction: column;\n background-color: white;\n width: 43px;\n border-radius: 0px 7px 7px 0px;\n}\n.linkedin-icon {\n border-top-right-radius: 7px;\n}\n.linkedin-icon:hover {\n border-radius: 0;\n}\n.social-share-rss-image {\n border-bottom-right-radius: 7px;\n}\n.social-share-rss-image:hover {\n border-radius: 0;\n}\n\n.social-link-footer {\n position: relative;\n display: block;\n margin: -2px 0;\n transition: all 0.2s ease;\n}\n.social-link-footer:hover .linkedin-icon {\n border-radius: 0;\n}\n.social-link-footer:hover .social-share-rss-image {\n border-radius: 0;\n}\n\n.social-link-footer img {\n width: 40px;\n height: auto;\n transition: filter 0.3s ease;\n}\n\n.social-share-list {\n width: 40px;\n}\n.social-share-rss-image {\n width: 40px;\n}\n\n.share-icon {\n border: 2px solid transparent;\n display: inline-block;\n position: relative;\n}\n\n.share-icon:hover {\n opacity: 1;\n border: 2px solid white;\n box-sizing: border-box;\n}\n\n.share-icon:hover .label {\n opacity: 1;\n visibility: visible;\n border: 2px solid white;\n box-sizing: border-box;\n border-left: none;\n}\n\n.label {\n position: absolute;\n left: 100%;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n color: white;\n border-radius: 0 10 0 10px;\n top: 50%;\n transform: translateY(-50%);\n height: 40px;\n border-radius: 0 6px 6px 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 5px 20px 8px;\n margin-left: -1px;\n}\n.linkedin {\n background-color: #0474b4;\n}\n.facebook {\n background-color: #3c5c9c;\n}\n.twitter {\n background-color: white;\n color: black;\n}\n.reddit {\n background-color: #fc4404;\n}\n.mail {\n background-color: #848484;\n}\n.bluesky {\n background-color: white;\n color: black;\n}\n.rss {\n background-color: #ec7b1c;\n}\n#RSS {\n width: 40px;\n height: 40px;\n}\n\n@media (max-width: 991px) {\n .social-share {\n display: none;\n }\n}\n","texts":{"New tab":"What's New","New 1":"Surface Laptop Studio 2","New 2":"Surface Laptop Go 3","New 3":"Surface Pro 9","New 4":"Surface Laptop 5","New 5":"Surface Studio 2+","New 6":"Copilot in Windows","New 7":"Microsoft 365","New 8":"Windows 11 apps","Store tab":"Microsoft Store","Store 1":"Account Profile","Store 2":"Download Center","Store 3":"Microsoft Store Support","Store 4":"Returns","Store 5":"Order tracking","Store 6":"Certified Refurbished","Store 7":"Microsoft Store Promise","Store 8":"Flexible Payments","Education tab":"Education","Edu 1":"Microsoft in education","Edu 2":"Devices for education","Edu 3":"Microsoft Teams for Education","Edu 4":"Microsoft 365 Education","Edu 5":"How to buy for your school","Edu 6":"Educator Training and development","Edu 7":"Deals for students and parents","Edu 8":"Azure for students","Business tab":"Business","Bus 1":"Microsoft Cloud","Bus 2":"Microsoft Security","Bus 3":"Dynamics 365","Bus 4":"Microsoft 365","Bus 5":"Microsoft Power Platform","Bus 6":"Microsoft Teams","Bus 7":"Microsoft Industry","Bus 8":"Small Business","Developer tab":"Developer & IT","Dev 1":"Azure","Dev 2":"Developer Center","Dev 3":"Documentation","Dev 4":"Microsoft Learn","Dev 5":"Microsoft Tech Community","Dev 6":"Azure Marketplace","Dev 7":"AppSource","Dev 8":"Visual Studio","Company tab":"Company","Com 1":"Careers","Com 2":"About Microsoft","Com 3":"Company News","Com 4":"Privacy at Microsoft","Com 5":"Investors","Com 6":"Diversity and inclusion","Com 7":"Accessiblity","Com 8":"Sustainibility"},"defaults":{"config":{"applicablePages":[],"description":"The Microsoft Footer","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.MicrosoftFooter","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"The Microsoft Footer","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":{"css":".custom_widget_MicrosoftFooter_context-uhf_105bp_1 {\n min-width: 17.5rem;\n font-size: 0.9375rem;\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n & *,\n & *:before,\n & *:after {\n box-sizing: inherit;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-link_105bp_12 {\n color: #616161;\n word-break: break-word;\n text-decoration: none;\n }\n &a:link,\n &a:focus,\n &a:hover,\n &a:active,\n &a:visited {\n text-decoration: none;\n color: inherit;\n }\n & div {\n font-family: 'Segoe UI', SegoeUI, 'Helvetica Neue', Helvetica, Arial, sans-serif;\n }\n}\n.custom_widget_MicrosoftFooter_c-uhff_105bp_12 {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.custom_widget_MicrosoftFooter_c-uhff-nav_105bp_35 {\n margin: 0 auto;\n max-width: calc(100rem + 10%);\n padding: 0 5%;\n box-sizing: inherit;\n &:before,\n &:after {\n content: ' ';\n display: table;\n clear: left;\n }\n @media only screen and (max-width: 1083px) {\n padding-left: 0.75rem;\n }\n .custom_widget_MicrosoftFooter_c-heading-4_105bp_49 {\n color: #616161;\n word-break: break-word;\n font-size: 0.9375rem;\n line-height: 1.25rem;\n padding: 2.25rem 0 0.25rem;\n font-weight: 600;\n }\n .custom_widget_MicrosoftFooter_c-uhff-nav-row_105bp_57 {\n .custom_widget_MicrosoftFooter_c-uhff-nav-group_105bp_58 {\n display: block;\n float: left;\n min-height: 0.0625rem;\n vertical-align: text-top;\n padding: 0 0.75rem;\n width: 100%;\n zoom: 1;\n &:first-child {\n padding-left: 0;\n @media only screen and (max-width: 1083px) {\n padding-left: 0.75rem;\n }\n }\n @media only screen and (min-width: 540px) and (max-width: 1082px) {\n width: 33.33333%;\n }\n @media only screen and (min-width: 1083px) {\n width: 16.6666666667%;\n }\n ul.custom_widget_MicrosoftFooter_c-list_105bp_78.custom_widget_MicrosoftFooter_f-bare_105bp_78 {\n font-size: 0.6875rem;\n line-height: 1rem;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n list-style-type: none;\n li {\n word-break: break-word;\n padding: 0.5rem 0;\n margin: 0;\n }\n }\n }\n }\n}\n.custom_widget_MicrosoftFooter_c-uhff-base_105bp_94 {\n background: #f2f2f2;\n margin: 0 auto;\n max-width: calc(100rem + 10%);\n padding: 1.875rem 5% 1rem;\n &:before,\n &:after {\n content: ' ';\n display: table;\n }\n &:after {\n clear: both;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107 {\n font-size: 0.6875rem;\n line-height: 1rem;\n float: left;\n margin: 0.1875rem 0;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107:hover {\n text-decoration: underline;\n }\n ul.custom_widget_MicrosoftFooter_c-list_105bp_78 {\n font-size: 0.6875rem;\n line-height: 1rem;\n float: right;\n margin: 0.1875rem 0;\n color: #616161;\n li {\n padding: 0 1.5rem 0.25rem 0;\n display: inline-block;\n }\n }\n .custom_widget_MicrosoftFooter_c-list_105bp_78.custom_widget_MicrosoftFooter_f-bare_105bp_78 {\n padding-left: 0;\n list-style-type: none;\n }\n @media only screen and (max-width: 1083px) {\n display: flex;\n flex-wrap: wrap;\n padding: 1.875rem 1.5rem 1rem;\n }\n}\n.custom_widget_MicrosoftFooter_social-share_105bp_138 {\n position: fixed;\n top: 60%;\n transform: translateY(-50%);\n left: 0;\n z-index: 1000;\n}\n.custom_widget_MicrosoftFooter_sharing-options_105bp_146 {\n list-style: none;\n padding: 0;\n margin: 0;\n display: block;\n flex-direction: column;\n background-color: white;\n width: 2.6875rem;\n border-radius: 0 0.4375rem 0.4375rem 0;\n}\n.custom_widget_MicrosoftFooter_linkedin-icon_105bp_156 {\n border-top-right-radius: 7px;\n}\n.custom_widget_MicrosoftFooter_linkedin-icon_105bp_156:hover {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n border-bottom-right-radius: 7px;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162:hover {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169 {\n position: relative;\n display: block;\n margin: -0.125rem 0;\n transition: all 0.2s ease;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169:hover .custom_widget_MicrosoftFooter_linkedin-icon_105bp_156 {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169:hover .custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169 img {\n width: 2.5rem;\n height: auto;\n transition: filter 0.3s ease;\n}\n.custom_widget_MicrosoftFooter_social-share-list_105bp_188 {\n width: 2.5rem;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n width: 2.5rem;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195 {\n border: 2px solid transparent;\n display: inline-block;\n position: relative;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195:hover {\n opacity: 1;\n border: 2px solid white;\n box-sizing: border-box;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195:hover .custom_widget_MicrosoftFooter_label_105bp_207 {\n opacity: 1;\n visibility: visible;\n border: 2px solid white;\n box-sizing: border-box;\n border-left: none;\n}\n.custom_widget_MicrosoftFooter_label_105bp_207 {\n position: absolute;\n left: 100%;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n color: white;\n border-radius: 0 10 0 0.625rem;\n top: 50%;\n transform: translateY(-50%);\n height: 2.5rem;\n border-radius: 0 0.375rem 0.375rem 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1.25rem 0.3125rem 1.25rem 0.5rem;\n margin-left: -0.0625rem;\n}\n.custom_widget_MicrosoftFooter_linkedin_105bp_156 {\n background-color: #0474b4;\n}\n.custom_widget_MicrosoftFooter_facebook_105bp_237 {\n background-color: #3c5c9c;\n}\n.custom_widget_MicrosoftFooter_twitter_105bp_240 {\n background-color: white;\n color: black;\n}\n.custom_widget_MicrosoftFooter_reddit_105bp_244 {\n background-color: #fc4404;\n}\n.custom_widget_MicrosoftFooter_mail_105bp_247 {\n background-color: #848484;\n}\n.custom_widget_MicrosoftFooter_bluesky_105bp_250 {\n background-color: white;\n color: black;\n}\n.custom_widget_MicrosoftFooter_rss_105bp_254 {\n background-color: #ec7b1c;\n}\n#custom_widget_MicrosoftFooter_RSS_105bp_1 {\n width: 2.5rem;\n height: 2.5rem;\n}\n@media (max-width: 991px) {\n .custom_widget_MicrosoftFooter_social-share_105bp_138 {\n display: none;\n }\n}\n","tokens":{"context-uhf":"custom_widget_MicrosoftFooter_context-uhf_105bp_1","c-uhff-link":"custom_widget_MicrosoftFooter_c-uhff-link_105bp_12","c-uhff":"custom_widget_MicrosoftFooter_c-uhff_105bp_12","c-uhff-nav":"custom_widget_MicrosoftFooter_c-uhff-nav_105bp_35","c-heading-4":"custom_widget_MicrosoftFooter_c-heading-4_105bp_49","c-uhff-nav-row":"custom_widget_MicrosoftFooter_c-uhff-nav-row_105bp_57","c-uhff-nav-group":"custom_widget_MicrosoftFooter_c-uhff-nav-group_105bp_58","c-list":"custom_widget_MicrosoftFooter_c-list_105bp_78","f-bare":"custom_widget_MicrosoftFooter_f-bare_105bp_78","c-uhff-base":"custom_widget_MicrosoftFooter_c-uhff-base_105bp_94","c-uhff-ccpa":"custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107","social-share":"custom_widget_MicrosoftFooter_social-share_105bp_138","sharing-options":"custom_widget_MicrosoftFooter_sharing-options_105bp_146","linkedin-icon":"custom_widget_MicrosoftFooter_linkedin-icon_105bp_156","social-share-rss-image":"custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162","social-link-footer":"custom_widget_MicrosoftFooter_social-link-footer_105bp_169","social-share-list":"custom_widget_MicrosoftFooter_social-share-list_105bp_188","share-icon":"custom_widget_MicrosoftFooter_share-icon_105bp_195","label":"custom_widget_MicrosoftFooter_label_105bp_207","linkedin":"custom_widget_MicrosoftFooter_linkedin_105bp_156","facebook":"custom_widget_MicrosoftFooter_facebook_105bp_237","twitter":"custom_widget_MicrosoftFooter_twitter_105bp_240","reddit":"custom_widget_MicrosoftFooter_reddit_105bp_244","mail":"custom_widget_MicrosoftFooter_mail_105bp_247","bluesky":"custom_widget_MicrosoftFooter_bluesky_105bp_250","rss":"custom_widget_MicrosoftFooter_rss_105bp_254","RSS":"custom_widget_MicrosoftFooter_RSS_105bp_1"}},"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1745505309750","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBanner-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBanner-1745505309750","value":{"messageMarkedAsSpam":"This post has been marked as spam","messageMarkedAsSpam@board:TKB":"This article has been marked as spam","messageMarkedAsSpam@board:BLOG":"This post has been marked as spam","messageMarkedAsSpam@board:FORUM":"This discussion has been marked as spam","messageMarkedAsSpam@board:OCCASION":"This event has been marked as spam","messageMarkedAsSpam@board:IDEA":"This idea has been marked as spam","manageSpam":"Manage Spam","messageMarkedAsAbuse":"This post has been marked as abuse","messageMarkedAsAbuse@board:TKB":"This article has been marked as abuse","messageMarkedAsAbuse@board:BLOG":"This post has been marked as abuse","messageMarkedAsAbuse@board:FORUM":"This discussion has been marked as abuse","messageMarkedAsAbuse@board:OCCASION":"This event has been marked as abuse","messageMarkedAsAbuse@board:IDEA":"This idea has been marked as abuse","preModCommentAuthorText":"This comment will be published as soon as it is approved","preModCommentModeratorText":"This comment is awaiting moderation","messageMarkedAsOther":"This post has been rejected due to other reasons","messageMarkedAsOther@board:TKB":"This article has been rejected due to other reasons","messageMarkedAsOther@board:BLOG":"This post has been rejected due to other reasons","messageMarkedAsOther@board:FORUM":"This discussion has been rejected due to other reasons","messageMarkedAsOther@board:OCCASION":"This event has been rejected due to other reasons","messageMarkedAsOther@board:IDEA":"This idea has been rejected due to other reasons","messageArchived":"This post was archived on {date}","relatedUrl":"View Related Content","relatedContentText":"Showing related content","archivedContentLink":"View Archived Content"},"localOverride":false},"Category:category:Exchange":{"__typename":"Category","id":"category:Exchange","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Outlook":{"__typename":"Category","id":"category:Outlook","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Community-Info-Center":{"__typename":"Category","id":"category:Community-Info-Center","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:EducationSector":{"__typename":"Category","id":"category:EducationSector","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:DrivingAdoption":{"__typename":"Category","id":"category:DrivingAdoption","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Windows-Server":{"__typename":"Category","id":"category:Windows-Server","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftTeams":{"__typename":"Category","id":"category:MicrosoftTeams","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:PublicSector":{"__typename":"Category","id":"category:PublicSector","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft365":{"__typename":"Category","id":"category:microsoft365","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:IoT":{"__typename":"Category","id":"category:IoT","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:HealthcareAndLifeSciences":{"__typename":"Category","id":"category:HealthcareAndLifeSciences","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:ITOpsTalk":{"__typename":"Category","id":"category:ITOpsTalk","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftLearn":{"__typename":"Category","id":"category:MicrosoftLearn","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Blog:board:MicrosoftLearnBlog":{"__typename":"Blog","id":"board:MicrosoftLearnBlog","blogPolicies":{"__typename":"BlogPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:AI":{"__typename":"Category","id":"category:AI","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftMechanics":{"__typename":"Category","id":"category:MicrosoftMechanics","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftforNonprofits":{"__typename":"Category","id":"category:MicrosoftforNonprofits","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:StartupsatMicrosoft":{"__typename":"Category","id":"category:StartupsatMicrosoft","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:PartnerCommunity":{"__typename":"Category","id":"category:PartnerCommunity","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Microsoft365Copilot":{"__typename":"Category","id":"category:Microsoft365Copilot","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Windows":{"__typename":"Category","id":"category:Windows","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Content_Management":{"__typename":"Category","id":"category:Content_Management","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft-security":{"__typename":"Category","id":"category:microsoft-security","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoftintune":{"__typename":"Category","id":"category:microsoftintune","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"QueryVariables:TopicReplyList:message:4403200:3":{"__typename":"QueryVariables","id":"TopicReplyList:message:4403200:3","value":{"id":"message:4403200","first":10,"sorts":{"postTime":{"direction":"DESC"}},"repliesFirst":3,"repliesFirstDepthThree":1,"repliesSorts":{"postTime":{"direction":"DESC"}},"useAvatar":true,"useAuthorLogin":true,"useAuthorRank":true,"useBody":true,"useKudosCount":true,"useTimeToRead":false,"useMedia":false,"useReadOnlyIcon":false,"useRepliesCount":true,"useSearchSnippet":false,"useAcceptedSolutionButton":false,"useSolvedBadge":false,"useAttachments":false,"attachmentsFirst":5,"useTags":true,"useNodeAncestors":false,"useUserHoverCard":false,"useNodeHoverCard":false,"useModerationStatus":true,"usePreviewSubjectModal":false,"useMessageStatus":true}},"ROOT_MUTATION":{"__typename":"Mutation"},"CachedAsset:text:en_US-components/community/Navbar-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1745505309750","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","gxcuf89792":"Tech Community","external-1":"Events","s-m-b":"Nonprofit Community","windows-server":"Windows Server","education-sector":"Education Sector","driving-adoption":"Driving Adoption","Common-content_management-link":"Content Management","microsoft-learn":"Microsoft Learn","s-q-l-server":"Content Management","partner-community":"Microsoft Partner Community","microsoft365":"Microsoft 365","external-9":".NET","external-8":"Teams","external-7":"Github","products-services":"Products","external-6":"Power Platform","communities-1":"Topics","external-5":"Microsoft Security","planner":"Outlook","external-4":"Microsoft 365","external-3":"Dynamics 365","azure":"Azure","healthcare-and-life-sciences":"Healthcare and Life Sciences","external-2":"Azure","microsoft-mechanics":"Microsoft Mechanics","microsoft-learn-1":"Community","external-10":"Learning Room Directory","microsoft-learn-blog":"Blog","windows":"Windows","i-t-ops-talk":"ITOps Talk","external-link-1":"View All","microsoft-securityand-compliance":"Microsoft Security","public-sector":"Public Sector","community-info-center":"Lounge","external-link-2":"View All","microsoft-teams":"Microsoft Teams","external":"Blogs","microsoft-endpoint-manager":"Microsoft Intune","startupsat-microsoft":"Startups at Microsoft","exchange":"Exchange","a-i":"AI and Machine Learning","io-t":"Internet of Things (IoT)","Common-microsoft365-copilot-link":"Microsoft 365 Copilot","outlook":"Microsoft 365 Copilot","external-link":"Community Hubs","communities":"Products"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1745505309750","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1745505309750","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1745505309750","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1745505309750","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1745505309750","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewStandard-1745505309750","value":{"anonymous":"Anonymous","author":"{messageAuthorLogin}","authorBy":"{messageAuthorLogin}","board":"{messageBoardTitle}","replyToUser":" to {parentAuthor}","showMoreReplies":"Show More","replyText":"Reply","repliesText":"Replies","markedAsSolved":"Marked as Solved","movedMessagePlaceholder.BLOG":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.TKB":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.FORUM":"{count, plural, =0 {This reply has been} other {These replies have been} }","movedMessagePlaceholder.IDEA":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.OCCASION":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholderUrlText":"moved.","messageStatus":"Status: ","statusChanged":"Status changed: {previousStatus} to {currentStatus}","statusAdded":"Status added: {status}","statusRemoved":"Status removed: {status}","labelExpand":"expand replies","labelCollapse":"collapse replies","unhelpfulReason.reason1":"Content is outdated","unhelpfulReason.reason2":"Article is missing information","unhelpfulReason.reason3":"Content is for a different Product","unhelpfulReason.reason4":"Doesn't match what I was searching for"},"localOverride":false},"CachedAsset:text:en_US-components/messages/ThreadedReplyList-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/ThreadedReplyList-1745505309750","value":{"title":"{count, plural, one{# Reply} other{# Replies}}","title@board:BLOG":"{count, plural, one{# Comment} other{# Comments}}","title@board:TKB":"{count, plural, one{# Comment} other{# Comments}}","title@board:IDEA":"{count, plural, one{# Comment} other{# Comments}}","title@board:OCCASION":"{count, plural, one{# Comment} other{# Comments}}","noRepliesTitle":"No Replies","noRepliesTitle@board:BLOG":"No Comments","noRepliesTitle@board:TKB":"No Comments","noRepliesTitle@board:IDEA":"No Comments","noRepliesTitle@board:OCCASION":"No Comments","noRepliesDescription":"Be the first to reply","noRepliesDescription@board:BLOG":"Be the first to comment","noRepliesDescription@board:TKB":"Be the first to comment","noRepliesDescription@board:IDEA":"Be the first to comment","noRepliesDescription@board:OCCASION":"Be the first to comment","messageReadOnlyAlert:BLOG":"Comments have been turned off for this post","messageReadOnlyAlert:TKB":"Comments have been turned off for this article","messageReadOnlyAlert:IDEA":"Comments have been turned off for this idea","messageReadOnlyAlert:FORUM":"Replies have been turned off for this discussion","messageReadOnlyAlert:OCCASION":"Comments have been turned off for this event"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyCallToAction-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyCallToAction-1745505309750","value":{"leaveReply":"Leave a reply...","leaveReply@board:BLOG@message:root":"Leave a comment...","leaveReply@board:TKB@message:root":"Leave a comment...","leaveReply@board:IDEA@message:root":"Leave a comment...","leaveReply@board:OCCASION@message:root":"Leave a comment...","repliesTurnedOff.FORUM":"Replies are turned off for this topic","repliesTurnedOff.BLOG":"Comments are turned off for this topic","repliesTurnedOff.TKB":"Comments are turned off for this topic","repliesTurnedOff.IDEA":"Comments are turned off for this topic","repliesTurnedOff.OCCASION":"Comments are turned off for this topic","infoText":"Stop poking me!"},"localOverride":false},"Rank:rank:37":{"__typename":"Rank","id":"rank:37","position":18,"name":"Copper Contributor","color":"333333","icon":null,"rankStyle":"TEXT"},"User:user:3004044":{"__typename":"User","id":"user:3004044","uid":3004044,"login":"guna","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2025-04-20T23:29:01.834-07:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-4.svg?time=0"},"rank":{"__ref":"Rank:rank:37"},"entityType":"USER","eventPath":"community:gxcuf89792/user:3004044"},"ModerationData:moderation_data:4406095":{"__typename":"ModerationData","id":"moderation_data:4406095","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":"member"},"BlogReplyMessage:message:4406095":{"__typename":"BlogReplyMessage","author":{"__ref":"User:user:3004044"},"id":"message:4406095","revisionNum":1,"uid":4406095,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Blog:board:AzureMigrationBlog"},"parent":{"__ref":"BlogTopicMessage:message:4403200"},"conversation":{"__ref":"Conversation:conversation:4403200"},"subject":"Re: Using Azure Functions to read AVS data via Powershell, PowerCLI, and the API","moderationData":{"__ref":"ModerationData:moderation_data:4406095"},"body":"

You can try Devzery — it’s a no-code platform for API and regression testing. Works well with different setups.

","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"113","kudosSumWeight":0,"repliesCount":0,"postTime":"2025-04-20T23:36:28.730-07:00","lastPublishTime":"2025-04-20T23:36:28.730-07:00","metrics":{"__typename":"MessageMetrics","views":9},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"entityType":"BLOG_REPLY","eventPath":"category:Azure/category:products-services/category:communities/community:gxcuf89792board:AzureMigrationBlog/message:4403200/message:4406095","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1745505309750","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1745505309750","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCoverImage-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCoverImage-1745505309750","value":{"coverImageTitle":"Cover Image"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeTitle-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeTitle-1745505309750","value":{"nodeTitle":"{nodeTitle, select, community {Community} other {{nodeTitle}}} "},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTimeToRead-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTimeToRead-1745505309750","value":{"minReadText":"{min} MIN READ"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1745505309750","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1745505309750","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserRank-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserRank-1745505309750","value":{"rankName":"{rankName}","userRank":"Author rank {rankName}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1745505309750","value":{"postTime":"Published: {time}","lastPublishTime":"Last Update: {time}","conversation.lastPostingActivityTime":"Last posting activity time: {time}","conversation.lastPostTime":"Last post time: {time}","moderationData.rejectTime":"Rejected time: {time}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1745505309750","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCustomFields-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCustomFields-1745505309750","value":{"CustomField.default.label":"Value of {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRevision-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRevision-1745505309750","value":{"lastUpdatedDatePublished":"{publishCount, plural, one{Published} other{Updated}} {date}","lastUpdatedDateDraft":"Created {date}","version":"Version {major}.{minor}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyButton-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyButton-1745505309750","value":{"repliesCount":"{count}","title":"Reply","title@board:BLOG@message:root":"Comment","title@board:TKB@message:root":"Comment","title@board:IDEA@message:root":"Comment","title@board:OCCASION@message:root":"Comment"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageAuthorBio-1745505309750","value":{"sendMessage":"Send Message","actionMessage":"Follow this blog board to get notified when there's new activity","coAuthor":"CO-PUBLISHER","contributor":"CONTRIBUTOR","userProfile":"View Profile","iconlink":"Go to {name} {type}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1745505309750","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/ranks/UserRankLabel-1745505309750","value":{"altTitle":"Icon for {rankName} rank"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserRegistrationDate-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserRegistrationDate-1745505309750","value":{"noPrefix":"{date}","withPrefix":"Joined {date}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeAvatar-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeAvatar-1745505309750","value":{"altTitle":"Node avatar for {nodeTitle}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeDescription-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeDescription-1745505309750","value":{"description":"{description}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1745505309750","value":{"contentType":"Content Type {style, select, FORUM {Forum} BLOG {Blog} TKB {Knowledge Base} IDEA {Ideas} OCCASION {Events} other {}} icon"},"localOverride":false}}}},"page":"/blogs/BlogMessagePage/BlogMessagePage","query":{"boardId":"azuremigrationblog","messageSubject":"using-azure-functions-to-read-avs-data-via-powershell-powercli-and-the-api","messageId":"4403200"},"buildId":"HEhyUrv5OXNBIbfCLaOrw","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"o365","openTelemetryServiceVersion":"25.1.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/customComponent/CustomComponent/CustomComponent.tsx","./components/blogs/BlogArticleWidget/BlogArticleWidget.tsx","./components/external/components/ExternalComponent.tsx","./components/messages/MessageView/MessageViewStandard/MessageViewStandard.tsx","./components/messages/ThreadedReplyList/ThreadedReplyList.tsx","../shared/client/components/common/List/UnstyledList/UnstyledList.tsx","./components/messages/MessageView/MessageView.tsx"],"appGip":true,"scriptLoader":[{"id":"analytics","src":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/pagescripts/1730819800000/analytics.js?page.id=BlogMessagePage&entity.id=board%3Aazuremigrationblog&entity.id=message%3A4403200","strategy":"afterInteractive"}]}