Get-AzureVmManagementSolutionOnboardingState.ps1


<#PSScriptInfo
 
.VERSION 1.0.0
 
.GUID c3d8a692-159c-454a-af46-a6859730a2cb
 
.AUTHOR stasku@microsoft.com
 
.COMPANYNAME Microsoft Corp.
 
.COPYRIGHT Microsoft Corp. 2017
 
.TAGS
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
 
 
#>


<#
 
.DESCRIPTION
 The script gets management solution onboarding information for an Azure VM
 
#>
 
Param(
    [string]
    [Parameter(Mandatory = $true)]
    $vmResourceId,

    [string]
    [Parameter(Mandatory = $true)]
    [ValidateSet("updates", "changeTracking")]$solutionType
)

$information = [pscustomobject] [ordered] @{
    #$information = New-Object -Type PSObject -Proper [ordered] @{
        'AzureVMFound'=$false
        'AzureVMHasManagementExtensionInstalled'='n/a'
        'AzureVMManagementExtensionHasManagementWorkspaceInformation'='n/a'
        'ManagementWorkspaceFoundInSubscription'='n/a'
        'VmHeartbeatDataIngestedIntoWorkspace'='n/a'
        'VmHeartbeatDataIndicatesThatVmHasSolutionEnabled'='n/a'
        'SolutionDataIngestedIntoWorkspace'='n/a'
    }

    $vmDiscriminator = New-Object -Type PSObject -Proper @{'id'=$vmResourceId}
    $vm = $vmDiscriminator | Get-AzureRmResource
    if($vm -ne $null){
        $information.AzureVMFound = $true

        $vmMmaExtensionResourceId = "$($vmResourceId)/extensions/MMAExtension"
        $vmMmaExtensionDiscriminator = New-Object -Type PSObject -Proper @{'id'=$vmMmaExtensionResourceId}
        $vmMmaExtensionResource = $vmMmaExtensionDiscriminator | Get-AzureRmResource

        $information.AzureVMHasManagementExtensionInstalled = $false
        if($vmMmaExtensionResource -ne $null){
            $information.AzureVMHasManagementExtensionInstalled = $true

            $vmManagementWorkspaceId = $vmMmaExtensionResource.Properties.settings.workspaceId

            $information.AzureVMManagementExtensionHasManagementWorkspaceInformation = $false
            if($vmManagementWorkspace -ne $null){
                $information.AzureVMManagementExtensionHasManagementWorkspaceInformation = $true

                $vmManagementWorkspace = Get-AzureRmOperationalInsightsWorkspace | where-object {$_.CustomerId -eq $vmManagementWorkspaceId}

                $information.ManagementWorkspaceFoundInSubscription = $false
                if($vmManagementWorkspace -ne $null){
                    $information.ManagementWorkspaceFoundInSubscription = $true

                    $vmManagementWorkspaceResourceDiscriminator = New-Object -Type PSObject -Proper @{'id'=$vmManagementWorkspace.ResourceId}
                    $vmManagementWorkspaceResource = $vmManagementWorkspaceResourceDiscriminator | Get-AzureRmResource

                    $vmManagementWorkspaceSearchVersion = @{'0'='OQL';'1'='KQL'}[$vmManagementWorkspaceResource.Properties.features.searchVersion.ToString()]

                    $queryVmHeartbeatDataIngestedIntoWorkspace = [String]::Format(@{
                    'OQL'='Type=Heartbeat and (ResourceId="{0}" or Computer="{1}") | top 1'
                    'KQL'='Heartbeat | where (ResourceId=~"{0}" or Computer=~"{1}") | take 1'
                    }[$vmManagementWorkspaceSearchVersion], $vmResourceId, $vm.Name, $solutionType)
                    $information.VmHeartbeatDataIngestedIntoWorkspace = ($vmManagementWorkspace | Get-AzureRmOperationalInsightsSearchResults -Query $queryVmHeartbeatDataIngestedIntoWorkspace).Value.Count -eq 1                    

                    $queryVmHeartbeatDataIndicatesThatVmHasSolutionEnabled = [String]::Format(@{
                    'OQL'='Type=Heartbeat and (ResourceId="{0}" or Computer="{1}") and Solutions:contains("{2}") | top 1'
                    'KQL'='Heartbeat | where (ResourceId=~"{0}" or Computer=~"{1}") and Solutions has "{2}" | take 1'
                    }[$vmManagementWorkspaceSearchVersion], $vmResourceId, $vm.Name, $solutionType)
                    $information.VmHeartbeatDataIndicatesThatVmHasSolutionEnabled = ($vmManagementWorkspace | Get-AzureRmOperationalInsightsSearchResults -Query $queryVmHeartbeatDataIndicatesThatVmHasSolutionEnabled).Value.Count -eq 1
                    
                    $solutionTableName = @{'updates'='Update';'changeTracking'='ConfigurationChange'}[$solutionType]
                    $querySolutionDataIngestedIntoWorkspace = [String]::Format(@{
                    'OQL'='Type={0} and (ResourceId="{1}" or Computer="{2}") | top 1'
                    'KQL'='{0} | where (ResourceId=~"{1}" or Computer=~"{2}") | take 1'
                    }[$vmManagementWorkspaceSearchVersion], $solutionTableName, $vmResourceId, $vm.Name)
                    $information.SolutionDataIngestedIntoWorkspace = ($vmManagementWorkspace | Get-AzureRmOperationalInsightsSearchResults -Query $querySolutionDataIngestedIntoWorkspace).Value.Count -eq 1
                }
            }
        }
    }
    return $information