Public/Find-UnregisterdVM.ps1

Function Find-UnregisterdVM {
    <#
        .Synopsis
            Find Unregisterd Citrix XenApp servers and e-mail report
        .Description
            Find Unregisterd Citrix XenApp servers and e-mail report
        .Parameter From
            Mail sender of report
        .Parameter To
            Mail destination of report
        .PARAMETER nomail
            A description of the nomail parameter.
        .Parameter UsePSEmailServer
            A description of the UsePSEmailServer parameter
        .Parameter SMTPServer
            A description of the SMTPServer parameter
        .Example
            Find-UnregisterdVMs
            Find UnregisterdVMs and e-mail report
        .LINK
            about_functions_advanced
        .LINK
            about_CommonParameters
    #>

    [CmdletBinding(DefaultParameterSetName = 'Mail',
        ConfirmImpact = 'Medium',
        SupportsShouldProcess = $true)]

    [OutputType([System.IO.File], ParameterSetName = 'NoMail')]
    Param(
        [Parameter(ParameterSetName = 'Mail',
            Mandatory = $true,
            HelpMessage = 'The From address')]
        [Parameter(ParameterSetName = "PSEmailServer")]
        [Parameter(ParameterSetName = "SMTPServer")]
        [ValidatePattern('\w+([-+.'']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*')]
        [string]$from,
        [Parameter(ParameterSetName = 'Mail',
            Mandatory = $true,
            HelpMessage = 'The To address')]
        [Parameter(ParameterSetName = "PSEmailServer")]
        [Parameter(ParameterSetName = "SMTPServer")]
        [ValidatePattern('\w+([-+.'']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*')]
        [string]$to,
        [Parameter(ParameterSetName = 'Mail')]
        [Parameter(ParameterSetName = "PSEmailServer")]
        [switch]$UsePSEmailServer,
        [Parameter(ParameterSetName = 'Mail')]
        [Parameter(ParameterSetName = "SMTPServer")]
        [string]$SMTPServer,
        [Parameter(ParameterSetName = 'NoMail')]
        [switch]$nomail
    )

    Try {
        $UnregisterdXAs = Get-BrokerSharedDesktop | Where-Object {
            $_.RegistrationState -eq "unregistered" # | select HostedMachineName, RegistrationState | ConvertTo-Html
        }
    } Catch {
        Write-Warning $_.Exception.Message
    }
    $klantnaam = $($(Get-ADDomain).NetBIOSName)
    $klantnaam = $klantnaam.ToUpper()
    $servertitle = "Hosted Machine Name"
    $statetitle = "Registration State"

    #region Reporting
    $report = "c:\beheer\UnregisterdXAs.html"
    $FileExists = Test-Path $report
    If ($FileExists -eq "True") {
        Write-Host "Remove old report..." -ForegroundColor Cyan -NoNewline
        Remove-Item $report
        Write-Host "Done!" -ForegroundColor Green
    }
    Write-Host "Generate new report..." -ForegroundColor Cyan -NoNewline
    #Clears the report in case there is data in it
    $FileExists = Test-Path $report
    If ($FileExists -eq "True") {
        Clear-Content $report
    }
    #region HTMLHeader
    #Builds the headers and formatting for the report
    Add-Content $report "<html>"
    Add-Content $report "<head>"
    Add-Content $report "<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>"
    Add-Content $report "<Title>$klantnaam XA rapportage</Title>"
    Add-Content $report '<STYLE TYPE="text/css">'
    Add-Content $report "body {"
    Add-Content $report "padding:10px;"
    Add-Content $report "background-color:WhiteSmoke"
    Add-Content $report "}"
    Add-Content $report "td {"
    Add-Content $report "text-align: left;"
    Add-Content $report "}"
    Add-Content $report "th {"
    Add-Content $report "text-align: center;"
    Add-Content $report "background-color:#999999;"
    Add-Content $report "padding: 10px;"
    Add-Content $report "}"
    Add-Content $report "tr:nth-child(odd) {"
    Add-Content $report "background: #CFCFCF;"
    Add-Content $report "}"
    Add-Content $report ".Table td {"
    Add-Content $report "text-align: center;"
    Add-Content $report "}"
    Add-Content $report "a {"
    Add-Content $report "text-decoration:none;"
    Add-Content $report "}"
    Add-Content $report "</style>"
    Add-Content $report "</head>"
    Add-Content $report "<body>"
    Add-Content $report '<img src="https://www.ict-concept.nl/sites/all/themes/ictconcept/images/ict-concept.png" id="top"></img><br><br>'
    #endregion HTMLHeader

    #Table for XA information
    Add-Content $report "<b>XA Informatie</b>"
    Add-Content $report "<table width='100%'>"
    Add-Content $report "<tr>"
    Add-Content $report "<th width='10%' align='center'>$servertitle</th>"
    Add-Content $report "<th width='10%' align='center'>$statetitle</th>"
    Add-Content $report "</tr>"
    If ($null -ne $UnregisterdXAs) {
        foreach ($server in $UnregisterdXAs) {
            $servername = $server.name
            Add-Content $report "<tr>"
            Add-Content $report "<td>$servername</td>"
            Add-Content $report "</tr>"
        }
    } Else {
        Add-Content $report "<tr>"
        Add-Content $report "<td>Geen unregisterd XA's gevonden</td>"
        Add-Content $report "</tr>"
    }
    Add-Content $report "</table>"
    Add-Content $report "<br>"
    #endregion XA Information

    Write-Host "Done!" -ForegroundColor Green
    $Subject = ("Unregistered VMs on XenApp Farm " + (Get-Date -format R))

    Write-Verbose "Mailing report to $smtp"
    $subject = "[$klantnaam] XA rapportage"
    $body = Get-Content $report | Out-String

    If (!($nomail)) {
        Switch ($PSCmdlet.ParameterSetName) {
            SMTPServer { $SMTPServer = "-SMTPServer" + $SMTPServer }
        }
        Send-MailMessage -To $to -From $from -Subject $subject -BodyAsHtml -Body $body $SMTPServer
    } Else {
        Invoke-Expression $report
    }
}