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") { # TODO remove exception after the SPO Management Shell bug is fixed; if ($pnlControl.Name -ne 'chckSPOSite' -and $pnlControl.Name -ne 'chckSPOHubSite') { $pnlControl.Checked = $Control.Checked } } } } function Show-M365DSCGUI { [CmdletBinding()] param( [Parameter()] [System.String] $Path ) try { [CmdletBinding()] #region Global $firstColumnLeft = 10 $secondColumnLeft = 340 $thirdColumnLeft = 680 $fourthColumnLeft = 1020 $fifthColumnLeft = 1360 $topBannerHeight = 70 #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 $pnlMain = New-Object System.Windows.Forms.Panel $pnlMain.Width = $form.Width $pnlMain.Height = $form.Height $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 + 180 $imgSC.AutoSize = $true $pnlMain.Controls.Add($imgSC) $pnlSC = New-Object System.Windows.Forms.Panel $pnlSC.Top = $pnlEXO.Height + 275 $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 + 180 $imgTeams.AutoSize = $true $pnlMain.Controls.Add($imgTeams) $pnlTeams = New-Object System.Windows.Forms.Panel $pnlTeams.Top = $pnlSPO.Height + 275 $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 = 350 $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 Office365 $imgO365 = New-Object System.Windows.Forms.PictureBox $imagePath = $PSScriptRoot + "\..\Dependencies\Images\Office365.jpg" $imgO365.ImageLocation = $imagePath $imgO365.Left = $thirdColumnLeft $imgO365.Top = $pnlPP.Height + 180 $imgO365.AutoSize = $true $pnlMain.Controls.Add($imgO365) $pnlO365 = New-Object System.Windows.Forms.Panel $pnlO365.Top = $pnlPP.Height + 275 $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.Enabled = $false #TODO - Reactivate after SPO Mgmt Shell bug fix $chckAllOD.Checked = $false #TODO - Reactivate after SPO Mgmt Shell bug fix $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 + 180 $imgAAD.AutoSize = $true $pnlMain.Controls.Add($imgAAD) $pnlAAD = New-Object System.Windows.Forms.Panel $pnlAAD.Top = $pnlOD.Height + 275 $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 $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("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("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 # TODO: Remove once OneDrive is no longer an issue; if ($resourceName -eq 'ODSettings') { $chckBox.Checked = $false; $chckBox.Enabled = $false } $ModeIdentifier.Top = $currentControlTop + 1 $panel.Controls.Add($ModeIdentifier) $panel.Controls.Add($chckBox) } $pnlMain.Controls.Add($pnlO365) $pnlMain.Controls.Add($pnlExo) $pnlMain.Controls.Add($pnlOD) $pnlMain.Controls.Add($pnlPP) $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 = 245 $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 = 345 $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 = 360 $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 = 330 $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 = 345 $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 = 360 $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 = 315 $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 = 330 $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 = 345 $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 = 360 $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 = 700 $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); $lblFarmAccount = New-Object System.Windows.Forms.Label $lblFarmAccount.Text = "Tenant Admin:" $lblFarmAccount.Top = 10 $lblFarmAccount.Left = 940 $lblFarmAccount.AutoSize = $true $lblFarmAccount.TextAlign = [System.Drawing.ContentAlignment]::TopRight $lblFarmAccount.Font = [System.Drawing.Font]::new($lblFarmAccount.Font.Name, 8, [System.Drawing.FontStyle]::Bold) $panelMenu.Controls.Add($lblFarmAccount) $txtTenantAdmin = New-Object System.Windows.Forms.Textbox $txtTenantAdmin.Top = 5 $txtTenantAdmin.Left = 1060 $txtTenantAdmin.Width = 345 $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 = 47 $lblPassword.Left = 940 $lblPassword.AutoSize = $true $lblPassword.TextAlign = [System.Drawing.ContentAlignment]::TopRight $lblPassword.Font = [System.Drawing.Font]::new($lblPassword.Font.Name, 8, [System.Drawing.FontStyle]::Bold) $panelMenu.Controls.Add($lblPassword) $txtPassword = New-Object System.Windows.Forms.Textbox $txtPassword.Top = 40 $txtPassword.Left = 1060 $txtPassword.Width = 345 $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) $btnExtract = New-Object System.Windows.Forms.Button $btnExtract.Width = 178 $btnExtract.Height = 70 $btnExtract.Top = 0 $btnExtract.Left = $form.Width - 200 $btnExtract.BackColor = [System.Drawing.Color]::ForestGreen $btnExtract.ForeColor = [System.Drawing.Color]::White $btnExtract.Text = "Start Extraction" $btnExtract.Add_Click( { if ($txtPassword.Text.Length -gt 0) { $form.Hide() $SelectedComponents = @() foreach ($panel in ($form.Controls[0].Controls | Where-Object -FilterScript { $_.GetType().Name -eq "Panel" })) { foreach ($checkbox in ($panel.Controls | Where-Object -FilterScript { $_.GetType().Name -eq "Checkbox" })) { if ($checkbox.Checked) { $SelectedComponents += $checkbox.Name.Replace("chck", "") } } } try { $GlobalAdminAccount = New-Object System.Management.Automation.PSCredential ($txtTenantAdmin.Text, (ConvertTo-SecureString -String $txtPassword.Text -AsPlainText -Force)) Start-M365DSCConfigurationExtract -GlobalAdminAccount $GlobalAdminAccount ` -ComponentsToExtract $SelectedComponents ` -Path $Path } catch { $Message = "Could not initiate the ReverseDSC Extraction" New-M365DSCLogEntry -Error $_ -Message $Message_ -Source "[M365DSCReverseGUI]" } } else { [System.Windows.Forms.MessageBox]::Show("Please provide a password for the Tenant Admin Account") } }) $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 $return = $form.ShowDialog() } catch { } } 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') { 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 { } } } |