GraphLicenseManager.psm1

function Start-GraphLicenseManager
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]$logFolderPath,
        [Parameter(Mandatory = $false)]
        [string]$EntraTenantID="",
        [Parameter(Mandatory = $false)]
        [string]$certificateThumbprint="",
        [Parameter(Mandatory = $false)]
        [string]$appID="",
        [Parameter(Mandatory = $false)]
        [boolean]$allowTelemetryCollection=$TRUE
    )

    #Initialize telemetry collection.

    $appInsightAPIKey = "63d673af-33f4-401c-931e-f0b64a218d89"
    #$appInsightAPIKey = "ebaef937-84c8-4e48-a29a-4a66ba482a32"
    $traceModuleName = "GraphLicenseManager"

    if ($allowTelemetryCollection -eq $TRUE)
    {
        start-telemetryConfiguration -allowTelemetryCollection $allowTelemetryCollection -appInsightAPIKey $appInsightAPIKey -traceModuleName $traceModuleName -errorAction STOP
    }

    Set-Variable -Name "EntraTenantID" -Value $EntraTenantID -Scope Global
    Set-Variable -name "CertificateThumbPrint" -Value $certificateThumbprint -scope Global
    set-variable -name "AppID" -Value $appID -scope global
    #Define telemetry items.

    $telemetryEventName = "GraphLicenseManager"
    $global:telemetryOperationName = ""
    $telemetryGraphLicenseManagerVersion = $NULL
    $telemetryMSGraphAuthentication = $NULL
    $telemetryMSGraphDirectory = $NULL
    $telemetryMSGraphUsers = $NULL
    $telemetryMSGraphGroups = $NULL
    $telemetryOSVersion = (Get-CimInstance Win32_OperatingSystem).version
    $telemetryStartTime = get-universalDateTime
    $telemetryAuthenticationStartTime = $null
    $telemetryAuthenticationEndTime = $NULL
    [double]$telemetryAuthentictionTime = 0
    $telemetryLicenseManagementStartTime = $NULL
    $telemetryLicenseManagementEndTime = $NULL
    [double]$telemetryLicenseManagementTime = 0
    $telemetryEndTime = $NULL
    [double]$telemetryElapsedSeconds = 0
    [double]$global:telemetrySearches=0
    [double]$global:telemetryCommits=0
    [double]$global:telemetrySearcheErrors=0
    [double]$global:telemetryCommitErrors=0
    [double]$global:telemetryRefresh=0
    [double]$global:telemetryCSVExport=0
    $global:telemetryattributesSelected = @()
    [double]$global:telemetryLicensesViewed = 0
    $global:ErrorMessages=@()


    $ErrorActionPreference = 'Stop'
    $global:logFile=$NULL
    $logFileName = "GraphLicenseManager_"+(Get-Date -Format FileDateTime)

    $global:exitSelected = $false

    new-logfile -logFileName $logFileName -logFolderPath $logFolderPath

    out-logfile -string "********************************************************************************"
    out-logfile -string "NOTICE"
    out-logfile -string "Telemetry collection is now enabled by default."
    out-logfile -string "For information regarding telemetry collection see https://timmcmic.wordpress.com/2022/11/14/4288/"
    out-logfile -string "Administrators may opt out of telemetry collection by using -allowTelemetryCollection value FALSE"
    out-logfile -string "Telemetry collection is appreciated as it allows further development and script enhancement."
    out-logfile -string "********************************************************************************"

    $telemetryGraphLicenseManagerVersion = Test-PowershellModule -powershellModuleName "GraphLicenseManager" -powershellVersionTest:$TRUE
    $telemetryMSGraphAuthentication = Test-PowershellModule -powershellModuleName "Microsoft.Graph.Authentication" -powershellVersionTest:$TRUE
    $telemetryMSGraphDirectory = Test-PowershellModule -powershellModuleName "Microsoft.Graph.Identity.DirectoryManagement" -powershellVersionTest:$TRUE
    $telemetryMSGraphUsers = Test-PowershellModule -powershellModuleName "Microsoft.Graph.Users" -powershellVersionTest:$TRUE
    $telemetryMSGraphGroups = Test-PowershellModule -powershellModuleName "Microsoft.Graph.Groups" -powershellVersionTest:$TRUE

    out-logfile -string "************************************************************************"
    out-logfile -string "Starting graph license manager."
    out-logfile -string "************************************************************************"

    out-logfile -string "Obtaining license CSV data."

    GetLicenseData

    out-logfile -string "Invoking establish graph connection..."

    $telemetryAuthenticationStartTime = get-universalDateTime
    establishGraphConnection
    $telemetryAuthenticationEndTime = get-universalDateTime
    $telemetryAuthentictionTime= get-elapsedTime -startTime $telemetryAuthenticationStartTime -endTime $telemetryAuthenticationEndTime

    out-logfile -string "Invoking manage group license..."
    $telemetryLicenseManagementStartTime = get-universalDateTime

    if ($global:exitSelected -eq $false)
    {
        if ($global:selectedOperation -eq "Group License Manager")
        {
            out-logfile -string "Connection successful -> manage group license"
            manageGroupLicense
        }
        elseif ($global:selectedOperation -eq "License Assignment Report")
        {
            out-logfile -string "Connection successful -> license assignment report"
            LicenseAssignmentReport
        }
        elseif ($global:selectedOperation -eq "Group Assignment Report") 
        {
            out-logfile -string "Connection successful -> group assignment report"
            GroupLicenseReport
        }
    }

    $telemetryLicenseManagementEndTime = get-universalDateTime
    $telemetryLicenseManagementTime = get-elapsedTime -startTime $telemetryLicenseManagementStartTime -endTime $telemetryLicenseManagementEndTime

    $telemetryEndTime = get-universalDateTime
    $telemetryElapsedSeconds = get-elapsedTime -startTime $telemetryStartTime -endTime $telemetryEndTime

    $telemetryEventProperties = @{
        GraphLicenseManagerCommand = $telemetryEventName
        OperationName = $global:telemetryOperationName
        GraphLicenseManagerVersion = $telemetryGraphLicenseManagerVersion
        GraphAuthenticationVersion = $telemetryMSGraphAuthentication
        GraphIdentityDirectoryManagementVersion = $telemetryMSGraphDirectory
        GraphUsersVersion = $telemetryMSGraphUsers
        GraphGroupVersion = $telemetryMSGraphGroups
        OSVersion = $telemetryOSVersion
        CommandStartTimeUTC = $telemetryStartTime
        CommandEndTimeUTC = $telemetryEndTime
        AuthenticationStateTime = $telemetryAuthenticationStartTime
        AuthenticationEndTime = $telemetryAuthenticationEndTime
        AuthenciationElapsedTime = $telemetryAuthentictionTime
        LicenseManagementStartTime = $telemetryLicenseManagementStartTime
        LicenseManagementEndTime = $telemetryLicenseManagementEndTime
        LicenseManagementElapsedTime = $telemetryLicenseManagementTime
        TelemetryAttributesSelected = $global:telemetryattributesSelected
        ErrorText = $global:errorMessages
    }

    $telemetryEventMetrics = @{
        TotalCommandTime = $telemetryElapsedSeconds
        TotalSearches = $global:telemetrySearches
        TotalCommits = $global:telemetryCommits
        TotalCommitErrors = $global:telemetryCommitErrors
        TotalSearchErrors = $global:telemetrySearcheErrors
        TotalRefreshOperations = $global:telemetryRefresh
        TotalCSVExports = $global:telemetryCSVExport
        TotalLicensesViewed = $global:telemetryLicensesViewed
    }

    out-logfile -string "Sending telemetry event."

    if ($allowTelemetryCollection -eq $TRUE)
    {
        send-TelemetryEvent -traceModuleName $traceModuleName -eventName $telemetryEventName -eventMetrics $telemetryEventMetrics -eventProperties $telemetryEventProperties -errorAction STOP
    }

    Disconnect-MgGraph
}