Modules/M365DSCReverseGUI.psm1

function SectionChanged
{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [System.Windows.Forms.CheckBox]
        $Control,

        [Parameter(Mandatory = $true)]
        [System.Windows.Forms.Panel]
        $Panel
    )

    foreach ($pnlControl in $Panel.Controls)
    {
        if ($pnlControl.GetType().ToString() -eq "System.Windows.Forms.Checkbox")
        {
            $pnlControl.Checked = $Control.Checked
        }
    }
}
function Show-M365DSCGUI
{
    [CmdletBinding()]
    param(
        [Parameter()]
        [System.String]
        $Path,

        [Parameter()]
        [System.String]
        $FileName,

        [Parameter()]
        [System.Boolean]
        $GenerateInfo = $false
    )
    try
    {
        [CmdletBinding()]
        #region Global
        $firstColumnLeft = 10
        $secondColumnLeft = 340
        $thirdColumnLeft = 680
        $fourthColumnLeft = 1020
        $fifthColumnLeft = 1360
        $topBannerHeight = 110
        #endregion

        $form = New-Object System.Windows.Forms.Form
        $screens = [System.Windows.Forms.Screen]::AllScreens
        $form.Width = $screens[0].Bounds.Width
        $form.Height = $screens[0].Bounds.Height - 60
        $form.BackColor = [System.Drawing.Color]::White
        $form.WindowState = [System.Windows.Forms.FormWindowState]::Maximized

        $pnlWarning = New-Object System.Windows.Forms.Panel
        $pnlWarning.Width = $form.Width
        $pnlWarning.Height = 50
        $pnlWarning.BackColor = [System.Drawing.Color]::Yellow

        $lblWarning = New-Object System.Windows.Forms.Label
        $lblWarning.BackColor = [System.Drawing.Color]::Yellow
        $lblWarning.Text = "We are aware of issues trying to export Exchange Online, Security & Compliance, SharePoint Online and OneDrive for Business components using the Graphical User Interface (freezes the export). We are actively working on a solution. As a work around, use the unattended commands using the -Quiet switch to perform the export."
        $lblWarning.Font = [System.Drawing.Font]::new($lblWarning.Font.Name, 14, [System.Drawing.FontStyle]::Regular)
        $lblWarning.Width = $form.Width
        $lblWarning.Height = 50
        $lblWarning.AutoSize = $false
        $pnlWarning.Controls.Add($lblWarning)
        $form.Controls.Add($pnlWarning)

        $pnlMain = New-Object System.Windows.Forms.Panel
        $pnlMain.Width = $form.Width
        $pnlMain.Height = $form.Height - 50
        $pnlMain.Top = 50
        $pnlMain.AutoScroll = $true

        #region EXO
        $imgExo = New-Object System.Windows.Forms.PictureBox
        $imagePath = $PSScriptRoot + "\..\Dependencies\Images\Exchange.jpg"
        $imgExo.ImageLocation = $imagePath
        $imgExo.Left = $firstColumnLeft
        $imgExo.Top = $topBannerHeight
        $imgExo.AutoSize = $true
        $pnlMain.Controls.Add($imgExo)

        $pnlExo = New-Object System.Windows.Forms.Panel
        $pnlExo.Top = 88 + $topBannerHeight
        $pnlExo.Left = $firstColumnLeft
        $pnlExo.Height = 350
        $pnlExo.Width = 300
        $pnlExo.BorderStyle = [System.Windows.Forms.BorderStyle]::FixedSingle
        $pnlExo.AutoScroll = $true
        $pnlEXONextControlPosition = -20

        $chckAllEXO = New-Object System.Windows.Forms.CheckBox
        $chckAllEXO.Left = $FirstColumnLeft + 280
        $chckAllEXO.Top = $topBannerHeight + 40
        $chckAllEXO.Checked = $true
        $chckAllEXO.AutoSize = $true
        $chckAllEXO.Add_CheckedChanged( { SectionChanged -Control $chckAllEXO -Panel $pnlEXO })
        $pnlMain.Controls.Add($chckAllEXO)
        #endregion

        #region SPO
        $imgSPO = New-Object System.Windows.Forms.PictureBox
        $imagePath = $PSScriptRoot + "\..\Dependencies\Images\SharePoint.jpg"
        $imgSPO.ImageLocation = $imagePath
        $imgSPO.Left = $SecondColumnLeft
        $imgSPO.Top = $topBannerHeight
        $imgSPO.AutoSize = $true
        $pnlMain.Controls.Add($imgSPO)

        $pnlSPO = New-Object System.Windows.Forms.Panel
        $pnlSPO.Top = 88 + $topBannerHeight
        $pnlSPO.Left = $SecondColumnLeft
        $pnlSPO.Height = 350
        $pnlSPO.Width = 300
        $pnlSPO.BorderStyle = [System.Windows.Forms.BorderStyle]::FixedSingle
        $pnlSPO.AutoScroll = $true
        $pnlSPONextControlPosition = -20

        $chckAllSharePoint = New-Object System.Windows.Forms.CheckBox
        $chckAllSharePoint.Left = $SecondColumnLeft + 280
        $chckAllSharePoint.Top = $topBannerHeight + 40
        $chckAllSharePoint.Checked = $true
        $chckAllSharePoint.AutoSize = $true
        $chckAllSharePoint.Add_CheckedChanged( { SectionChanged -Control $chckAllSharePoint -Panel $pnlSPO })
        $pnlMain.Controls.Add($chckAllSharePoint)
        #endregion

        #region SecurityCompliance
        $imgSC = New-Object System.Windows.Forms.PictureBox
        $imagePath = $PSScriptRoot + "\..\Dependencies\Images\SecurityAndCompliance.png"
        $imgSC.ImageLocation = $imagePath
        $imgSC.Left = $FirstColumnLeft
        $imgSC.Top = $pnlEXO.Height + 205
        $imgSC.AutoSize = $true
        $pnlMain.Controls.Add($imgSC)

        $pnlSC = New-Object System.Windows.Forms.Panel
        $pnlSC.Top = $pnlEXO.Height + 300
        $pnlSC.Left = $FirstColumnLeft
        $pnlSC.Height = 350
        $pnlSC.Width = 300
        $pnlSC.BorderStyle = [System.Windows.Forms.BorderStyle]::FixedSingle
        $pnlSC.AutoScroll = $true
        $pnlSCNextControlPosition = -20

        $chckAllSC = New-Object System.Windows.Forms.CheckBox
        $chckAllSC.Left = $FirstColumnLeft + 280
        $chckAllSC.Top = $imgSC.Top + 30
        $chckAllSC.Checked = $true
        $chckAllSC.AutoSize = $true
        $chckAllSC.Add_CheckedChanged( { SectionChanged -Control $chckAllSC -Panel $pnlSC })
        $pnlMain.Controls.Add($chckAllSC)
        #endregion

        #region Teams
        $imgTeams = New-Object System.Windows.Forms.PictureBox
        $imagePath = $PSScriptRoot + "\..\Dependencies\Images\Teams.jpg"
        $imgTeams.ImageLocation = $imagePath
        $imgTeams.Left = $SecondColumnLeft
        $imgTeams.Top = $pnlSPO.Height + 205
        $imgTeams.AutoSize = $true
        $pnlMain.Controls.Add($imgTeams)

        $pnlTeams = New-Object System.Windows.Forms.Panel
        $pnlTeams.Top = $pnlSPO.Height + 300
        $pnlTeams.Left = $secondColumnLeft
        $pnlTeams.Height = 350
        $pnlTeams.Width = 300
        $pnlTeams.BorderStyle = [System.Windows.Forms.BorderStyle]::FixedSingle
        $pnlTeams.AutoScroll = $true
        $pnlTeamsNextControlPosition = -20

        $chckAllTeams = New-Object System.Windows.Forms.CheckBox
        $chckAllTeams.Left = $SecondColumnLeft + 280
        $chckAllTeams.Top = $imgTeams.Top + 30
        $chckAllTeams.Checked = $true
        $chckAllTeams.AutoSize = $true
        $chckAllTeams.Add_CheckedChanged( { SectionChanged -Control $chckAllTeams -Panel $pnlTeams })
        $pnlMain.Controls.Add($chckAllTeams)
        #endregion

        #region PowerApps
        $imgPP = New-Object System.Windows.Forms.PictureBox
        $imagePath = $PSScriptRoot + "\..\Dependencies\Images\PowerApps.png"
        $imgPP.ImageLocation = $imagePath
        $imgPP.Left = $thirdColumnLeft
        $imgPP.Top = $topBannerHeight
        $imgPP.AutoSize = $true
        $pnlMain.Controls.Add($imgPP)

        $pnlPP = New-Object System.Windows.Forms.Panel
        $pnlPP.Top = 88 + $topBannerHeight
        $pnlPP.Left = $thirdColumnLeft
        $pnlPP.Height = 100
        $pnlPP.Width = 300
        $pnlPP.BorderStyle = [System.Windows.Forms.BorderStyle]::FixedSingle
        $pnlPP.AutoScroll = $true
        $pnlPPNextControlPosition = -20

        $chckAllPP = New-Object System.Windows.Forms.CheckBox
        $chckAllPP.Left = $thirdColumnLeft + 280
        $chckAllPP.Top = $topBannerHeight + 40
        $chckAllPP.Checked = $true
        $chckAllPP.AutoSize = $true
        $chckAllPP.Add_CheckedChanged( { SectionChanged -Control $chckAllPP -Panel $pnlPP })
        $pnlMain.Controls.Add($chckAllPP)
        #endregion

        #region Planner
        $imgPlanner = New-Object System.Windows.Forms.PictureBox
        $imagePath = $PSScriptRoot + "\..\Dependencies\Images\Planner.png"
        $imgPlanner.ImageLocation = $imagePath
        $imgPlanner.Left = $thirdColumnLeft
        $imgPlanner.Top = $pnlPP.Height + 205
        $imgPlanner.AutoSize = $true
        $pnlMain.Controls.Add($imgPlanner)

        $pnlPlanner = New-Object System.Windows.Forms.Panel
        $pnlPlanner.Top = $pnlPP.Height + 300
        $pnlPlanner.Left = $thirdColumnLeft
        $pnlPlanner.Height = 150
        $pnlPlanner.Width = 300
        $pnlPlanner.BorderStyle = [System.Windows.Forms.BorderStyle]::FixedSingle
        $pnlPlanner.AutoScroll = $true
        $pnlPlannerNextControlPosition = -20

        $chckAllPlanner = New-Object System.Windows.Forms.CheckBox
        $chckAllPlanner.Left = $thirdColumnLeft + 280
        $chckAllPlanner.Top = $topBannerHeight + $PnlPP.Height + $imgPP.Height + 100
        $chckAllPlanner.Checked = $true
        $chckAllPlanner.AutoSize = $true
        $chckAllPlanner.Add_CheckedChanged( { SectionChanged -Control $chckAllPlanner -Panel $pnlPlanner })
        $pnlMain.Controls.Add($chckAllPlanner)
        #endregion

        #region Office365
        $imgO365 = New-Object System.Windows.Forms.PictureBox
        $imagePath = $PSScriptRoot + "\..\Dependencies\Images\Office365.jpg"
        $imgO365.ImageLocation = $imagePath
        $imgO365.Left = $thirdColumnLeft
        $imgO365.Top = $pnlPP.Height + $pnlPlanner.Height + 300
        $imgO365.AutoSize = $true
        $pnlMain.Controls.Add($imgO365)

        $pnlO365 = New-Object System.Windows.Forms.Panel
        $pnlO365.Top = $imgO365.Top + 98
        $pnlO365.Left = $thirdColumnLeft
        $pnlO365.Height = 350
        $pnlO365.Width = 300
        $pnlO365.BorderStyle = [System.Windows.Forms.BorderStyle]::FixedSingle
        $pnlO365.AutoScroll = $true
        $pnlO365NextControlPosition = -20

        $chckAllO365 = New-Object System.Windows.Forms.CheckBox
        $chckAllO365.Left = $thirdColumnLeft + 280
        $chckAllO365.Top = $imgO365.Top + 35
        $chckAllO365.Checked = $true
        $chckAllO365.AutoSize = $true
        $chckAllO365.Add_CheckedChanged( { SectionChanged -Control $chckAllO365 -Panel $pnlO365 })
        $pnlMain.Controls.Add($chckAllO365)
        #endregion

        #region OneDrive
        $imgOD = New-Object System.Windows.Forms.PictureBox
        $imagePath = $PSScriptRoot + "\..\Dependencies\Images\OneDrive.jpg"
        $imgOD.ImageLocation = $imagePath
        $imgOD.Left = $fourthColumnLeft
        $imgOD.Top = $topBannerHeight
        $imgOD.AutoSize = $true
        $pnlMain.Controls.Add($imgOD)

        $pnlOD = New-Object System.Windows.Forms.Panel
        $pnlOD.Top = 88 + $topBannerHeight
        $pnlOD.Left = $fourthColumnLeft
        $pnlOD.Height = 350
        $pnlOD.Width = 300
        $pnlOD.BorderStyle = [System.Windows.Forms.BorderStyle]::FixedSingle
        $pnlOD.AutoScroll = $true
        $pnlODNextControlPosition = -20

        $chckAllOD = New-Object System.Windows.Forms.CheckBox
        $chckAllOD.Left = $fourthColumnLeft + 280
        $chckAllOD.Top = $topBannerHeight + 40
        $chckAllOD.Checked = $true
        $chckAllOD.AutoSize = $true
        $chckAllOD.Add_CheckedChanged( { SectionChanged -Control $chckAllOD -Panel $pnlOD })
        $pnlMain.Controls.Add($chckAllOD)
        #endregion

        #region AzureAD
        $imgAAD = New-Object System.Windows.Forms.PictureBox
        $imagePath = $PSScriptRoot + "\..\Dependencies\Images\AzureAD.jpg"
        $imgAAD.ImageLocation = $imagePath
        $imgAAD.Left = $fourthColumnLeft
        $imgAAD.Top = $pnlOD.Height + 205
        $imgAAD.AutoSize = $true
        $pnlMain.Controls.Add($imgAAD)

        $pnlAAD = New-Object System.Windows.Forms.Panel
        $pnlAAD.Top = $pnlOD.Height + 300
        $pnlAAD.Left = $fourthColumnLeft
        $pnlAAD.Height = 350
        $pnlAAD.Width = 300
        $pnlAAD.BorderStyle = [System.Windows.Forms.BorderStyle]::FixedSingle
        $pnlAAD.AutoScroll = $true
        $pnlAADNextControlPosition = -20

        $chckAllAAD = New-Object System.Windows.Forms.CheckBox
        $chckAllAAD.Left = $fourthColumnLeft + 280
        $chckAllAAD.Top = $imgAAD.Top + 35
        $chckAllAAD.Enabled = $true
        $chckAllAAD.Checked = $true
        $chckAllAAD.AutoSize = $true
        $chckAllAAD.Add_CheckedChanged( { SectionChanged -Control $chckAllAAD -Panel $pnlAAD })
        $pnlMain.Controls.Add($chckAllAAD)
        #endregion

        #region Intune
        $imgIntune = New-Object System.Windows.Forms.PictureBox
        $imagePath = $PSScriptRoot + "\..\Dependencies\Images\Intune.jpg"
        $imgIntune.ImageLocation = $imagePath
        $imgIntune.Left = $fifthColumnLeft
        $imgIntune.Top = $topBannerHeight
        $imgIntune.AutoSize = $true
        $pnlMain.Controls.Add($imgIntune)

        $pnlIntune = New-Object System.Windows.Forms.Panel
        $pnlIntune.Top = 88 + $topBannerHeight
        $pnlIntune.Left = $fifthColumnLeft
        $pnlIntune.Height = 350
        $pnlIntune.Width = 300
        $pnlIntune.BorderStyle = [System.Windows.Forms.BorderStyle]::FixedSingle
        $pnlIntune.AutoScroll = $true
        $pnlIntuneNextControlPosition = -20

        $chckAllIntune = New-Object System.Windows.Forms.CheckBox
        $chckAllIntune.Left = $fifthColumnLeft + 280
        $chckAllIntune.Top = $topBannerHeight + 40
        $chckAllIntune.Checked = $true
        $chckAllIntune.AutoSize = $true
        $chckAllIntune.Add_CheckedChanged( { SectionChanged -Control $chckAllIntune -Panel $pnlIntune })
        $pnlMain.Controls.Add($chckAllIntune)
        #endregion

        $allResources = Get-ChildItem -Path ($PSScriptRoot + "\..\DSCResources\")

        foreach ($resource in $allResources)
        {
            $resourceName = $resource.Name.Replace("MSFT_", "")
            $currentControlTop = 0
            if ($resourceName.StartsWith("AAD"))
            {
                $panel = $pnlAAD
                $pnlAADNextControlPosition += 20
                $currentControlTop = $pnlAADNextControlPosition
            }
            elseif ($resourceName.StartsWith("EXO"))
            {
                $panel = $pnlExo
                $pnlEXONextControlPosition += 20
                $currentControlTop = $pnlEXONextControlPosition
            }
            elseif ($resourceName.StartsWith("Intune"))
            {
                $panel = $pnlIntune
                $pnlIntuneNextControlPosition += 20
                $currentControlTop = $pnlIntuneNextControlPosition
            }
            elseif ($resourceName.StartsWith("SPO"))
            {
                $panel = $pnlSPO
                $pnlSPONextControlPosition += 20
                $currentControlTop = $pnlSPONextControlPosition
            }
            elseif ($resourceName.StartsWith("SC"))
            {
                $panel = $pnlSC
                $pnlSCNextControlPosition += 20
                $currentControlTop = $pnlSCNextControlPosition
            }
            elseif ($resourceName.StartsWith("Teams"))
            {
                $panel = $pnlTeams
                $pnlTeamsNextControlPosition += 20
                $currentControlTop = $pnlTeamsNextControlPosition
            }
            elseif ($resourceName.StartsWith("PP"))
            {
                $panel = $pnlPP
                $pnlPPNextControlPosition += 20
                $currentControlTop = $pnlPPNextControlPosition
            }
            elseif ($resourceName.StartsWith("Planner"))
            {
                $panel = $pnlPlanner
                $pnlPlannerNextControlPosition += 20
                $currentControlTop = $pnlPlannerNextControlPosition
            }
            elseif ($resourceName.StartsWith("OD"))
            {
                $panel = $pnlOD
                $pnlODNextControlPosition += 20
                $currentControlTop = $pnlODNextControlPosition
            }
            elseif ($resourceName.StartsWith("O365"))
            {
                $panel = $pnlO365
                $pnlO365NextControlPosition += 20
                $currentControlTop = $pnlO365NextControlPosition
            }

            $ModeIdentifier = [System.Windows.Forms.PictureBox]::new()
            $ModeIdentifier.Height = 15
            $ModeIdentifier.Width = 15
            $checked = $true
            $ModeIdentifier.ImageLocation = $PSScriptRoot + "\..\Dependencies\Images\lite.png"
            if ($Global:DefaultComponents.Contains($resourceName))
            {
                $ModeIdentifier.ImageLocation = $PSScriptRoot + "\..\Dependencies\Images\default.png"
            }
            elseif ($Global:FullComponents.Contains($resourceName))
            {
                $ModeIdentifier.ImageLocation = $PSScriptRoot + "\..\Dependencies\Images\full.png"
                $checked = $false
            }

            $chckBox = [System.Windows.Forms.CheckBox]::New()
            $chckBox.Name = "chck" + $resourceName
            $chckBox.AutoSize = $true
            $chckBox.Text = $resourceName
            $chckBox.Left = 20
            $chckBox.Checked = $checked
            $chckBox.Top = $currentControlTop

            $ModeIdentifier.Top = $currentControlTop + 1
            $panel.Controls.Add($ModeIdentifier)
            $panel.Controls.Add($chckBox)
        }

        $pnlMain.Controls.Add($pnlO365)
        $pnlMain.Controls.Add($pnlExo)
        $pnlMain.Controls.Add($pnlIntune)
        $pnlMain.Controls.Add($pnlOD)
        $pnlMain.Controls.Add($pnlPP)
        $pnlMain.Controls.Add($pnlPlanner)
        $pnlMain.Controls.Add($pnlSPO)
        $pnlMain.Controls.Add($pnlSC)
        $pnlMain.Controls.Add($pnlTeams)
        $pnlMain.Controls.Add($pnlAAD)

        #region Top Menu
        $panelMenu = New-Object System.Windows.Forms.Panel
        $panelMenu.Height = $topBannerHeight
        $panelMenu.Width = $form.Width
        $panelMenu.BackColor = [System.Drawing.Color]::Silver

        $lblExtraction = New-Object System.Windows.Forms.Label
        $lblExtraction.Text = "Extraction Modes:"
        $lblExtraction.Font = [System.Drawing.Font]::new($lblExtraction.Font.Name, 8, [System.Drawing.FontStyle]::Bold)
        $lblExtraction.Top = 5
        $lblExtraction.Autosize = $true
        $lblExtraction.Left = 15
        $panelMenu.Controls.Add($lblExtraction)

        $imgLite = New-Object System.Windows.Forms.PictureBox
        $imglite.Width = 15
        $imgLite.Height = 15
        $imgLite.BackColor = [System.Drawing.Color]::Transparent
        $imgLite.ImageLocation = $PSScriptRoot + "\..\Dependencies\Images\lite.png"
        $imgLite.Top = 5
        $imgLite.Left = 115
        $panelMenu.Controls.Add($imgLite)

        $radLite = New-Object System.Windows.Forms.RadioButton
        $radLite.Text = "Lite"
        $radLite.Name = "radExtractionMode"
        $radLite.AutoSize = $true
        $radLite.Top = 5
        $radLite.Left = 130
        $radLite.Add_Click( {
                SelectComponentsForMode -PanelMain $pnlMain -Mode 1 -ControlsToSkip ($Global:DefaultComponents + $Global:FullComponents);
            })
        $panelMenu.Controls.Add($radLite)

        $imgLite2 = New-Object System.Windows.Forms.PictureBox
        $imglite2.Width = 15
        $imgLite2.Height = 15
        $imgLite2.BackColor = [System.Drawing.Color]::Transparent
        $imgLite2.ImageLocation = $PSScriptRoot + "\..\Dependencies\Images\lite.png"
        $imgLite2.Top = 25
        $imgLite2.Left = 100
        $panelMenu.Controls.Add($imgLite2)

        $imgDefault = New-Object System.Windows.Forms.PictureBox
        $imgDefault.Width = 15
        $imgDefault.Height = 15
        $imgDefault.BackColor = [System.Drawing.Color]::Transparent
        $imgDefault.ImageLocation = $PSScriptRoot + "\..\Dependencies\Images\default.png"
        $imgDefault.Top = 25
        $imgDefault.Left = 115
        $panelMenu.Controls.Add($imgDefault)

        $radDefault = New-Object System.Windows.Forms.RadioButton
        $radDefault.Text = "Default"
        $radDefault.Checked = $true
        $radDefault.Name = "radExtractionMode"
        $radDefault.AutoSize = $true
        $radDefault.Top = 25
        $radDefault.Left = 130
        $radDefault.Add_Click( { SelectComponentsForMode -PanelMain $pnlMain -Mode 2 -ControlsToSkip $Global:FullComponents; })
        $panelMenu.Controls.Add($radDefault)

        $imgLite3 = New-Object System.Windows.Forms.PictureBox
        $imgLite3.Width = 15
        $imgLite3.Height = 15
        $imgLite3.BackColor = [System.Drawing.Color]::Transparent
        $imgLite3.ImageLocation = $PSScriptRoot + "\..\Dependencies\Images\lite.png"
        $imgLite3.Top = 45
        $imgLite3.Left = 85
        $panelMenu.Controls.Add($imgLite3)

        $imgDefault2 = New-Object System.Windows.Forms.PictureBox
        $imgDefault2.Width = 15
        $imgDefault2.Height = 15
        $imgDefault2.BackColor = [System.Drawing.Color]::Transparent
        $imgDefault2.ImageLocation = $PSScriptRoot + "\..\Dependencies\Images\default.png"
        $imgDefault2.Top = 45
        $imgDefault2.Left = 100
        $panelMenu.Controls.Add($imgDefault2)

        $imgFull = New-Object System.Windows.Forms.PictureBox
        $imgFull.Width = 15
        $imgFull.Height = 15
        $imgFull.BackColor = [System.Drawing.Color]::Transparent
        $imgFull.ImageLocation = $PSScriptRoot + "\..\Dependencies\Images\full.png"
        $imgFull.Top = 45
        $imgFull.Left = 115
        $panelMenu.Controls.Add($imgFull)

        $radFull = New-Object System.Windows.Forms.RadioButton
        $radFull.Text = "Full"
        $radFull.Name = "radExtractionMode"
        $radFull.AutoSize = $true
        $radFull.Top = 45
        $radFull.Left = 130
        $radFull.Add_Click( { SelectComponentsForMode -PanelMain $pnlMain -Mode 3 -ControlsToSkip @() })
        $panelMenu.Controls.Add($radFull)

        $btnClear = New-Object System.Windows.Forms.Button
        $btnClear.Width = 150
        $btnClear.Top = 5
        $btnClear.Height = 60
        $btnClear.Left = 195
        $btnClear.BackColor = [System.Drawing.Color]::IndianRed
        $btnClear.ForeColor = [System.Drawing.Color]::White
        $btnClear.Text = "Unselect All"
        $btnClear.Add_Click( { SelectComponentsForMode -PanelMain $pnlMain -Mode 0 -ControlsToSkip @() })
        $panelMenu.Controls.Add($btnClear);

        #region ServicePrincipal Info
        $chckApplication = New-Object System.Windows.Forms.CheckBox
        $chckApplication.Top = 0
        $chckApplication.Height = 20
        $chckApplication.Width = 180
        $chckApplication.Left = 420
        $chckApplication.Name = "chckApplication"
        $chckApplication.Text = "Application"
        $chckApplication.Font = [System.Drawing.Font]::new($chckApplication.Font.Name, 10, [System.Drawing.FontStyle]::Bold)
        $chckApplication.Add_Click( {
                if ($chckApplication.Checked)
                {
                    $txtApplicationId.Enabled = $true
                }
                else
                {
                    $txtApplicationId.Enabled = $false
                }
                Set-M365DSCGUIResourcesAvailability -Credentials $chckCredential.Checked `
                    -Certificate $chckCertificate.Checked `
                    -Application $chckApplication.Checked
            })

        $panelMenu.Controls.Add($chckApplication)
        $lblApplicationId = New-Object System.Windows.Forms.Label
        $lblApplicationId.Text = "Application Id:"
        $lblApplicationId.Top = 20
        $lblApplicationId.Left = 455
        $lblApplicationId.Width = 80
        $lblApplicationId.TextAlign = [System.Drawing.ContentAlignment]::TopRight
        $lblApplicationId.Font = [System.Drawing.Font]::new($lblApplicationId.Font.Name, 8)
        $panelMenu.Controls.Add($lblApplicationId)

        $txtApplicationId = New-Object System.Windows.Forms.Textbox
        $txtApplicationId.Top = 20
        $txtApplicationId.Enabled = $false
        $txtApplicationId.Left = 545
        $txtApplicationId.Width = 225
        $txtApplicationId.Font = [System.Drawing.Font]::new($txtApplicationId.Font.Name, 10)
        $panelMenu.Controls.Add($txtApplicationId)

        $chckCertificate = New-Object System.Windows.Forms.CheckBox
        $chckCertificate.Top = 0
        $chckCertificate.Height = 20
        $chckCertificate.Name = "chckCertificate"
        $chckCertificate.Width = 180
        $chckCertificate.Left = 780
        $chckCertificate.Text = "Certificate"
        $chckCertificate.Font = [System.Drawing.Font]::new($chckCertificate.Font.Name, 10, [System.Drawing.FontStyle]::Bold)
        $chckCertificate.Add_Click( {
                if ($chckCertificate.Checked)
                {
                    $txtCertPassword.Enabled = $true
                    $txtCertThumb.Enabled = $true
                    $txtCertFile.Enabled = $true
                    $txtTenantId.Enabled = $true
                }
                else
                {
                    $txtCertPassword.Enabled = $false
                    $txtCertThumb.Enabled = $false
                    $txtCertFile.Enabled = $false
                    $txtTenantId.Enabled = $false
                }
                Set-M365DSCGUIResourcesAvailability -Credentials $chckCredential.Checked `
                    -Certificate $chckCertificate.Checked `
                    -Application $chckApplication.Checked
            })
        $panelMenu.Controls.Add($chckCertificate)

        $lblCertThumb = New-Object System.Windows.Forms.Label
        $lblCertThumb.Text = "Thumbprint:"
        $lblCertThumb.Top = 25
        $lblCertThumb.Left = 725
        $lblCertThumb.Width = 120
        $lblCertThumb.TextAlign = [System.Drawing.ContentAlignment]::TopRight
        $lblCertThumb.Font = [System.Drawing.Font]::new($lblCertThumb.Font.Name, 8)
        $panelMenu.Controls.Add($lblCertThumb)

        $txtCertThumb = New-Object System.Windows.Forms.Textbox
        $txtCertThumb.Top = 20
        $txtCertThumb.Left = 850
        $txtCertThumb.Width = 225
        $txtCertThumb.Enabled = $false
        $txtCertThumb.Font = [System.Drawing.Font]::new($txtCertThumb.Font.Name, 10)
        $panelMenu.Controls.Add($txtCertThumb)

        $lblCertPath = New-Object System.Windows.Forms.Label
        $lblCertPath.AutoSize = $true
        $lblCertPath.Text = "File Path:"
        $lblCertPath.Top = 55
        $lblCertPath.Left = 795
        $lblCertPath.Width = 120
        $lblCertPath.TextAlign = [System.Drawing.ContentAlignment]::TopRight
        $lblCertPath.Font = [System.Drawing.Font]::new($lblCertPath.Font.Name, 8)
        $panelMenu.Controls.Add($lblCertPath)

        $txtCertFile = New-Object System.Windows.Forms.Textbox
        $txtCertFile.Top = 50
        $txtCertFile.Left = 850
        $txtCertFile.Width = 225
        $txtCertFile.Enabled = $false
        $txtCertFile.Font = [System.Drawing.Font]::new($txtCertFile.Font.Name, 10)
        $panelMenu.Controls.Add($txtCertFile)

        $lblCertPassword = New-Object System.Windows.Forms.Label
        $lblCertPassword.Text = "Password:"
        $lblCertPassword.Top = 25
        $lblCertPassword.Left = 1050
        $lblCertPassword.Width = 120
        $lblCertPassword.TextAlign = [System.Drawing.ContentAlignment]::TopRight
        $lblCertPassword.Font = [System.Drawing.Font]::new($lblCertPassword.Font.Name, 8)
        $panelMenu.Controls.Add($lblCertPassword)

        $txtCertPassword = New-Object System.Windows.Forms.Textbox
        $txtCertPassword.Top = 20
        $txtCertPassword.Left = 1185
        $txtCertPassword.Width = 225
        $txtCertPassword.Enabled = $false
        $txtCertPassword.PasswordChar = "*"
        $txtCertPassword.Font = [System.Drawing.Font]::new($txtCertPassword.Font.Name, 10)
        $txtCertPassword.Add_KeyDown( {
                if ($_.KeyCode -eq [System.Windows.Forms.Keys]::Enter)
                {
                    $btnExtract.PerformClick()
                }
            })
        $panelMenu.Controls.Add($txtCertPassword)

        $lblTenantId = New-Object System.Windows.Forms.Label
        $lblTenantId.Text = "Tenant Id:"
        $lblTenantId.Top = 55
        $lblTenantId.Left = 1090
        $lblTenantId.Width = 80
        $lblTenantId.TextAlign = [System.Drawing.ContentAlignment]::TopRight
        $lblTenantId.Font = [System.Drawing.Font]::new($lblTenantId.Font.Name, 8)
        $panelMenu.Controls.Add($lblTenantId)

        $txtTenantId = New-Object System.Windows.Forms.Textbox
        $txtTenantId.Top = 50
        $txtTenantId.Enabled = $false
        $txtTenantId.Left = 1185
        $txtTenantId.Width = 225
        $txtTenantId.Font = [System.Drawing.Font]::new($txtTenantId.Font.Name, 10)
        $panelMenu.Controls.Add($txtTenantId)
        #endregion

        $chckCredential = New-Object System.Windows.Forms.CheckBox
        $chckCredential.Top = 40
        $chckCredential.Autosize = $true
        $chckCredential.Checked = $true
        $chckCredential.Height = 20
        $chckCredential.Width = 180
        $chckCredential.Left = 420
        $chckCredential.Name = "chckCredential"
        $chckCredential.Text = "Credentials"
        $chckCredential.Font = [System.Drawing.Font]::new($chckCredential.Font.Name, 10, [System.Drawing.FontStyle]::Bold)
        $chckCredential.Add_Click( {
                if ($chckCredential.Checked)
                {
                    $txtTenantAdmin.Enabled = $true
                    $txtPassword.Enabled = $true
                }
                else
                {
                    $txtTenantAdmin.Enabled = $false
                    $txtPassword.Enabled = $false
                }
                Set-M365DSCGUIResourcesAvailability -Credentials $chckCredential.Checked `
                    -Certificate $chckCertificate.Checked `
                    -Application $chckApplication.Checked
            })
        $panelMenu.Controls.Add($chckCredential)

        $lblTenantAdmin = New-Object System.Windows.Forms.Label
        $lblTenantAdmin.Text = "Username:"
        $lblTenantAdmin.Top = 60
        $lblTenantAdmin.Left = 460
        $lblTenantAdmin.Width = 80
        $lblTenantAdmin.TextAlign = [System.Drawing.ContentAlignment]::TopRight
        $lblTenantAdmin.Font = [System.Drawing.Font]::new($lblTenantAdmin.Font.Name, 8)
        $panelMenu.Controls.Add($lblTenantAdmin)

        $txtTenantAdmin = New-Object System.Windows.Forms.Textbox
        $txtTenantAdmin.Top = 50
        $txtTenantAdmin.Left = 545
        $txtTenantAdmin.Width = 225
        $txtTenantAdmin.Font = [System.Drawing.Font]::new($txtTenantAdmin.Font.Name, 10)
        $panelMenu.Controls.Add($txtTenantAdmin)

        $lblPassword = New-Object System.Windows.Forms.Label
        $lblPassword.Text = "Password:"
        $lblPassword.Top = 85
        $lblPassword.Left = 460
        $lblPassword.Width = 80
        $lblPassword.TextAlign = [System.Drawing.ContentAlignment]::TopRight
        $lblPassword.Font = [System.Drawing.Font]::new($lblPassword.Font.Name, 8)
        $panelMenu.Controls.Add($lblPassword)

        $txtPassword = New-Object System.Windows.Forms.Textbox
        $txtPassword.Top = 80
        $txtPassword.Left = 545
        $txtPassword.Width = 225
        $txtPassword.PasswordChar = "*"
        $txtPassword.Font = [System.Drawing.Font]::new($txtPassword.Font.Name, 10)
        $txtPassword.Add_KeyDown( {
                if ($_.KeyCode -eq [System.Windows.Forms.Keys]::Enter)
                {
                    $btnExtract.PerformClick()
                }
            })
        $panelMenu.Controls.Add($txtPassword)
        $panelMenu.Width = $pnlIntune.Left + $pnlIntune.Width

        $btnExtract = New-Object System.Windows.Forms.Button
        $btnExtract.Width = 178
        $btnExtract.Height = 70
        $btnExtract.Top = 5
        $btnExtract.Left = $panelMenu.Width - 200
        $btnExtract.BackColor = [System.Drawing.Color]::ForestGreen
        $btnExtract.ForeColor = [System.Drawing.Color]::White
        $btnExtract.Text = "Start Extraction"
        $btnExtract.Add_Click( {
                $SelectedComponents = @()
                foreach ($panel in ($form.Controls[1].Controls | Where-Object -FilterScript { $_.GetType().Name -eq "Panel" }))
                {
                    foreach ($checkbox in ($panel.Controls | Where-Object -FilterScript { $_.GetType().Name -eq "Checkbox" }))
                    {
                        if ($checkbox.Checked -and $checkbox.Enabled -and `
                                $checkbox.Name -ne 'chckCredential' -and `
                                $checkbox.Name -ne 'chckApplication' -and `
                                $checkbox.Name -ne 'chckCertificate')
                        {
                            $SelectedComponents += $checkbox.Name.Replace("chck", "")
                        }
                    }
                }

                try
                {
                    if ($txtPassword.Text.Length -gt 0)
                    {
                        $GlobalAdminAccount = New-Object System.Management.Automation.PSCredential ($txtTenantAdmin.Text, (ConvertTo-SecureString -String $txtPassword.Text -AsPlainText -Force))
                    }
                    $CertPasswordcreds = $null
                    if (-not [System.String]::IsNullOrEmpty($txtCertPassword.Text))
                    {
                        [securestring]$secStringPassword = ConvertTo-SecureString $txtCertPassword.Text -AsPlainText -Force
                        [pscredential]$CertPasswordcreds = New-Object System.Management.Automation.PSCredential ("M365DSCExport", $secStringPassword)
                    }

                    if ($chckCredential.Checked -and `
                        ([System.String]::IsNullOrEmpty($txtTenantAdmin.Text) -or `
                                [System.String]::IsNullOrEmpty($txtPassword.Text)))
                    {
                        [System.Windows.Forms.MessageBox]::Show("You need to provide your Admininistrative account Username & Password.")
                    }
                    elseif ($chckApplication.Checked -and `
                            [System.String]::IsNullOrEmpty($txtApplicationId.Text))
                    {
                        [System.Windows.Forms.MessageBox]::Show("You need to provide your the Application Id to authenticate with.")
                    }
                    elseif ($chckCertificate.Checked -and `
                            [System.String]::IsNullOrEmpty($txtCertThumb.Text) -and `
                            [System.String]::IsNullOrEmpty($txtCertFile.Text) -and `
                            [System.String]::IsNullOrEmpty($txtCertPassword.Text) -and `
                            [System.String]::IsNullOrEmpty($txtTenantId.Text))
                    {
                        [System.Windows.Forms.MessageBox]::Show("You need to provide one of Thumbprint, File Path, Password or Tenant Id to authenticate with a certificate.")
                    }
                    else
                    {
                        $form.Hide()
                        Start-M365DSCConfigurationExtract -GlobalAdminAccount $GlobalAdminAccount `
                            -ApplicationId $txtApplicationId.Text `
                            -TenantId $txtTenantId.Text `
                            -CertificateThumbprint $txtCertThumb.Text `
                            -CertificatePath $txtCertFile.Text `
                            -CertificatePassword $CertPasswordcreds `
                            -ComponentsToExtract $SelectedComponents `
                            -Path $Path `
                            -FileName $FileName `
                            -GenerateInfo $GenerateInfo
                    }
                }
                catch
                {
                    $Message = "Could not initiate the ReverseDSC Extraction"
                    $tenantId = $null
                    try
                    {
                        if (-not [System.String]::IsNullOrEmpty($txtTenantId.Text))
                        {
                            $tenantId = $txtTenantId.Text
                        }
                        elseif ($null -ne $GlobalAdminAccount -and
                            $GlobalAdminAccount.UserName -contains '@')
                        {
                            $tenantId = $GlobalAdminAccount.UserName.Split('@')[1]
                        }
                    }
                    catch
                    {
                        Write-Verbose -Message $_
                    }
                    New-M365DSCLogEntry -Error $_ `
                        -Message $Message `
                        -Source "[M365DSCReverseGUI]" `
                        -TenantId $tenantId
                }
            })
        $panelMenu.Controls.Add($btnExtract);
        $pnlMain.Controls.Add($panelMenu);
        #endregion

        $version = (Get-Module 'Microsoft365DSC').Version
        $lblVersion = New-Object System.Windows.Forms.Label
        $lblVersion.Text = "v" + $version
        $lblVersion.Top = $pnlMain.Height - 25
        $lblVersion.Left = $pnlMain.Width - 70
        $lblVersion.AutoSize = $true
        $pnlMain.Controls.Add($lblVersion)

        $pnlMain.AutoScroll = $true
        $form.Controls.Add($pnlMain)
        $form.ActiveControl = $txtTenantAdmin
        $form.Text = "Microsoft365DSC - Extract Configuration"
        $form.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen

        $Global:M365DSCExportGui = $form
        Set-M365DSCGUIResourcesAvailability -Credentials $chckCredential.Checked `
            -Certificate $chckCertificate.Checked `
            -Application $chckApplication.Checked
        $form.ShowDialog() | Out-Null
    }
    catch
    {
        Write-Verbose -Message $_
    }
}

function SelectComponentsForMode
{
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true)]
        [System.Windows.Forms.Panel]
        $PanelMain,

        [Parameter(Mandatory = $true)]
        [System.UInt32]
        $Mode,

        [Parameter()]
        [System.String[]]
        $ControlsToSkip
    )
    foreach ($parent in $panelMain.Controls)
    {
        if ($parent.GetType().ToString() -eq "System.Windows.Forms.Panel")
        {
            foreach ($control in ([System.Windows.Forms.Panel]$parent).Controls)
            {
                if ($control.GetType().Name -eq 'Checkbox' -and `
                        -not($control.Name -eq 'chckCredential' -or `
                            $control.Name -eq 'chckApplication' -or `
                            $control.Name -eq 'chckCertificate'))
                {
                    try
                    {
                        if ($mode -ne 3 -and $ControlsToSkip.Contains($control.Name.Replace("chck", "")) -or $mode -eq 0)
                        {
                            $control.Checked = $false
                        }
                        else
                        {
                            $control.Checked = $true
                        }
                    }
                    catch
                    {
                        Write-Verbose $_
                    }
                }
            }
        }
        elseif ($parent.GetType().ToString() -eq "System.Windows.Forms.Checkbox")
        {
            ([System.Windows.Forms.Checkbox]$parent).Checked = $false
        }
    }
    foreach ($control in $components)
    {
        try
        {
            $control.Checked = $true
        }
        catch
        {
            Write-Verbose -Message $_
        }
    }
}

function Set-M365DSCGUIResourcesAvailability
{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [System.Boolean]
        $Credentials,

        [Parameter(Mandatory = $true)]
        [System.Boolean]
        $Certificate,

        [Parameter(Mandatory = $true)]
        [System.Boolean]
        $Application
    )

    $AuthMethods = @()
    if ($Credentials)
    {
        $AuthMethods += "Credentials"
    }
    if ($Certificate)
    {
        $AuthMethods += "Certificate"
    }
    if ($Application)
    {
        $AuthMethods += "Application"
    }

    $allSelectedControls = Get-M365DSCComponentsForAuthenticationType -AuthenticationMethod $AuthMethods

    $allControls = Get-M365DSCExportGUIAllControls -Control $Global:M365DSCExportGUI

    foreach ($control in $allControls)
    {
        $chck = ([System.Windows.Forms.CheckBox]$control)
        $controlName = $chck.Name
        if ($allSelectedControls -contains $controlName.Replace("chck", ""))
        {
            $control.Enabled = $true
        }
        else
        {
            $control.Enabled = $false
        }
    }
}

function Get-M365DSCExportGUIAllControls
{
    [CmdletBinding()]
    [OutputType([System.Windows.Forms.Control[]])]
    param(
        [Parameter(Mandatory = $true)]
        [System.Windows.Forms.Control]
        $Control
    )

    $result = @()
    foreach ($control in $Control.Controls)
    {
        if ($control.GetType().ToString() -eq 'System.Windows.Forms.CheckBox')
        {
            $controlName = ([System.Windows.Forms.CheckBox]$control).Name
            if ($controlName -like 'chckAAD*' -or `
                    $controlName -like 'chckEXO*' -or `
                    $controlName -like 'chckIntune*' -or `
                    $controlName -like 'chckO365*' -or `
                    $controlName -like 'chckOD*' -or `
                    $controlName -like 'chckPP*' -or `
                    $controlName -like 'chckPlanner*' -or `
                    $controlName -like 'chckSC*' -or `
                    $controlName -like 'chckSPO*' -or `
                    $controlName -like 'chckTeams*')
            {
                $result += $control
            }
        }
        Get-M365DSCExportGUIAllControls -Control $control
    }
    return $result
}