ADACLScan1.3.3.ps1

something exciting

Some information about the exciting thing

Table of contents generated with markdown-toc


Script

#Generated Form Function
function GenerateForm {
    ################################################################################################
    # ADACLScan.ps1
    #
    # AUTHOR: Robin Granberg ([email protected])
    #
    # THIS CODE-SAMPLE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
    # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR
    # FITNESS FOR A PARTICULAR PURPOSE.
    #
    # This sample is not supported under any Microsoft standard support program or service.
    # The script is provided AS IS without warranty of any kind. Microsoft further disclaims all
    # implied warranties including, without limitation, any implied warranties of merchantability
    # or of fitness for a particular purpose. The entire risk arising out of the use or performance
    # of the sample and documentation remains with you. In no event shall Microsoft, its authors,
    # or anyone else involved in the creation, production, or delivery of the script be liable for
    # any damages whatsoever (including, without limitation, damages for loss of business profits,
    # business interruption, loss of business information, or other pecuniary loss) arising out of
    # the use of or inability to use the sample or documentation, even if Microsoft has been advised
    # of the possibility of such damages.
    ################################################################################################

    #region Import the Assemblies
    [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
    [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
    #endregion

    #region Generated Form Objects'
    $chkBoxTemplateNodes = New-Object System.Windows.Forms.CheckBox
    $gBoxReportOpt = New-Object System.Windows.Forms.GroupBox
    $gBoxScanDepth = New-Object System.Windows.Forms.GroupBox
    $gBoxEffectiveSelUser = New-Object System.Windows.Forms.GroupBox
    $lblSelectPrincipalDom = New-Object System.Windows.Forms.Label
    $lblEffectiveRightsColor = New-Object System.Windows.Forms.Label
    $lblEffectiveSelUser = New-Object System.Windows.Forms.Label
    $lblEffectiveDescText = New-Object System.Windows.Forms.Label
    $lblEffectiveText = New-Object System.Windows.Forms.Label
    $chkBoxEffectiveRights = New-Object System.Windows.Forms.CheckBox
    $chkBoxEffectiveRightsColor = New-Object System.Windows.Forms.CheckBox
    $chkBoxGetOUProtected = New-Object System.Windows.Forms.CheckBox
    $chkBoxGetOwner = New-Object System.Windows.Forms.CheckBox
    $chkBoxReplMeta = New-Object System.Windows.Forms.CheckBox
    $chkBoxACLSize = New-Object System.Windows.Forms.CheckBox
    $chkBoxType = New-Object System.Windows.Forms.CheckBox
    $chkBoxObject = New-Object System.Windows.Forms.CheckBox
    $chkBoxTrustee = New-Object System.Windows.Forms.CheckBox
    $lblStyleWin8_1 = New-Object System.Windows.Forms.Panel
    $lblStyleWin8_1 = New-Object System.Windows.Forms.Label
    $lblStyleWin8_2 = New-Object System.Windows.Forms.Label
    $lblStyleWin8_3 = New-Object System.Windows.Forms.Label
    $lblStyleWin8_4 = New-Object System.Windows.Forms.Label
    $lblStyleWin8_5 = New-Object System.Windows.Forms.Label
    $lblHeaderInfo = New-Object System.Windows.Forms.Label
    $lblRunScan	= New-Object System.Windows.Forms.Label
    $lblConnect	= New-Object System.Windows.Forms.Label
    $btnGETSPNReport = New-Object System.Windows.Forms.Button
    $btnGetSPAccount = New-Object System.Windows.Forms.Button
    $btnGetObjFullFilter = New-Object System.Windows.Forms.Button
    $btnViewLegend = New-Object System.Windows.Forms.Button
    $tabFilterTop = New-Object System.Windows.Forms.TabControl
    $tabFilter = New-Object System.Windows.Forms.TabPage
    $tabEffectiveR = New-Object System.Windows.Forms.TabPage
    $combObjectFilter = New-Object System.Windows.Forms.ComboBox
    $lblGetObj = New-Object System.Windows.Forms.Label
    $lblGetObjExtend = New-Object System.Windows.Forms.Label
    $lblAccessCtrl = New-Object System.Windows.Forms.Label
    $combAccessCtrl = New-Object System.Windows.Forms.ComboBox
    $lblFilterTrusteeExpl = New-Object System.Windows.Forms.Label
    $txtFilterTrustee = New-Object System.Windows.Forms.TextBox
    $chkBoxFilter = New-Object System.Windows.Forms.CheckBox
    $lblFilterExpl = New-Object System.Windows.Forms.Label
    $txtBoxSelectPrincipal = New-Object System.Windows.Forms.TextBox
    $textBoxResultView = New-Object System.Windows.Forms.TextBox
    $InitialFormWindowStatePop = New-Object System.Windows.Forms.FormWindowState
    $form1 = New-Object System.Windows.Forms.Form
    $txtTempFolder = New-Object System.Windows.Forms.TextBox
    $lblTempFolder = New-Object System.Windows.Forms.Label
    $txtCompareTemplate = New-Object System.Windows.Forms.TextBox
    $lblCompareTemplate = New-Object System.Windows.Forms.Label
    $lblSelectedNode = New-Object System.Windows.Forms.Label
    $lblStatusBar = New-Object System.Windows.Forms.Label
    $TextBoxStatusMessage = New-Object System.Windows.Forms.ListBox
    $lblDomain = New-Object System.Windows.Forms.Label
    $rdbCustomNC = New-Object System.Windows.Forms.RadioButton
    $rdbOneLevel = New-Object System.Windows.Forms.RadioButton
    $rdbSubtree = New-Object System.Windows.Forms.RadioButton
    $rdbDSdef = New-Object System.Windows.Forms.RadioButton
    $rdbDSConf = New-Object System.Windows.Forms.RadioButton
    $rdbDSSchm = New-Object System.Windows.Forms.RadioButton
    $btnDSConnect = New-Object System.Windows.Forms.Button
    $btnListDdomain = New-Object System.Windows.Forms.Button
    $btnListLocations = New-Object System.Windows.Forms.Button
    $gBoxRdbScan = New-Object System.Windows.Forms.GroupBox
    $gBoxRdbFile = New-Object System.Windows.Forms.GroupBox
    $tabScanTop = New-Object System.Windows.Forms.TabControl
    $tabScan = New-Object System.Windows.Forms.TabPage
    $tabOfflineScan = New-Object System.Windows.Forms.TabPage
    $txtCSVImport = New-Object System.Windows.Forms.TextBox
    $lblCSVImport = New-Object System.Windows.Forms.Label
    $rdbBase = New-Object System.Windows.Forms.RadioButton
    $chkInheritedPerm = New-Object System.Windows.Forms.CheckBox
    $chkBoxDefaultPerm = New-Object System.Windows.Forms.CheckBox
    $rdbScanOU = New-Object System.Windows.Forms.RadioButton
    $rdbScanContainer = New-Object System.Windows.Forms.RadioButton
    $rdbScanAll = New-Object System.Windows.Forms.RadioButton
    $rdbHTAandCSV = New-Object System.Windows.Forms.RadioButton
    $rdbOnlyHTA = New-Object System.Windows.Forms.RadioButton
    $rdbOnlyCSV = New-Object System.Windows.Forms.RadioButton
    $chkBoxExplicit = New-Object System.Windows.Forms.CheckBox
    $btnConfig = New-Object System.Windows.Forms.Button
    $txtBoxSelected = New-Object System.Windows.Forms.TextBox
    $txtBoxDomainConnect = New-Object System.Windows.Forms.TextBox
    $gBoxNCSelect = New-Object System.Windows.Forms.GroupBox
    $gBoxBrowse = New-Object System.Windows.Forms.GroupBox
    $rdbBrowseAll = New-Object System.Windows.Forms.RadioButton
    $rdbBrowseOU = New-Object System.Windows.Forms.RadioButton
    $btnScan = New-Object System.Windows.Forms.Button
    $btnCompare = New-Object System.Windows.Forms.Button
    $lblHeader = New-Object System.Windows.Forms.Label
    $treeView1 = New-Object System.Windows.Forms.TreeView
    $btnGetTemplateFolder = New-Object System.Windows.Forms.Button
    $btnGetCompareInput = New-Object System.Windows.Forms.Button
    $btnExit = New-Object System.Windows.Forms.Button
    $btnGetCSVFile = New-Object System.Windows.Forms.Button
    $btnConvertCSV = New-Object System.Windows.Forms.Button
    $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
    $gBoxCompare = New-Object System.Windows.Forms.GroupBox
    $gBoxImportCSV = New-Object System.Windows.Forms.GroupBox

    $txtTempFolder.Text = $CurrentFSPath
    $global:bolConnected = $false
    $global:strPinDomDC = ""
    $global:strPrinDomAttr = ""
    $global:strPrinDomDir = ""
    $global:strPrinDomFlat = ""
    $global:strPrincipalDN = ""
    $global:strDomainPrinDNName = ""
    $global:strEffectiveRightSP = ""
    $global:strEffectiveRightAccount = ""
    $global:strSPNobjectClass = ""
    $global:tokens = New-Object System.Collections.ArrayList
    $global:tokens.Clear()
    $global:strDommainSelect = "rootDSE"
    $global:bolTempValue_InhertiedChkBox = $false
    $global:redcolor = "red"
    $FontSans775 = "Microsoft Sans Serif, 7.75pt"
    $FontSans825 = "Microsoft Sans Serif, 8.25pt"
    $FontSans825B = "Microsoft Sans Serif, 8.25pt, style=Bold"
    $FontSans75B = "Microsoft Sans Serif, 7.5pt, style=Bold"
    $FontSans9B = "Microsoft Sans Serif, 9pt, style=Bold"
    $FontSans9 = "Microsoft Sans Serif, 9pt"

    #----------------------------------------------
    #Generated Event Script Blocks
    #----------------------------------------------
    $FormEvent_Load =
    {
        #TODO: Place custom script here
        #Add-Type -TypeDefinition @"
        New-Type @"
using System;
using System.Windows.Forms;

public class Win32Window : IWin32Window
{
    private IntPtr _hWnd;

    public Win32Window(IntPtr handle)
    {
        _hWnd = handle;
    }

    public IntPtr Handle
    {
        get { return _hWnd; }
    }
}
"@ -ReferencedAssemblies "System.Windows.Forms.dll"

        Add-Type @"
  using System;
  using System.Runtime.InteropServices;
  public class SFW {
     [DllImport("user32.dll")]
     [return: MarshalAs(UnmanagedType.Bool)]
     public static extern bool SetForegroundWindow(IntPtr hWnd);
  }
"@

        [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null

        $owner = New-Object Win32Window -ArgumentList ([System.Diagnostics.Process]::GetCurrentProcess().MainWindowHandle)

    }

    $btnGETSPNReport_OnClick =
    {
        If (($global:strEffectiveRightSP -ne "") -and ($global:tokens.count -gt 0)) {

            $strFileSPNHTA = $env:temp + "\SPNHTML.hta"
            $strFileSPNHTM = $env:temp + "\" + "$global:strEffectiveRightAccount" + ".htm"
            CreateServicePrincipalReportHTA $global:strEffectiveRightSP $strFileSPNHTA $strFileSPNHTM $CurrentFSPath
            CreateSPNHTM $global:strEffectiveRightSP $strFileSPNHTM
            InitiateSPNHTM $strFileSPNHTA
            $strColorTemp = "1"
            WriteSPNHTM $global:strEffectiveRightSP $global:tokens $global:strSPNobjectClass $($global:tokens.count - 1) $strColorTemp $strFileSPNHTA $strFileSPNHTM
            Invoke-Item $strFileSPNHTA
        }
        else {

            $TextBoxStatusMessage.Items.Insert(0, "No service principal selected!")
        }
    }

    $btnViewLegened_OnClick =
    {

        $strFileLegendHTA = $env:temp + "\LegendHTML.hta"

        CreateColorLegenedReportHTA $strFileLegendHTA
        Invoke-Item $strFileLegendHTA

    }

    $btnGetSPAccount_OnClick =
    {

        if ($global:bolConnected -eq $true) {

            If (!($txtBoxSelectPrincipal.Text -eq "")) {
                GetEffectiveRightSP $txtBoxSelectPrincipal.Text $global:strDomainPrinDNName
            }
            else {
                $TextBoxStatusMessage.ForeColor = $global:redcolor
                $TextBoxStatusMessage.Items.Insert(0, "Enter a principal name!")
            }
        }
        else {
            $TextBoxStatusMessage.ForeColor = $global:redcolor
            $TextBoxStatusMessage
            $TextBoxStatusMessage.Items.Insert(0, "Connect to your naming context first!")
        }
    }

    $btnListDdomain_OnClick =
    {

        GenerateDomainPicker

        $txtBoxDomainConnect.Text = $global:strDommainSelect
    }
    $btnListLocations_OnClick =
    {

        if ($global:bolConnected -eq $true) {
            GenerateTrustedDomainPicker
        }
        else {
            $TextBoxStatusMessage.ForeColor = $global:redcolor
            $TextBoxStatusMessage
            $TextBoxStatusMessage.Items.Insert(0, "Connect to your naming context first!")
        }
    }

    $chkBoxEffectiveRights_CheckChanged =
    {
        If ($chkBoxEffectiveRights.Checked -eq $true) {
            $global:bolTempValue_InhertiedChkBox = $chkInheritedPerm.Checked
            $global:bolTempValue_chkBoxGetOwner = $chkBoxGetOwner.Checked
            $chkBoxFilter.Checked = $false
            $txtBoxSelectPrincipal.Enabled = $true
            $btnGetSPAccount.Enabled = $true
            $btnListLocations.Enabled = $true
            $btnGetSPNReport.Enabled = $true
            $chkInheritedPerm.Enabled = $false
            $chkInheritedPerm.Checked = $true
            $chkBoxGetOwner.Enabled = $false
            $btnViewLegend.Enabled = $true
            $chkBoxGetOwner.Checked = $true
            $chkBoxEffectiveRightsColor.Enabled = $true

        }
        else {
            $txtBoxSelectPrincipal.Enabled = $false
            $chkBoxEffectiveRightsColor.Enabled = $false
            $chkBoxEffectiveRightsColor.Checked = $false
            $btnGetSPAccount.Enabled = $false
            $btnListLocations.Enabled = $false
            $btnGetSPNReport.Enabled = $false
            $btnViewLegend.Enabled = $false
            $chkInheritedPerm.Enabled = $true
            $chkInheritedPerm.Checked = $global:bolTempValue_InhertiedChkBox
            $chkBoxGetOwner.Enabled = $true
            $chkBoxGetOwner.Checked = $global:bolTempValue_chkBoxGetOwner
        }

    }

    $chkBoxFilter_CheckChanged =
    {

        If ($chkBoxFilter.Checked -eq $true) {
            $chkBoxEffectiveRights.Checked = $false
            $chkBoxType.Enabled = $true
            $chkBoxObject.Enabled = $true
            $chkBoxTrustee.Enabled = $true
            $combObjectFilter.Enabled = $true
            $txtFilterTrustee.Enabled = $true
            $combAccessCtrl.Enabled = $true
            $btnGetObjFullFilter.Enabled = $true

        }
        else {
            $chkBoxType.Enabled = $false
            $chkBoxObject.Enabled = $false
            $chkBoxTrustee.Enabled = $false
            $chkBoxType.Checked = $false
            $chkBoxObject.Checked = $false
            $chkBoxTrustee.Checked = $false
            $combObjectFilter.Enabled = $false
            $txtFilterTrustee.Enabled = $false
            $combAccessCtrl.Enabled = $false
            $btnGetObjFullFilter.Enabled = $false
        }
    }

    $rdbNC_CheckChanged =
    {
        If ($rdbCustomNC.Checked -eq $true) {
            $txtBoxDomainConnect.Enabled = $true
            $btnListDdomain.Enabled = $false
            if (($txtBoxDomainConnect.Text -eq "rootDSE") -or ($txtBoxDomainConnect.Text -eq "config") -or ($txtBoxDomainConnect.Text -eq "schema")) {
                $txtBoxDomainConnect.Text = ""
            }
        }
        else {
            $btnListDdomain.Enabled = $false
            If ($rdbDSdef.Checked -eq $true) {
                $txtBoxDomainConnect.Text = $global:strDommainSelect
                $btnListDdomain.Enabled = $true

            }
            If ($rdbDSConf.Checked -eq $true) {
                $txtBoxDomainConnect.Text = "config"


            }
            If ($rdbDSSchm.Checked -eq $true) {
                $txtBoxDomainConnect.Text = "schema"


            }
            $txtBoxDomainConnect.Enabled = $false
        }



    }

    $btnGetTemplateFolder_OnClick =
    {

        $strFolderPath = Select-Folder
        $txtTempFolder.Text = $strFolderPath


    }
    $btnGetCompareInput_OnClick =
    {

        $strFilePath = Select-File
        $txtCompareTemplate.Text = $strFilePath


    }
    $btnGetCSVFile_OnClick =
    {

        $strFilePath = Select-File
        $txtCSVImport.Text = $strFilePath


    }
    $btnDSConnect_OnClick =
    {

        $global:bolRoot = $true
        $treeView1.Nodes.Clear()
        $NCSelect = $false
        If ($rdbDSConf.Checked) {
            [directoryservices.directoryEntry]$root = (New-Object system.directoryservices.directoryEntry)
            # Try to connect to the Domain root
            & { #Try
                [void]$Root.psbase.get_Name() }
            Trap [SystemException] {
                [boolean] $global:bolRoot = $false
                $TextBoxStatusMessage.ForeColor = $global:redcolor
                $TextBoxStatusMessage.Items.Insert(0, "Failed! Domain does not exist or can not be connected")
                $global:bolConnected = $false; Continue
            }
            if ($global:bolRoot -eq $true) {
                $arrADPartitions = GetADPartitions($root.distinguishedName)
                [string] $global:strDomainDNName = $arrADPartitions.Item("domain")
                $global:strDomainPrinDNName = $global:strDomainDNName
                $global:strDomainLongName = $global:strDomainDNName.Replace("DC=", "")
                $global:strDomainLongName = $global:strDomainLongName.Replace(",", ".")

                $Context = New-Object DirectoryServices.ActiveDirectory.DirectoryContext("Domain", $global:strDomainLongName )
                $ojbDomain = [DirectoryServices.ActiveDirectory.Domain]::GetDomain($Context)
                $global:strDC = $($ojbDomain.FindDomainController()).name
                $global:Forest = Get-Forest $global:strDC
                $global:ForestRootDomainDN = Get-DomainDNfromFQDN $global:Forest.RootDomain
                $global:strDomainShortName = GetDomainShortName $global:strDomainDNName $global:ForestRootDomainDN

                $lblSelectPrincipalDom.text = $global:strDomainShortName + ":"
                $NCSelect = $true

                $TextBoxStatusMessage.ForeColor = "black"
                $TextBoxStatusMessage.Items.Insert(0, "Connected")

                $root = New-Object system.directoryservices.directoryEntry("LDAP://$global:strDC/cn=configuration," + $global:ForestRootDomainDN)

            }
        }
        If ($rdbDSSchm.Checked) {
            [directoryservices.directoryEntry]$root = (New-Object system.directoryservices.directoryEntry)
            # Try to connect to the Domain root
            & { #Try
                [void]$Root.psbase.get_Name() }
            Trap [SystemException] {
                [boolean] $global:bolRoot = $false
                $TextBoxStatusMessage.ForeColor = $global:redcolor
                $TextBoxStatusMessage.Items.Insert(0, "Failed! Domain does not exist or can not be connected")
                $global:bolConnected = $false; Continue
            }
            if ($global:bolRoot -eq $true) {
                $arrADPartitions = GetADPartitions($root.distinguishedName)
                [string] $global:strDomainDNName = $arrADPartitions.Item("domain")
                $global:strDomainPrinDNName = $global:strDomainDNName
                $global:strDomainLongName = $global:strDomainDNName.Replace("DC=", "")
                $global:strDomainLongName = $global:strDomainLongName.Replace(",", ".")

                $Context = New-Object DirectoryServices.ActiveDirectory.DirectoryContext("Domain", $global:strDomainLongName )
                $ojbDomain = [DirectoryServices.ActiveDirectory.Domain]::GetDomain($Context)
                $global:strDC = $($ojbDomain.FindDomainController()).name
                $global:Forest = Get-Forest $global:strDC
                $global:ForestRootDomainDN = Get-DomainDNfromFQDN $global:Forest.RootDomain
                $global:strDomainShortName = GetDomainShortName $global:strDomainDNName $global:ForestRootDomainDN
                $lblSelectPrincipalDom.text = $global:strDomainShortName + ":"
                $NCSelect = $true

                $TextBoxStatusMessage.ForeColor = "black"
                $TextBoxStatusMessage.Items.Insert(0, "Connected")

                $root = New-Object system.directoryservices.directoryEntry("LDAP://$global:strDC/cn=schema,cn=configuration," + $global:ForestRootDomainDN)

            }
        }
        If ($rdbDSdef.Checked) {
            if (!($txtBoxDomainConnect.Text -eq "rootDSE")) {
                $strNamingContextDN = $txtBoxDomainConnect.Text
                If (CheckDNExist $strNamingContextDN) {
                    $root = New-Object system.directoryservices.directoryEntry("LDAP://" + $strNamingContextDN)
                    $global:strDomainDNName = $root.distinguishedName.tostring()
                    $global:strDomainPrintDNName = $global:strDomainDNName
                    $global:strDomainLongName = $global:strDomainDNName.Replace("DC=", "")
                    $global:strDomainLongName = $global:strDomainLongName.Replace(",", ".")


                    $Context = New-Object DirectoryServices.ActiveDirectory.DirectoryContext("Domain", $global:strDomainLongName )
                    $ojbDomain = [DirectoryServices.ActiveDirectory.Domain]::GetDomain($Context)
                    $global:strDC = $($ojbDomain.FindDomainController()).name
                    $global:Forest = Get-Forest $global:strDC
                    $global:ForestRootDomainDN = Get-DomainDNfromFQDN $global:Forest.RootDomain
                    $global:strDomainShortName = GetDomainShortName $global:strDomainDNName $global:ForestRootDomainDN
                    $lblSelectPrincipalDom.text = $global:strDomainShortName + ":"
                    $NCSelect = $true
                }
                else {
                    $TextBoxStatusMessage.ForeColor = $global:redcolor
                    $TextBoxStatusMessage.Items.Insert(0, "Failed! Domain does not exist or can not be connected")
                    $global:bolConnected = $false
                }
            }
            else {

                [directoryservices.directoryEntry]$root = (New-Object system.directoryservices.directoryEntry)

                # Try to connect to the Domain root
                & { #Try
                    [void]$Root.psbase.get_Name() }
                Trap [SystemException] {
                    [boolean] $global:bolRoot = $false
                    $TextBoxStatusMessage.ForeColor = $global:redcolor
                    $TextBoxStatusMessage.Items.Insert(0, "Failed! Domain does not exist or can not be connected")
                    $global:bolConnected = $false; Continue
                }
                if ($global:bolRoot -eq $true) {

                    $arrADPartitions = GetADPartitions($root.distinguishedName)
                    [string] $global:strDomainDNName = $arrADPartitions.Item("domain")
                    $global:strDomainPrinDNName = $global:strDomainDNName
                    $global:strDomainLongName = $global:strDomainDNName.Replace("DC=", "")
                    $global:strDomainLongName = $global:strDomainLongName.Replace(",", ".")

                    $Context = New-Object DirectoryServices.ActiveDirectory.DirectoryContext("Domain", $global:strDomainLongName )
                    $ojbDomain = [DirectoryServices.ActiveDirectory.Domain]::GetDomain($Context)
                    $global:strDC = $($ojbDomain.FindDomainController()).name
                    $global:Forest = Get-Forest $global:strDC
                    $global:ForestRootDomainDN = Get-DomainDNfromFQDN $global:Forest.RootDomain
                    $global:strDomainShortName = GetDomainShortName $global:strDomainDNName $global:ForestRootDomainDN
                    $lblSelectPrincipalDom.text = $global:strDomainShortName + ":"

                    $TextBoxStatusMessage.ForeColor = "black"
                    $TextBoxStatusMessage.Items.Insert(0, "Connected")
                    $strNamingContextDN = $root.distinguishedName

                    $NCSelect = $true

                }
            }
        }
        If ($rdbCustomNC.Checked) {
            if ($txtBoxDomainConnect.Text.Length -gt 0) {
                $strNamingContextDN = $txtBoxDomainConnect.Text
                If (CheckDNExist $strNamingContextDN) {
                    $root = New-Object system.directoryservices.directoryEntry("LDAP://" + $strNamingContextDN)
                    if (($root.distinguishedName.tostring() -match "cn=") -or ($root.distinguishedName.tostring() -match "ou=")) {
                        $global:strDomainDNName = Get-DomainDN $root.distinguishedName.tostring()
                    }
                    else {
                        $global:strDomainDNName = $root.distinguishedName.tostring()
                    }
                    $global:strDomainPrinDNName = $global:strDomainDNName
                    $global:strDomainLongName = $global:strDomainDNName.Replace("DC=", "")
                    $global:strDomainLongName = $global:strDomainLongName.Replace(",", ".")

                    $Context = New-Object DirectoryServices.ActiveDirectory.DirectoryContext("Domain", $global:strDomainLongName )
                    $ojbDomain = [DirectoryServices.ActiveDirectory.Domain]::GetDomain($Context)
                    $global:strDC = $($ojbDomain.FindDomainController()).name
                    $global:Forest = Get-Forest $global:strDC
                    $global:ForestRootDomainDN = Get-DomainDNfromFQDN $global:Forest.RootDomain

                    $global:strDomainShortName = GetDomainShortName $global:strDomainDNName $global:ForestRootDomainDN
                    $lblSelectPrincipalDom.text = $global:strDomainShortName + ":"
                    $NCSelect = $true
                }
                else {
                    $TextBoxStatusMessage.ForeColor = $global:redcolor
                    $TextBoxStatusMessage.Items.Insert(0, "Failed! Domain does not exist or can not be connected")
                    $global:bolConnected = $false
                }
            }
            else {
                $TextBoxStatusMessage.ForeColor = $global:redcolor
                $TextBoxStatusMessage.Items.Insert(0, "Failed! No naming context specified!")
                $global:bolConnected = $false
            }
        }
        If ($NCSelect -eq $true) {
            If (!($strLastCacheGuidsDom -eq $global:strDomainDNName)) {
                $global:dicRightsGuids = @{"Seed" = "xxx" }
                CacheRightsGuids $global:strDomainDNName
                $strLastCacheGuidsDom = $global:strDomainDNName


            }
            If ($TNRoot.Nodes.Count -gt 0) {
                $TNRoot.Nodes.Clear()
            }
            $treeView1.Nodes.Clear()
            $TNRoot = new-object System.Windows.Forms.TreeNode("Root")
            $TNRoot.Name = $root.distinguishedName
            $TNRoot.Text = $root.name
            $TNRoot.tag = "NotEnumerated"
            $TNRoot.ForeColor = "Black"
            # Add all Children found as Sub Nodes to the selected TreeNode
            $treeView1.add_AfterSelect( {
                    $txtBoxSelected.Text = $this.SelectedNode.Name

                    If ($global:prevNodeText.Length -gt 0) {
                        $global:prevNode.ForeColor = "Black"

                    }

                    $this.SelectedNode.ForeColor = "Blue"
                    if ($this.SelectedNode.tag -eq "NotEnumerated") {
                        $TextBoxStatusMessage.ForeColor = "black"
                        $TextBoxStatusMessage.Items.Insert(0, "Browsing..")
                        BuildTree $this.SelectedNode
                        # Set tag to show this node is already enumerated
                        $this.SelectedNode.tag = "Enumerated"


                    }
                    [string] $global:prevNodeText = $this.SelectedNode.name
                    $global:prevNode = $this.SelectedNode


                })
            [void]$treeView1.Nodes.Add($TNRoot)
            BuildTree $TNRoot
            $global:bolConnected = $true
            $TextBoxStatusMessage.ForeColor = "black"

        }
    }


    $btnScan_OnClick =
    {
        $bolPreChecks = $true
        If ($treeView1.SelectedNode.name) {
            If (($chkBoxFilter.Checked -eq $true) -and (($chkBoxType.Checked -eq $false) -and ($chkBoxObject.Checked -eq $false) -and ($chkBoxTrustee.Checked -eq $false))) {
                $TextBoxStatusMessage.Items.Insert(0, "Filter Enabled , but no filter is specified!")
                $bolPreChecks = $false
            }
            else {
                If (($chkBoxFilter.Checked -eq $true) -and (($combAccessCtrl.SelectedIndex -eq -1) -and ($combObjectFilter.SelectedIndex -eq -1) -and ($txtFilterTrustee.Text -eq ""))) {
                    $TextBoxStatusMessage.Items.Insert(0, "Filter Enabled , but no filter is specified!")
                    $bolPreChecks = $false
                }
            }

            If (($chkBoxEffectiveRights.Checked -eq $true) -and ($global:tokens.count -eq 0)) {
                $TextBoxStatusMessage.Items.Insert(0, "Effective rights enabled , but no service principal selected! ")
                $bolPreChecks = $false
            }
            if ($bolPreChecks -eq $true) {
                $allSubOU = New-Object System.Collections.ArrayList
                $allSubOU.Clear()
                $TextBoxStatusMessage.ForeColor = "black"
                $TextBoxStatusMessage.Items.Insert(0, "Scanning..")
                $BolSkipDefPerm = $chkBoxDefaultPerm.Checked
                $bolCSV = $rdbHTAandCSV.Checked

                $sADobjectName = "LDAP://$global:strDC/" + $treeView1.SelectedNode.name.ToString().Replace("/", "\/")
                $ADobject = [ADSI] $sADobjectName
                $strNode = $ADobject.name

                $date = get-date -uformat %Y%m%d_%H%M%S
                $strNode = fixfilename $strNode
                $strFileCSV = $txtTempFolder.Text + "\" + $strNode + "_" + $global:strDomainShortName + "_adAclOutput" + $date + ".csv"
                $strFileHTA = $env:temp + "\ACLHTML.hta"
                $strFileHTM = $env:temp + "\" + "$global:strDomainShortName-$strNode" + ".htm"
                if (!($rdbOnlyCSV.Checked)) {
                    if ($chkBoxFilter.checked) {
                        CreateHTA "$global:strDomainShortName-$strNode Filtered" $strFileHTA  $strFileHTM $CurrentFSPath
                        CreateHTM "$global:strDomainShortName-$strNode Filtered" $strFileHTM
                    }
                    else {
                        CreateHTA "$global:strDomainShortName-$strNode" $strFileHTA $strFileHTM $CurrentFSPath
                        CreateHTM "$global:strDomainShortName-$strNode" $strFileHTM
                    }

                    InitiateHTM $strFileHTA $chkBoxReplMeta.Checked $chkBoxACLsize.Checked $chkBoxGetOUProtected.Checked $chkBoxEffectiveRightsColor.Checked
                    InitiateHTM $strFileHTM $chkBoxReplMeta.Checked $chkBoxACLsize.Checked $chkBoxGetOUProtected.Checked $chkBoxEffectiveRightsColor.Checked
                }
                If ($treeView1.SelectedNode.name.ToString().Length -gt 0) {
                    If ($rdbBase.checked -eq $False) {
                        If ($rdbSubtree.checked -eq $true) {
                            $allSubOU = GetAllChildNodes $treeView1.SelectedNode.name $true
                            Get-Perm $allSubOU $global:strDomainShortName $BolSkipDefPerm $chkBoxFilter.checked $chkBoxGetOwner.checked $rdbOnlyCSV.Checked $chkBoxReplMeta.Checked $chkBoxACLsize.Checked $chkBoxEffectiveRights.Checked $chkBoxGetOUProtected.Checked
                        }
                        else {

                            $allSubOU = GetAllChildNodes $treeView1.SelectedNode.name $false
                            Get-Perm $allSubOU $global:strDomainShortName $BolSkipDefPerm $chkBoxFilter.checked $chkBoxGetOwner.checked $rdbOnlyCSV.Checked $chkBoxReplMeta.Checked $chkBoxACLsize.Checked $chkBoxEffectiveRights.Checked $chkBoxGetOUProtected.Checked
                        }
                    }
                    else {
                        $allSubOU = @($treeView1.SelectedNode.name)
                        Get-Perm $allSubOU $global:strDomainShortName $BolSkipDefPerm $chkBoxFilter.checked $chkBoxGetOwner.checked $rdbOnlyCSV.Checked $chkBoxReplMeta.Checked $chkBoxACLsize.Checked $chkBoxEffectiveRights.Checked $chkBoxGetOUProtected.Checked
                    }
                    $TextBoxStatusMessage.ForeColor = "black"
                    $TextBoxStatusMessage.Items.Insert(0, "Done")
                }
            }
        }
        else {
            $TextBoxStatusMessage.ForeColor = $global:redcolor
            $TextBoxStatusMessage.Items.Insert(0, "No object selected!")
        }
        $allSubOU = ""
        $strFileCSV = ""
        $strFileHTA = ""
        $strFileHTM = ""
        $sADobjectName = ""
        $date = ""
    }
    $btnCreateHTML =
    {
        if ($txtCSVImport.Text -eq "") {
            $TextBoxStatusMessage.ForeColor = $global:redcolor
            $TextBoxStatusMessage.Items.Insert(0, "No Template CSV file selected!")
        }
        else {
            ConvertCSVtoHTM $txtCSVImport.Text
        }

    }

    $btnCompare_OnClick =
    {
        If ($treeView1.SelectedNode.name) {
            $allSubOU = New-Object System.Collections.ArrayList
            $allSubOU.Clear()
            if ($txtCompareTemplate.Text -eq "") {
                $TextBoxStatusMessage.ForeColor = $global:redcolor
                $TextBoxStatusMessage.Items.Insert(0, "No Template CSV file selected!")
            }
            else {
                $strCompareFile = $txtCompareTemplate.Text
                ImportADSettings $strCompareFile
                $TextBoxStatusMessage.Items.Insert(0, "Scanning..")
                $BolSkipDefPerm = $chkBoxDefaultPerm.Checked
                $sADobjectName = "LDAP://$global:strDC/" + $treeView1.SelectedNode.name.ToString()
                $ADobject = [ADSI] $sADobjectName
                $strNode = fixfilename $ADobject.Name
                $strFileHTA = $env:temp + "\ACLHTML.hta"
                $strFileHTM = $env:temp + "\" + "$global:strDomainShortName-$strNode" + ".htm"
                CreateHTM "$global:strDomainShortName-$strNode" $strFileHTM
                CreateHTA "$global:strDomainShortName-$strNode" $strFileHTA $strFileHTM $CurrentFSPath
                InitiateCompareHTM $strFileHTA $chkBoxReplMeta.Checked
                InitiateCompareHTM $strFileHTM $chkBoxReplMeta.Checked

                If ($treeView1.SelectedNode.name.ToString().Length -gt 0) {
                    If ($rdbBase.checked -eq $False) {
                        If ($rdbSubtree.checked -eq $true) {
                            if ($chkBoxTemplateNodes.Checked -eq $false) {
                                $allSubOU = GetAllChildNodes $treeView1.SelectedNode.name $true
                            }
                            Get-PermCompare $allSubOU $BolSkipDefPerm $chkBoxReplMeta.Checked $chkBoxGetOwner.checked
                        }
                        else {
                            if ($chkBoxTemplateNodes.Checked -eq $false) {
                                $allSubOU = GetAllChildNodes $treeView1.SelectedNode.name $false
                            }
                            Get-PermCompare $allSubOU $BolSkipDefPerm $chkBoxReplMeta.Checked $chkBoxGetOwner.checked
                        }
                    }
                    else {
                        if ($chkBoxTemplateNodes.Checked -eq $false) {
                            $allSubOU = @($treeView1.SelectedNode.name)
                        }
                        Get-PermCompare $allSubOU $BolSkipDefPerm $chkBoxReplMeta.Checked $chkBoxGetOwner.checked
                    }# End If
                    $TextBoxStatusMessage.ForeColor = "black"
                    $TextBoxStatusMessage.Items.Insert(0, "Done")
                }# End If

            }# End If
        }
        else {
            $TextBoxStatusMessage.ForeColor = $global:redcolor
            $TextBoxStatusMessage.Items.Insert(0, "No object selected!")
        }
        $allSubOU = ""
        $strFileCSV = ""
        $strFileHTA = ""
        $strFileHTM = ""
        $sADobjectName = ""
        $date = ""
    }

    $btnExit_OnClick =
    {
        #TODO: Place custom script here
        $form1.close()

    }

    $btnGetObjFullFilter_OnClick =
    {
        if ($global:bolConnected -eq $true) {
            GetSchemaObjectGUID  -Domain $global:strDomainDNName
            $TextBoxStatusMessage.ForeColor = "black"
            $TextBoxStatusMessage.Items.Insert(0, "All schema objects and attributes listed!")
        }
        else {
            $TextBoxStatusMessage.ForeColor = $global:redcolor
            $TextBoxStatusMessage.Items.Insert(0, "Connect to your naming context first!")
        }
    }



    foreach ($ldapDisplayName in $global:dicSchemaIDGUIDs.values) {
        [void]$combObjectFilter.Items.Add($ldapDisplayName)
    }

    $OnLoadForm_StateCorrection =
    { #Correct the initial state of the form to prevent the .Net maximized form issue
        $form1.WindowState = $InitialFormWindowState
    }


    #----------------------------------------------
    #region Generated Form Code
    $form1.BackColor = [System.Drawing.Color]::FromArgb(255, 235, 235, 235)
    $form1.Text = "AD ACL Scanner"
    $form1.Name = "form1"
    $form1.DataBindings.DefaultDataSourceUpdateMode = 0
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 910
    $System_Drawing_Size.Height = 730
    $form1.ClientSize = $System_Drawing_Size
    $form1.add_Load($FormEvent_Load)


    $lblStyleWin8_1.BackColor = [System.Drawing.Color]::FromArgb(255, 255, 83, 0)
    $lblStyleWin8_1.Name = "lblStyleWin8_1"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 595
    $System_Drawing_Point.Y = 575
    $lblStyleWin8_1.Font = "Webdings, 35pt"
    $lblStyleWin8_1.Location = $System_Drawing_Point
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 60
    $System_Drawing_Size.Height = 60
    $lblStyleWin8_1.Size = $System_Drawing_Size
    $lblStyleWin8_1.Text = "d"
    $lblStyleWin8_1.TextAlign = 'MiddleCenter'

    $form1.Controls.Add($lblStyleWin8_1)

    $lblStyleWin8_2.BackColor = [System.Drawing.Color]::FromArgb(255, 0, 64, 128)
    $lblStyleWin8_2.ForeColor = 'White'
    $lblStyleWin8_2.Name = "lblStyleWin8_2"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 660
    $System_Drawing_Point.Y = 630
    $lblStyleWin8_2.Location = $System_Drawing_Point
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 230
    $System_Drawing_Size.Height = 70
    $lblStyleWin8_2.Size = $System_Drawing_Size
    $lblStyleWin8_2.Font = "Microsoft Sans Serif, 9pt, style=Bold"
    $lblStyleWin8_2.Text = "written by [email protected]"

    $form1.Controls.Add($lblStyleWin8_2)

    $lblStyleWin8_3.BackColor = [System.Drawing.Color]::FromArgb(255, 0, 174, 239)
    $lblStyleWin8_3.Name = "lblStyleWin8_3"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 595
    $System_Drawing_Point.Y = 640
    $lblStyleWin8_3.Font = "Webdings, 35pt"
    $lblStyleWin8_3.Location = $System_Drawing_Point
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 60
    $System_Drawing_Size.Height = 60
    $lblStyleWin8_3.Size = $System_Drawing_Size
    $lblStyleWin8_3.Text = "L"
    $lblStyleWin8_3.TextAlign = 'MiddleCenter'

    $form1.Controls.Add($lblStyleWin8_3)



    $lblStyleWin8_5.BackColor = [System.Drawing.Color]::FromArgb(255, 0, 64, 128)
    $lblStyleWin8_5.ForeColor = 'White'
    $lblStyleWin8_5.Name = "lblStyleWin8_5"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 660
    $System_Drawing_Point.Y = 575
    $lblStyleWin8_5.Location = $System_Drawing_Point
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 230
    $System_Drawing_Size.Height = 60
    $lblStyleWin8_5.Size = $System_Drawing_Size
    $lblStyleWin8_5.Font = "Microsoft Sans Serif, 13pt, style=Bold"
    $lblStyleWin8_5.Text = "AD ACL Scanner 1.3.3"

    $form1.Controls.Add($lblStyleWin8_5)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 290
    $System_Drawing_Size.Height = 488
    $tabFilterTop.Size = $System_Drawing_Size
    $tabFilterTop.Text = "Filter Options"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 620
    $System_Drawing_Point.Y = 38
    $tabFilterTop.Location = $System_Drawing_Point
    $tabFilterTop.Name = "tabFilterTop"
    $tabFilterTop.DataBindings.DefaultDataSourceUpdateMode = 0

    $form1.Controls.Add($tabFilterTop)

    $tabFilter.Name = "tabFilter"
    $tabFilter.Text = "Filter Options"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 290
    $System_Drawing_Size.Height = 450
    $tabFilter.Size = $System_Drawing_Size
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 620
    $System_Drawing_Point.Y = 38
    $tabFilter.Location = $System_Drawing_Point
    $tabFilter.DataBindings.DefaultDataSourceUpdateMode = 0

    $tabFilterTop.Controls.Add($tabFilter)

    $tabEffectiveR.Name = "tabEffectiveR"
    $tabEffectiveR.Text = "Effective Rights"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 290
    $System_Drawing_Size.Height = 450
    $tabEffectiveR.Size = $System_Drawing_Size
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 620
    $System_Drawing_Point.Y = 15
    $tabEffectiveR.Location = $System_Drawing_Point
    $tabEffectiveR.DataBindings.DefaultDataSourceUpdateMode = 0

    $tabFilterTop.Controls.Add($tabEffectiveR)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 275
    $System_Drawing_Size.Height = 485
    $tabScanTop.Size = $System_Drawing_Size
    $tabScanTop.Text = "Scan Options"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 340
    $System_Drawing_Point.Y = 38
    $tabScanTop.Location = $System_Drawing_Point
    $tabScanTop.Name = "tbPScanTop"
    $tabScanTop.DataBindings.DefaultDataSourceUpdateMode = 0

    $form1.Controls.Add($tabScanTop)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 266
    $System_Drawing_Size.Height = 450
    $tabScan.Size = $System_Drawing_Size
    $tabScan.Text = "Scan Options"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 340
    $System_Drawing_Point.Y = 38
    $tabScan.Location = $System_Drawing_Point
    $tabScan.Name = "tbPScan"
    $tabScan.DataBindings.DefaultDataSourceUpdateMode = 0

    $tabScanTop.Controls.Add($tabScan)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 266
    $System_Drawing_Size.Height = 450
    $tabOfflineScan.Size = $System_Drawing_Size
    $tabOfflineScan.Text = "Additional Options"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 340
    $System_Drawing_Point.Y = 38
    $tabOfflineScan.Location = $System_Drawing_Point
    $tabOfflineScan.Name = "tbPOfflineScan"
    $tabOfflineScan.DataBindings.DefaultDataSourceUpdateMode = 0

    $tabScanTop.Controls.Add($tabOfflineScan)

    $gBoxNCSelect.TabIndex = 0
    $gBoxNCSelect.Name = "gBoxNCSelect"
    $gBoxNCSelect.Text = "Select Naming Context"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 310
    $System_Drawing_Size.Height = 120
    $gBoxNCSelect.Size = $System_Drawing_Size
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 25
    $System_Drawing_Point.Y = 38
    $gBoxNCSelect.Location = $System_Drawing_Point
    $gBoxNCSelect.DataBindings.DefaultDataSourceUpdateMode = 0

    $form1.Controls.Add($gBoxNCSelect)

    ################################ Filter Tab ################################

    $chkBoxFilter.UseVisualStyleBackColor = $False
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 150
    $System_Drawing_Size.Height = 24
    $chkBoxFilter.Size = $System_Drawing_Size
    $chkBoxFilter.Text = "Enable Filter"
    $chkBoxFilter.Checked = $False
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 9
    $chkBoxFilter.Location = $System_Drawing_Point
    $chkBoxFilter.CheckState = 0
    $chkBoxFilter.DataBindings.DefaultDataSourceUpdateMode = 0
    $chkBoxFilter.Name = "chkBoxFilter"
    $chkBoxFilter.Add_checkedChanged($chkBoxFilter_CheckChanged)


    $tabFilter.Controls.Add($chkBoxFilter)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 18
    $System_Drawing_Size.Height = 24
    $chkBoxType.Size = $System_Drawing_Size
    $chkBoxType.Text = ""
    $chkBoxType.Checked = $False
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 60
    $chkBoxType.Location = $System_Drawing_Point
    $chkBoxType.CheckState = 0
    $chkBoxType.Enabled = $False
    $chkBoxType.DataBindings.DefaultDataSourceUpdateMode = 0
    $chkBoxType.Name = "chkBoxType"


    $tabFilter.Controls.Add($chkBoxType)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 250
    $System_Drawing_Size.Height = 16
    $lblAccessCtrl.Size = $System_Drawing_Size
    $lblAccessCtrl.Font = $FontSans775
    $lblAccessCtrl.Text = "Filter by Access Type:(example: Allow)"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 40
    $lblAccessCtrl.Location = $System_Drawing_Point
    $lblAccessCtrl.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblAccessCtrl.Name = "lblAccessCtrl"

    $tabFilter.Controls.Add($lblAccessCtrl)

    $combAccessCtrl.FormattingEnabled = $True
    $combAccessCtrl.Sorted = $True
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 29
    $System_Drawing_Point.Y = 60
    $combAccessCtrl.Location = $System_Drawing_Point
    $combAccessCtrl.Name = "combAccessCtrl"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 100
    $System_Drawing_Size.Height = 21
    $combAccessCtrl.Size = $System_Drawing_Size
    [void]$combAccessCtrl.Items.Add("Allow")
    [void]$combAccessCtrl.Items.Add("Deny")
    $combAccessCtrl.Enabled = $false

    $tabFilter.Controls.Add($combAccessCtrl)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 250
    $System_Drawing_Size.Height = 16
    $lblFilterExpl.Size = $System_Drawing_Size
    $lblFilterExpl.Font = $FontSans775
    $lblFilterExpl.Text = "Filter by Object:(example: user)"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 90
    $lblFilterExpl.Location = $System_Drawing_Point
    $lblFilterExpl.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblFilterExpl.Name = "lblFilterExpl"

    $tabFilter.Controls.Add($lblFilterExpl)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 18
    $System_Drawing_Size.Height = 24
    $chkBoxObject.Size = $System_Drawing_Size
    $chkBoxObject.Text = ""
    $chkBoxObject.Checked = $False
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 110
    $chkBoxObject.Location = $System_Drawing_Point
    $chkBoxObject.CheckState = 0
    $chkBoxObject.DataBindings.DefaultDataSourceUpdateMode = 0
    $chkBoxObject.Enabled = $False
    $chkBoxObject.Name = "chkBoxObject"

    $tabFilter.Controls.Add($chkBoxObject)

    $combObjectFilter.FormattingEnabled = $True
    $combObjectFilter.Sorted = $True
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 29
    $System_Drawing_Point.Y = 110
    $combObjectFilter.Location = $System_Drawing_Point
    $combObjectFilter.Name = "combObjectFilter"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 190
    $System_Drawing_Size.Height = 21
    $combObjectFilter.Size = $System_Drawing_Size
    $combObjectFilter.Enabled = $False

    $tabFilter.Controls.Add($combObjectFilter)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 265
    $System_Drawing_Size.Height = 44
    $lblGetObj.Size = $System_Drawing_Size
    $lblGetObj.Font = $FontSans775
    $lblGetObj.Text = "The list box contains a few  number of standard objects. To load all objects from schema press Load."
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 140
    $lblGetObj.Location = $System_Drawing_Point
    $lblGetObj.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblGetObj.Name = "lblGetObj"

    $tabFilter.Controls.Add($lblGetObj)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 150
    $System_Drawing_Size.Height = 15
    $lblGetObjExtend.Size = $System_Drawing_Size
    $lblGetObjExtend.Font = "Microsoft Sans Serif, 7.75pt, style=Bold"
    $lblGetObjExtend.Text = "This may take a while!"
    $lblGetObjExtend.ForeColor = "Black"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 182
    $lblGetObjExtend.Location = $System_Drawing_Point
    $lblGetObjExtend.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblGetObjExtend.Name = "lblGetObjExtend"

    $tabFilter.Controls.Add($lblGetObjExtend)

    $btnGetObjFullFilter.Name = "btnGetObjFullFilter"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 100
    $System_Drawing_Size.Height = 23
    $btnGetObjFullFilter.Size = $System_Drawing_Size
    $btnGetObjFullFilter.UseVisualStyleBackColor = $True
    $btnGetObjFullFilter.Font = $FontSans825B
    $btnGetObjFullFilter.Text = "Load"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 160
    $System_Drawing_Point.Y = 185
    $btnGetObjFullFilter.Location = $System_Drawing_Point
    $btnGetObjFullFilter.DataBindings.DefaultDataSourceUpdateMode = 0
    $btnGetObjFullFilter.add_Click($btnGetObjFullFilter_OnClick)
    $btnGetObjFullFilter.Enabled = $false

    $tabFilter.Controls.Add($btnGetObjFullFilter)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 270
    $System_Drawing_Size.Height = 70
    $lblFilterTrusteeExpl.Size = $System_Drawing_Size
    $lblFilterTrusteeExpl.Font = $FontSans775
    $lblFilterTrusteeExpl.Text = "Filter by Trustee:`nExamples:`nCONTOSO\User`nCONTOSO\JohnDoe*`n*Smith`n*Doe*"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 220
    $lblFilterTrusteeExpl.Location = $System_Drawing_Point
    $lblFilterTrusteeExpl.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblFilterTrusteeExpl.Name = "lblFilterTrusteeExpl"

    $tabFilter.Controls.Add($lblFilterTrusteeExpl)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 18
    $System_Drawing_Size.Height = 24
    $chkBoxTrustee.Size = $System_Drawing_Size
    $chkBoxTrustee.Text = ""
    $chkBoxTrustee.Checked = $False
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 292
    $chkBoxTrustee.Location = $System_Drawing_Point
    $chkBoxTrustee.CheckState = 0
    $chkBoxTrustee.DataBindings.DefaultDataSourceUpdateMode = 0
    $chkBoxTrustee.Enabled = $False
    $chkBoxTrustee.Name = "chkBoxObject"

    $tabFilter.Controls.Add($chkBoxTrustee)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 245
    $System_Drawing_Size.Height = 20
    $txtFilterTrustee.Size = $System_Drawing_Size
    $txtFilterTrustee.DataBindings.DefaultDataSourceUpdateMode = 0
    $txtFilterTrustee.Name = "txtFilterTrustee"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 29
    $System_Drawing_Point.Y = 295
    $txtFilterTrustee.Location = $System_Drawing_Point
    $txtFilterTrustee.Enabled = $false

    $tabFilter.Controls.Add($txtFilterTrustee)

    ################################ Filter Tab ################################

    $gBoxCompare.Name = "gBoxCompare"
    $gBoxCompare.Text = "Compare Options"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 260
    $System_Drawing_Size.Height = 120
    $gBoxCompare.Size = $System_Drawing_Size
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 335
    $gBoxCompare.Location = $System_Drawing_Point
    $gBoxCompare.DataBindings.DefaultDataSourceUpdateMode = 0

    $tabScan.Controls.Add($gBoxCompare)


    $gBoxScanDepth.Name = "gBoxScanDepth"
    $gBoxScanDepth.Text = "Scan depth"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 260
    $System_Drawing_Size.Height = 40
    $gBoxScanDepth.Size = $System_Drawing_Size
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 3
    $gBoxScanDepth.Location = $System_Drawing_Point
    $gBoxScanDepth.DataBindings.DefaultDataSourceUpdateMode = 0

    $tabScan.Controls.Add($gBoxScanDepth)

    $gBoxImportCSV.Name = "gBoxImportCSV"
    $gBoxImportCSV.Text = "CSV to HTML"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 260
    $System_Drawing_Size.Height = 160
    $gBoxImportCSV.Size = $System_Drawing_Size
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 10
    $gBoxImportCSV.Location = $System_Drawing_Point
    $gBoxImportCSV.DataBindings.DefaultDataSourceUpdateMode = 0

    $tabOfflineScan.Controls.Add($gBoxImportCSV)


    $rdbDSdef.TabIndex = 99
    $rdbDSdef.TabStop = $false
    $rdbDSdef.UseVisualStyleBackColor = $True
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 75
    $System_Drawing_Size.Height = 24
    $rdbDSdef.Size = $System_Drawing_Size
    $rdbDSdef.Text = "Domain"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 20
    $rdbDSdef.Location = $System_Drawing_Point
    $rdbDSdef.DataBindings.DefaultDataSourceUpdateMode = 0
    $rdbDSdef.Name = "rdbDSdef"
    $rdbDSdef.Checked = $true
    $rdbDSdef.Add_checkedChanged($rdbNC_CheckChanged)


    $gBoxNCSelect.Controls.Add($rdbDSdef)

    $rdbCustomNC.UseVisualStyleBackColor = $True
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 75
    $System_Drawing_Size.Height = 24
    $rdbCustomNC.Size = $System_Drawing_Size
    $rdbCustomNC.Text = "Custom"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 230
    $System_Drawing_Point.Y = 20
    $rdbCustomNC.Location = $System_Drawing_Point
    $rdbCustomNC.DataBindings.DefaultDataSourceUpdateMode = 0
    $rdbCustomNC.Name = "rdbCustomNC"
    $rdbCustomNC.Checked = $false
    $rdbCustomNC.Add_checkedChanged($rdbNC_CheckChanged)


    $gBoxNCSelect.Controls.Add($rdbCustomNC)

    $rdbDSConf.UseVisualStyleBackColor = $True
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 70
    $System_Drawing_Size.Height = 24
    $rdbDSConf.Size = $System_Drawing_Size
    $rdbDSConf.Text = "Config"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 78
    $System_Drawing_Point.Y = 20
    $rdbDSConf.Location = $System_Drawing_Point
    $rdbDSConf.DataBindings.DefaultDataSourceUpdateMode = 0
    $rdbDSConf.Name = "rdbDSConf"
    $rdbDSConf.Checked = $False
    $rdbDSConf.Add_checkedChanged($rdbNC_CheckChanged)

    $gBoxNCSelect.Controls.Add($rdbDSConf)

    $rdbDSSchm.UseVisualStyleBackColor = $True
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 75
    $System_Drawing_Size.Height = 24
    $rdbDSSchm.Size = $System_Drawing_Size
    $rdbDSSchm.Text = "Schema"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 150
    $System_Drawing_Point.Y = 20
    $rdbDSSchm.Location = $System_Drawing_Point
    $rdbDSSchm.DataBindings.DefaultDataSourceUpdateMode = 0
    $rdbDSSchm.Name = "rdbDSSchm"
    $rdbDSSchm.Checked = $False
    $rdbDSSchm.Add_checkedChanged($rdbNC_CheckChanged)

    $gBoxNCSelect.Controls.Add($rdbDSSchm)


    ################################  Scan Options Tab    ################################

    $gBoxReportOpt.Name = "gBoxReportOpt"
    $gBoxReportOpt.Text = "View in report"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 260
    $System_Drawing_Size.Height = 100
    $gBoxReportOpt.Size = $System_Drawing_Size
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 93
    $gBoxReportOpt.Location = $System_Drawing_Point
    $gBoxReportOpt.DataBindings.DefaultDataSourceUpdateMode = 0

    $tabScan.Controls.Add($gBoxReportOpt)

    $gBoxRdbScan.Name = "gBoxRdbScan"
    $gBoxRdbScan.Text = "Objects to scan"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 260
    $System_Drawing_Size.Height = 50
    $gBoxRdbScan.Size = $System_Drawing_Size
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 42
    $gBoxRdbScan.Location = $System_Drawing_Point
    $gBoxRdbScan.DataBindings.DefaultDataSourceUpdateMode = 0

    $tabScan.Controls.Add($gBoxRdbScan)

    $gBoxRdbFile.Name = "gBoxRdbFile"
    $gBoxRdbFile.Text = "Output Options"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 260
    $System_Drawing_Size.Height = 140
    $gBoxRdbFile.Size = $System_Drawing_Size
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 195
    $gBoxRdbFile.Location = $System_Drawing_Point
    $gBoxRdbFile.DataBindings.DefaultDataSourceUpdateMode = 0

    $tabScan.Controls.Add($gBoxRdbFile)

    $rdbBase.UseVisualStyleBackColor = $False
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 75
    $System_Drawing_Size.Height = 24
    $rdbBase.Size = $System_Drawing_Size
    $rdbBase.Text = "Base"
    $rdbBase.Checked = $true
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 13
    $rdbBase.Location = $System_Drawing_Point
    $rdbBase.DataBindings.DefaultDataSourceUpdateMode = 0
    $rdbBase.Name = "rdbBase"


    $gBoxScanDepth.Controls.Add($rdbBase)

    $rdbOneLevel.UseVisualStyleBackColor = $False
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 75
    $System_Drawing_Size.Height = 24
    $rdbOneLevel.Size = $System_Drawing_Size
    $rdbOneLevel.Text = "One Level"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 85
    $System_Drawing_Point.Y = 13
    $rdbOneLevel.Location = $System_Drawing_Point
    $rdbOneLevel.DataBindings.DefaultDataSourceUpdateMode = 0
    $rdbOneLevel.Name = "rdbOneLevel"


    $gBoxScanDepth.Controls.Add($rdbOneLevel)

    $rdbSubtree.UseVisualStyleBackColor = $False
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 75
    $System_Drawing_Size.Height = 24
    $rdbSubtree.Size = $System_Drawing_Size
    $rdbSubtree.Text = "Subtree"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 165
    $System_Drawing_Point.Y = 13
    $rdbSubtree.Location = $System_Drawing_Point
    $rdbSubtree.DataBindings.DefaultDataSourceUpdateMode = 0
    $rdbSubtree.Name = "rdbSubtree"


    $gBoxScanDepth.Controls.Add($rdbSubtree)

    $chkInheritedPerm.UseVisualStyleBackColor = $False
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 145
    $System_Drawing_Size.Height = 24
    $chkInheritedPerm.Size = $System_Drawing_Size
    $chkInheritedPerm.Text = "Inherited Permissions"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 33
    $chkInheritedPerm.Location = $System_Drawing_Point
    $chkInheritedPerm.CheckState = 0
    $chkInheritedPerm.DataBindings.DefaultDataSourceUpdateMode = 0
    $chkInheritedPerm.Name = "chkInheritedPerm"


    $gBoxReportOpt.Controls.Add($chkInheritedPerm)

    $chkBoxGetOwner.UseVisualStyleBackColor = $False
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 104
    $System_Drawing_Size.Height = 24
    $chkBoxGetOwner.Size = $System_Drawing_Size
    $chkBoxGetOwner.Text = "View Owner"
    $chkBoxGetOwner.Checked = $false
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 13
    $chkBoxGetOwner.Location = $System_Drawing_Point
    $chkBoxGetOwner.CheckState = 0
    $chkBoxGetOwner.DataBindings.DefaultDataSourceUpdateMode = 0
    $chkBoxGetOwner.Name = "chkBoxGetOwner"

    $gBoxReportOpt.Controls.Add($chkBoxGetOwner)


    $chkBoxDefaultPerm.UseVisualStyleBackColor = $False
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 149
    $System_Drawing_Size.Height = 24
    $chkBoxDefaultPerm.Size = $System_Drawing_Size
    $chkBoxDefaultPerm.Text = "Skip Default Permissions"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 54
    $chkBoxDefaultPerm.Location = $System_Drawing_Point
    $chkBoxDefaultPerm.DataBindings.DefaultDataSourceUpdateMode = 0
    $chkBoxDefaultPerm.Name = "chkBoxDefaultPerm"

    $gBoxReportOpt.Controls.Add($chkBoxDefaultPerm)


    $chkBoxReplMeta.UseVisualStyleBackColor = $False
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 110
    $System_Drawing_Size.Height = 20
    $chkBoxReplMeta.Size = $System_Drawing_Size
    $chkBoxReplMeta.Text = "SD modified date"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 78
    $chkBoxReplMeta.Location = $System_Drawing_Point
    $chkBoxReplMeta.CheckState = 0
    $chkBoxReplMeta.DataBindings.DefaultDataSourceUpdateMode = 0
    $chkBoxReplMeta.Name = "chkBoxReplMeta"

    $gBoxReportOpt.Controls.Add($chkBoxReplMeta)

    $chkBoxGetOUProtected.UseVisualStyleBackColor = $False
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 90
    $System_Drawing_Size.Height = 29
    $chkBoxGetOUProtected.Size = $System_Drawing_Size
    $chkBoxGetOUProtected.Text = "Inheritance`nDisabled"
    $chkBoxGetOUProtected.TextAlign = "TopLeft"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 155
    $System_Drawing_Point.Y = 33
    $chkBoxGetOUProtected.Location = $System_Drawing_Point
    $chkBoxGetOUProtected.CheckState = 0
    $chkBoxGetOUProtected.CheckAlign = "TopLeft"
    $chkBoxGetOUProtected.DataBindings.DefaultDataSourceUpdateMode = 0
    $chkBoxGetOUProtected.Name = "chkBoxGetOUProtected"

    $gBoxReportOpt.Controls.Add($chkBoxGetOUProtected)

    $chkBoxACLSize.UseVisualStyleBackColor = $False
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 90
    $System_Drawing_Size.Height = 20
    $chkBoxACLSize.Size = $System_Drawing_Size
    $chkBoxACLSize.Text = "DACL Size"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 155
    $System_Drawing_Point.Y = 13
    $chkBoxACLSize.Location = $System_Drawing_Point
    $chkBoxACLSize.CheckState = 0
    $chkBoxACLSize.DataBindings.DefaultDataSourceUpdateMode = 0
    $chkBoxACLSize.Name = "chkBoxACLSize"

    $gBoxReportOpt.Controls.Add($chkBoxACLSize)

    $rdbScanOU.UseVisualStyleBackColor = $True
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 55
    $System_Drawing_Size.Height = 24
    $rdbScanOU.Size = $System_Drawing_Size
    $rdbScanOU.Text = "OUs"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 20
    $rdbScanOU.Location = $System_Drawing_Point
    $rdbScanOU.DataBindings.DefaultDataSourceUpdateMode = 0
    $rdbScanOU.Name = "rdbScanOU"
    $rdbScanOU.Checked = $true

    $gBoxRdbScan.Controls.Add($rdbScanOU)

    $rdbScanContainer.UseVisualStyleBackColor = $True
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 95
    $System_Drawing_Size.Height = 24
    $rdbScanContainer.Size = $System_Drawing_Size
    $rdbScanContainer.Text = "Containers"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 60
    $System_Drawing_Point.Y = 20
    $rdbScanContainer.Location = $System_Drawing_Point
    $rdbScanContainer.DataBindings.DefaultDataSourceUpdateMode = 0
    $rdbScanContainer.Name = "rdbScanContainer"
    $rdbScanContainer.Checked = $false

    $gBoxRdbScan.Controls.Add($rdbScanContainer)

    $rdbScanAll.UseVisualStyleBackColor = $True
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 100
    $System_Drawing_Size.Height = 24
    $rdbScanAll.Size = $System_Drawing_Size
    $rdbScanAll.Text = "All Objects"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 155
    $System_Drawing_Point.Y = 20
    $rdbScanAll.Location = $System_Drawing_Point
    $rdbScanAll.DataBindings.DefaultDataSourceUpdateMode = 0
    $rdbScanAll.Name = "rdbScanAll"

    $gBoxRdbScan.Controls.Add($rdbScanAll)

    $btnGetTemplateFolder.Name = "btnGetTemplateFolder"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 110
    $System_Drawing_Size.Height = 23
    $btnGetTemplateFolder.Size = $System_Drawing_Size
    $btnGetTemplateFolder.UseVisualStyleBackColor = $True
    $btnGetTemplateFolder.Font = $FontSans825B
    $btnGetTemplateFolder.Text = "Change Folder"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 140
    $System_Drawing_Point.Y = 110
    $btnGetTemplateFolder.Location = $System_Drawing_Point
    $btnGetTemplateFolder.DataBindings.DefaultDataSourceUpdateMode = 0
    $btnGetTemplateFolder.add_Click($btnGetTemplateFolder_OnClick)

    $gBoxRdbFile.Controls.Add($btnGetTemplateFolder)

    $btnGetCompareInput.Name = "btnGetCompareInput"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 120
    $System_Drawing_Size.Height = 23
    $btnGetCompareInput.Size = $System_Drawing_Size
    $btnGetCompareInput.UseVisualStyleBackColor = $True
    $btnGetCompareInput.Font = $FontSans825B
    $btnGetCompareInput.Text = "Select Template"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 130
    $System_Drawing_Point.Y = 60
    $btnGetCompareInput.Location = $System_Drawing_Point
    $btnGetCompareInput.DataBindings.DefaultDataSourceUpdateMode = 0
    $btnGetCompareInput.add_Click($btnGetCompareInput_OnClick)

    $gBoxCompare.Controls.Add($btnGetCompareInput)

    $chkBoxTemplateNodes.UseVisualStyleBackColor = $False
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 100
    $System_Drawing_Size.Height = 29
    $chkBoxTemplateNodes.Size = $System_Drawing_Size
    $chkBoxTemplateNodes.Text = "Use nodes from template"
    $chkBoxTemplateNodes.TextAlign = "TopLeft"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 60
    $chkBoxTemplateNodes.Location = $System_Drawing_Point
    $chkBoxTemplateNodes.CheckState = 0
    $chkBoxTemplateNodes.CheckAlign = "TopLeft"
    $chkBoxTemplateNodes.DataBindings.DefaultDataSourceUpdateMode = 0
    $chkBoxTemplateNodes.Name = "chkBoxTemplateNodes"

    $gBoxCompare.Controls.Add($chkBoxTemplateNodes)

    $btnGetCSVFile.Name = "btnGetCSVFile"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 120
    $System_Drawing_Size.Height = 23
    $btnGetCSVFile.Size = $System_Drawing_Size
    $btnGetCSVFile.UseVisualStyleBackColor = $True
    $btnGetCSVFile.Font = $FontSans75B
    $btnGetCSVFile.Text = "Select CSV"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 120
    $System_Drawing_Point.Y = 60
    $btnGetCSVFile.Location = $System_Drawing_Point
    $btnGetCSVFile.DataBindings.DefaultDataSourceUpdateMode = 0
    $btnGetCSVFile.add_Click($btnGetCSVFile_OnClick)

    $gBoxImportCsv.Controls.Add($btnGetCSVFile)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 245
    $System_Drawing_Size.Height = 20
    $txtTempFolder.Size = $System_Drawing_Size
    $txtTempFolder.DataBindings.DefaultDataSourceUpdateMode = 0
    $txtTempFolder.Name = "txtTempFolder"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 85
    $txtTempFolder.Location = $System_Drawing_Point

    $gBoxRdbFile.Controls.Add($txtTempFolder)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 158
    $System_Drawing_Size.Height = 16
    $lblTempFolder.Size = $System_Drawing_Size
    $lblTempFolder.Text = "CSV file destination:"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 70
    $lblTempFolder.Location = $System_Drawing_Point
    $lblTempFolder.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblTempFolder.Name = "lblTempFolder"

    $gBoxRdbFile.Controls.Add($lblTempFolder)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 158
    $System_Drawing_Size.Height = 16
    $lblCompareTemplate.Size = $System_Drawing_Size
    $lblCompareTemplate.Text = "CSV Template File:"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 19
    $lblCompareTemplate.Location = $System_Drawing_Point
    $lblCompareTemplate.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblCompareTemplate.Name = "lblCompareTemplate"

    $gBoxCompare.Controls.Add($lblCompareTemplate)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 220
    $System_Drawing_Size.Height = 20
    $txtCompareTemplate.Size = $System_Drawing_Size
    $txtCompareTemplate.DataBindings.DefaultDataSourceUpdateMode = 0
    $txtCompareTemplate.Name = "txtCompareTemplate"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 35
    $txtCompareTemplate.Location = $System_Drawing_Point

    $gBoxCompare.Controls.Add($txtCompareTemplate)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 220
    $System_Drawing_Size.Height = 20
    $txtCSVImport.Size = $System_Drawing_Size
    $txtCSVImport.DataBindings.DefaultDataSourceUpdateMode = 0
    $txtCSVImport.Name = "txtCSVImport"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 35
    $txtCSVImport.Location = $System_Drawing_Point

    $gBoxImportCSV.Controls.Add($txtCSVImport)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 200
    $System_Drawing_Size.Height = 16
    $lblCSVImport.Size = $System_Drawing_Size
    $lblCSVImport.Text = "This file will be converted HTML:"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 20
    $lblCSVImport.Location = $System_Drawing_Point
    $lblCSVImport.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblCSVImport.Name = "lblCSVImport"

    $gBoxImportCSV.Controls.Add($lblCSVImport)

    $rdbOnlyHTA.UseVisualStyleBackColor = $True
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 101
    $System_Drawing_Size.Height = 24
    $rdbOnlyHTA.Size = $System_Drawing_Size
    $rdbOnlyHTA.Text = "HTML report"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 20
    $rdbOnlyHTA.Location = $System_Drawing_Point
    $rdbOnlyHTA.DataBindings.DefaultDataSourceUpdateMode = 1
    $rdbOnlyHTA.Name = "rdbOnlyHTA"
    $rdbOnlyHTA.Checked = $true

    $gBoxRdbFile.Controls.Add($rdbOnlyHTA)

    $rdbHTAandCSV.UseVisualStyleBackColor = $True
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 150
    $System_Drawing_Size.Height = 40
    $rdbHTAandCSV.Size = $System_Drawing_Size
    $rdbHTAandCSV.Text = "HTML report and CSV file"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 104
    $System_Drawing_Point.Y = 12
    $rdbHTAandCSV.Location = $System_Drawing_Point
    $rdbHTAandCSV.DataBindings.DefaultDataSourceUpdateMode = 1
    $rdbHTAandCSV.Name = "rdbHTAandCSV"

    $gBoxRdbFile.Controls.Add($rdbHTAandCSV)

    $rdbOnlyCSV.UseVisualStyleBackColor = $True
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 97
    $System_Drawing_Size.Height = 24
    $rdbOnlyCSV.Size = $System_Drawing_Size
    $rdbOnlyCSV.Text = "CSV file"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 40
    $rdbOnlyCSV.Location = $System_Drawing_Point
    $rdbOnlyCSV.DataBindings.DefaultDataSourceUpdateMode = 1
    $rdbOnlyCSV.Name = "rdbOnlyCSV"
    $rdbOnlyCSV.Checked = $false

    $gBoxRdbFile.Controls.Add($rdbOnlyCSV)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 200
    $System_Drawing_Size.Height = 17
    $lblDomain.Size = $System_Drawing_Size
    $lblDomain.Text = "Naming Context:"
    $lblDomain.ForeColor = [System.Drawing.Color]::FromArgb(0, 0, 0, 0)
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 48
    $lblDomain.Location = $System_Drawing_Point
    $lblDomain.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblDomain.Name = "lblDomain"

    $gBoxNCSelect.Controls.Add($lblDomain)

    $txtBoxDomainConnect.Enabled = $false
    $txtBoxDomainConnect.Text = $global:strDommainSelect
    $txtBoxDomainConnect.TabStop = $false
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 280
    $System_Drawing_Size.Height = 20
    $txtBoxDomainConnect.Size = $System_Drawing_Size
    $txtBoxDomainConnect.DataBindings.DefaultDataSourceUpdateMode = 0
    $txtBoxDomainConnect.Name = "txtBoxDomainConnect"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 65
    $txtBoxDomainConnect.Location = $System_Drawing_Point

    $gBoxNCSelect.Controls.Add($txtBoxDomainConnect)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 225
    $System_Drawing_Size.Height = 28
    $lblConnect.Size = $System_Drawing_Size
    $lblConnect.Font = $FontSans775
    $lblConnect.Text = "First click Connect to connect to a domain."
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 80
    $System_Drawing_Point.Y = 90
    $lblConnect.Location = $System_Drawing_Point
    $lblConnect.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblConnect.Name = "lblConnect"

    $btnDSConnect.TabIndex = 1
    $btnDSConnect.Name = "btnDSConnect"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 85
    $System_Drawing_Size.Height = 23
    $btnDSConnect.Size = $System_Drawing_Size
    $btnDSConnect.UseVisualStyleBackColor = $True
    $btnDSConnect.Font = $FontSans825B
    $btnDSConnect.Text = "Connect"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 90
    $btnDSConnect.Location = $System_Drawing_Point
    $btnDSConnect.DataBindings.DefaultDataSourceUpdateMode = 0
    $btnDSConnect.add_Click($btnDSConnect_OnClick)


    $gBoxNCSelect.Controls.Add($btnDSConnect)


    $btnListDdomain.TabIndex = 1
    $btnListDdomain.Name = "btnListDdomain"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 100
    $System_Drawing_Size.Height = 23
    $btnListDdomain.Size = $System_Drawing_Size
    $btnListDdomain.UseVisualStyleBackColor = $True
    $btnListDdomain.Font = $FontSans825B
    $btnListDdomain.Text = "List Domains"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 95
    $System_Drawing_Point.Y = 90
    $btnListDdomain.Location = $System_Drawing_Point
    $btnListDdomain.DataBindings.DefaultDataSourceUpdateMode = 0
    $btnListDdomain.add_Click($btnListDdomain_OnClick)


    $gBoxNCSelect.Controls.Add($btnListDdomain)





    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 550
    $System_Drawing_Size.Height = 20
    $txtBoxSelected.Size = $System_Drawing_Size
    $txtBoxSelected.DataBindings.DefaultDataSourceUpdateMode = 0
    $txtBoxSelected.Name = "txtBoxSelected"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 25
    $System_Drawing_Point.Y = 590
    $txtBoxSelected.Location = $System_Drawing_Point

    $form1.Controls.Add($txtBoxSelected)


    $gBoxBrowse.Name = "gBoxBrowse"
    $gBoxBrowse.Text = "Browse Options"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 310
    $System_Drawing_Size.Height = 51
    $gBoxBrowse.Size = $System_Drawing_Size
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 25
    $System_Drawing_Point.Y = 160
    $gBoxBrowse.Location = $System_Drawing_Point
    $gBoxBrowse.DataBindings.DefaultDataSourceUpdateMode = 0

    $form1.Controls.Add($gBoxBrowse)

    $rdbBrowseAll.Name = "rdbBrowseAll"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 98
    $System_Drawing_Size.Height = 24
    $rdbBrowseAll.Size = $System_Drawing_Size
    $rdbBrowseAll.UseVisualStyleBackColor = $True

    $rdbBrowseAll.Text = "All Objects"

    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 68
    $System_Drawing_Point.Y = 19
    $rdbBrowseAll.Location = $System_Drawing_Point
    $rdbBrowseAll.DataBindings.DefaultDataSourceUpdateMode = 0


    $gBoxBrowse.Controls.Add($rdbBrowseAll)


    $rdbBrowseOU.Name = "rdbBrowseOU"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 104
    $System_Drawing_Size.Height = 24
    $rdbBrowseOU.Size = $System_Drawing_Size
    $rdbBrowseOU.UseVisualStyleBackColor = $True

    $rdbBrowseOU.Text = "OU''s"
    $rdbBrowseOU.Checked = $true

    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 6
    $System_Drawing_Point.Y = 19
    $rdbBrowseOU.Location = $System_Drawing_Point
    $rdbBrowseOU.DataBindings.DefaultDataSourceUpdateMode = 0

    $gBoxBrowse.Controls.Add($rdbBrowseOU)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 200
    $System_Drawing_Size.Height = 90
    $lblRunScan.Size = $System_Drawing_Size
    $lblRunScan.Font = $FontSans9B
    $lblRunScan.Text = "1.Select a naming context.`n2.Connect to a naming context.`n3.Select a node.`n4.Press Run Scan."
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 340
    $System_Drawing_Point.Y = 525
    $lblRunScan.Location = $System_Drawing_Point
    $lblRunScan.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblRunScan.Name = "lblRunScan"

    $Form1.Controls.Add($lblRunScan)

    $btnScan.TabIndex = 2
    $btnScan.Name = "btnScan"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 85
    $System_Drawing_Size.Height = 23
    $btnScan.Size = $System_Drawing_Size
    $btnScan.UseVisualStyleBackColor = $True
    $btnScan.Font = $FontSans825B
    $btnScan.Text = "Run Scan"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 590
    $System_Drawing_Point.Y = 540
    $btnScan.Location = $System_Drawing_Point
    $btnScan.DataBindings.DefaultDataSourceUpdateMode = 0
    $btnScan.add_Click($btnScan_OnClick)

    $Form1.Controls.Add($btnScan)

    $btnCompare.Name = "btnCompare"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 120
    $System_Drawing_Size.Height = 23
    $btnCompare.Size = $System_Drawing_Size
    $btnCompare.UseVisualStyleBackColor = $True
    $btnCompare.Font = $FontSans825B
    $btnCompare.Text = "Run Compare"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 130
    $System_Drawing_Point.Y = 90
    $btnCompare.Location = $System_Drawing_Point
    $btnCompare.DataBindings.DefaultDataSourceUpdateMode = 0
    $btnCompare.add_Click($btnCompare_OnClick)

    $gBoxCompare.Controls.Add($btnCompare)

    $btnConvertCSV.Name = "btnConvertCSV"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 125
    $System_Drawing_Size.Height = 23
    $btnConvertCSV.Size = $System_Drawing_Size
    $btnConvertCSV.UseVisualStyleBackColor = $True
    $btnConvertCSV.Font = $FontSans75B
    $btnConvertCSV.Text = "Create HTML View"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 120
    $System_Drawing_Point.Y = 90
    $btnConvertCSV.Location = $System_Drawing_Point
    $btnConvertCSV.DataBindings.DefaultDataSourceUpdateMode = 0
    $btnConvertCSV.add_Click($btnCreateHTML)

    $gBoxImportCSV.Controls.Add($btnConvertCSV)

    $lblHeaderInfo.BackColor = [System.Drawing.Color]::FromArgb(255, 0, 0, 0)
    $lblHeaderInfo.ForeColor = 'White'
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 500
    $System_Drawing_Size.Height = 20
    $lblHeaderInfo.Size = $System_Drawing_Size
    $lblHeaderInfo.Font = $FontSans9
    $lblHeaderInfo.Text = "A Tool To Create Reports of Access Control Lists In Active Directory"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 380
    $System_Drawing_Point.Y = 18
    $lblHeaderInfo.Location = $System_Drawing_Point
    $lblHeaderInfo.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblHeaderInfo.Name = "lblRunScan"

    $Form1.Controls.Add($lblHeaderInfo)

    $lblHeader.BackColor = [System.Drawing.Color]::FromArgb(255, 0, 0, 0)
    $lblHeader.ForeColor = 'White'
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 910
    $System_Drawing_Size.Height = 38
    $lblHeader.Size = $System_Drawing_Size
    $lblHeader.Text = "AD ACL Scanner"
    $lblHeader.Font = New-Object System.Drawing.Font("Microsoft Sans Serif", 18, 1, 3, 1)
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 0
    $System_Drawing_Point.Y = 0
    $lblHeader.Location = $System_Drawing_Point
    $lblHeader.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblHeader.Name = "lblHeader"

    $form1.Controls.Add($lblHeader)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 309
    $System_Drawing_Size.Height = 355
    $treeView1.Size = $System_Drawing_Size
    $treeView1.Name = "treeView1"
    $treeView1.BackColor = [System.Drawing.Color]::FromArgb(255, 255, 255, 255)
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 25
    $System_Drawing_Point.Y = 220
    $treeView1.Location = $System_Drawing_Point
    $treeView1.DataBindings.DefaultDataSourceUpdateMode = 0

    $form1.Controls.Add($treeView1)

    $TextBoxStatusMessage.BackColor = [System.Drawing.Color]::FromArgb(255, 255, 255, 255)
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 550
    $System_Drawing_Size.Height = 78
    $TextBoxStatusMessage.Size = $System_Drawing_Size
    $TextBoxStatusMessage.Items.Insert(0, "Not Connected")
    $TextBoxStatusMessage.Font = $FontSans9B
    $TextBoxStatusMessage.ForeColor = [System.Drawing.Color]::FromArgb(0, 0, 0, 0)
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 25
    $System_Drawing_Point.Y = 630
    $TextBoxStatusMessage.Location = $System_Drawing_Point
    $TextBoxStatusMessage.DataBindings.DefaultDataSourceUpdateMode = 0
    $TextBoxStatusMessage.Name = "TextBoxStatusMessage"

    $form1.Controls.Add($TextBoxStatusMessage)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 158
    $System_Drawing_Size.Height = 16
    $lblSelectedNode.Size = $System_Drawing_Size
    $lblSelectedNode.Text = "Selected Object:"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 25
    $System_Drawing_Point.Y = 575
    $lblSelectedNode.Location = $System_Drawing_Point
    $lblSelectedNode.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblSelectedNode.Name = "lblSelectedNode"

    $form1.Controls.Add($lblSelectedNode)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 158
    $System_Drawing_Size.Height = 16
    $lblStatusBar.Size = $System_Drawing_Size
    $lblStatusBar.Text = "Status Message:"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 25
    $System_Drawing_Point.Y = 615
    $lblStatusBar.Location = $System_Drawing_Point
    $lblStatusBar.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblStatusBar.Name = "lblStatusBar"

    $form1.Controls.Add($lblStatusBar)

    $btnExit.TabIndex = 3
    $btnExit.Name = "btnExit"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 75
    $System_Drawing_Size.Height = 23
    $btnExit.Size = $System_Drawing_Size
    $btnExit.UseVisualStyleBackColor = $True
    $btnExit.Font = $FontSans825B
    $btnExit.Text = "Exit"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 730
    $System_Drawing_Point.Y = 540
    $btnExit.Location = $System_Drawing_Point
    $btnExit.DataBindings.DefaultDataSourceUpdateMode = 0
    $btnExit.add_Click($btnExit_OnClick)

    $form1.Controls.Add($btnExit)

    ################################ Effective Rights Tab ################################

    $chkBoxEffectiveRights.UseVisualStyleBackColor = $False
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 200
    $System_Drawing_Size.Height = 30
    $chkBoxEffectiveRights.Size = $System_Drawing_Size
    $chkBoxEffectiveRights.Text = "Enable Effective Rights"
    $chkBoxEffectiveRights.Checked = $false
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 9
    $chkBoxEffectiveRights.Location = $System_Drawing_Point
    $chkBoxEffectiveRights.CheckState = 0
    $chkBoxEffectiveRights.DataBindings.DefaultDataSourceUpdateMode = 0
    $chkBoxEffectiveRights.Name = "chkBoxEffectiveRights"
    $chkBoxEffectiveRights.Add_checkedChanged($chkBoxEffectiveRights_CheckChanged)

    $tabEffectiveR.Controls.Add($chkBoxEffectiveRights)

    $chkBoxEffectiveRightsColor.UseVisualStyleBackColor = $False
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 200
    $System_Drawing_Size.Height = 30
    $chkBoxEffectiveRightsColor.Size = $System_Drawing_Size
    $chkBoxEffectiveRightsColor.Text = "Show color coded criticallity"
    $chkBoxEffectiveRightsColor.Checked = $false
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 285
    $chkBoxEffectiveRightsColor.Location = $System_Drawing_Point
    $chkBoxEffectiveRightsColor.CheckState = 0
    $chkBoxEffectiveRightsColor.DataBindings.DefaultDataSourceUpdateMode = 0
    $chkBoxEffectiveRightsColor.Name = "chkBoxEffectiveRightsColor"
    $chkBoxEffectiveRightsColor.Enabled = $false

    $tabEffectiveR.Controls.Add($chkBoxEffectiveRightsColor)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 250
    $System_Drawing_Size.Height = 45
    $lblEffectiveRightsColor.Size = $System_Drawing_Size
    $lblEffectiveDescText.Font = $FontSans825
    $lblEffectiveRightsColor.Text = "Use colors in report to identify criticality level of permissions.This might help you in implementing Least-Privilege Administrative Models"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 315
    $lblEffectiveRightsColor.Location = $System_Drawing_Point
    $lblEffectiveRightsColor.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblEffectiveRightsColor.Name = "lblEffectiveRightsColor"

    $tabEffectiveR.Controls.Add($lblEffectiveRightsColor)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 250
    $System_Drawing_Size.Height = 55
    $lblEffectiveDescText.Size = $System_Drawing_Size
    $lblEffectiveDescText.Font = $FontSans825
    $lblEffectiveDescText.Text = "Effective Access allows you to view the effective permissions for a user, group, or device account."
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 40
    $lblEffectiveDescText.Location = $System_Drawing_Point
    $lblEffectiveDescText.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblEffectiveDescText.Name = "lblEffectiveDescText"

    $tabEffectiveR.Controls.Add($lblEffectiveDescText)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 250
    $System_Drawing_Size.Height = 30
    $lblEffectiveText.Size = $System_Drawing_Size
    $lblEffectiveText.Font = $FontSans825
    $lblEffectiveText.Text = "Type the account name (samAccountName) for a user, group or computer:"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 100
    $lblEffectiveText.Location = $System_Drawing_Point
    $lblEffectiveText.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblEffectiveText.Name = "lblEffectiveText"

    $tabEffectiveR.Controls.Add($lblEffectiveText)

    $btnGetSPAccount.TabIndex = 9
    $btnGetSPAccount.Name = "btnGetSPAccount"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 95
    $System_Drawing_Size.Height = 23
    $btnGetSPAccount.Size = $System_Drawing_Size
    $btnGetSPAccount.UseVisualStyleBackColor = $True
    $btnGetSPAccount.Font = $FontSans825B
    $btnGetSPAccount.Text = "Get Account"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 175
    $btnGetSPAccount.Location = $System_Drawing_Point
    $btnGetSPAccount.DataBindings.DefaultDataSourceUpdateMode = 0
    $btnGetSPAccount.Enabled = $false
    $btnGetSPAccount.add_Click($btnGetSPAccount_OnClick)

    $tabEffectiveR.Controls.Add($btnGetSPAccount)

    $btnGetSPNReport.TabIndex = 10
    $btnGetSPNReport.Name = "btnGetSPNReport"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 130
    $System_Drawing_Size.Height = 23
    $btnGetSPNReport.Size = $System_Drawing_Size
    $btnGetSPNReport.UseVisualStyleBackColor = $True
    $btnGetSPNReport.Font = $FontSans825B
    $btnGetSPNReport.Text = "View Account"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 260
    $btnGetSPNReport.Location = $System_Drawing_Point
    $btnGetSPNReport.DataBindings.DefaultDataSourceUpdateMode = 0
    $btnGetSPNReport.Enabled = $false
    $btnGetSPNReport.add_Click($btnGetSPNReport_OnClick)

    $tabEffectiveR.Controls.Add($btnGetSPNReport)

    $btnViewLegend.TabIndex = 10
    $btnViewLegend.Name = "btnViewLegend"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 130
    $System_Drawing_Size.Height = 23
    $btnViewLegend.Size = $System_Drawing_Size
    $btnViewLegend.UseVisualStyleBackColor = $True
    $btnViewLegend.Font = $FontSans825B
    $btnViewLegend.Text = "View Color Legend"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 360
    $btnViewLegend.Location = $System_Drawing_Point
    $btnViewLegend.DataBindings.DefaultDataSourceUpdateMode = 0
    $btnViewLegend.Enabled = $false
    $btnViewLegend.add_Click($btnViewLegened_OnClick)

    $tabEffectiveR.Controls.Add($btnViewLegend)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 110
    $System_Drawing_Size.Height = 20
    $lblSelectPrincipalDom.Size = $System_Drawing_Size
    $lblSelectPrincipalDom.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblSelectPrincipalDom.Name = "lblSelectPrincipalDom"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 130
    $lblSelectPrincipalDom.Location = $System_Drawing_Point
    $lblSelectPrincipalDom.Enabled = $true
    $lblSelectPrincipalDom.TextAlign = "MiddleLeft"
    $lblSelectPrincipalDom.Font = $FontSans75B
    $lblSelectPrincipalDom.text = ":"

    $tabEffectiveR.Controls.Add($lblSelectPrincipalDom)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 210
    $System_Drawing_Size.Height = 20
    $txtBoxSelectPrincipal.Size = $System_Drawing_Size
    $txtBoxSelectPrincipal.DataBindings.DefaultDataSourceUpdateMode = 0
    $txtBoxSelectPrincipal.Name = "txtBoxSelectPrincipal"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 9
    $System_Drawing_Point.Y = 150
    $txtBoxSelectPrincipal.Location = $System_Drawing_Point
    $txtBoxSelectPrincipal.Enabled = $false
    $tabEffectiveR.Controls.Add($txtBoxSelectPrincipal)


    $gBoxEffectiveSelUser.TabIndex = 0
    $gBoxEffectiveSelUser.Name = "gBoxEffectiveSelUser"
    $gBoxEffectiveSelUser.Text = "Selected Security Principal:"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 270
    $System_Drawing_Size.Height = 45
    $gBoxEffectiveSelUser.Size = $System_Drawing_Size
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 210
    $gBoxEffectiveSelUser.Location = $System_Drawing_Point
    $gBoxEffectiveSelUser.DataBindings.DefaultDataSourceUpdateMode = 0

    $tabEffectiveR.Controls.Add($gBoxEffectiveSelUser)

    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 250
    $System_Drawing_Size.Height = 25
    $lblEffectiveSelUser.Size = $System_Drawing_Size
    $lblEffectiveSelUser.Font = $FontSans825B
    $lblEffectiveSelUser.Text = ""
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 3
    $System_Drawing_Point.Y = 15
    $lblEffectiveSelUser.Location = $System_Drawing_Point
    $lblEffectiveSelUser.DataBindings.DefaultDataSourceUpdateMode = 0
    $lblEffectiveSelUser.Name = "lblEffectiveSelUser"

    $gBoxEffectiveSelUser.Controls.Add($lblEffectiveSelUser)


    $btnListLocations.TabIndex = 1
    $btnListLocations.Name = "btnListLocations"
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 100
    $System_Drawing_Size.Height = 23
    $btnListLocations.Size = $System_Drawing_Size
    $btnListLocations.UseVisualStyleBackColor = $True
    $btnListLocations.Font = $FontSans825B
    $btnListLocations.Text = "Locations..."
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 120
    $System_Drawing_Point.Y = 175
    $btnListLocations.Location = $System_Drawing_Point
    $btnListLocations.Enabled = $false
    $btnListLocations.DataBindings.DefaultDataSourceUpdateMode = 0
    $btnListLocations.add_Click($btnListLocations_OnClick)


    $tabEffectiveR.Controls.Add($btnListLocations)

    ################################ Effective Rights Tab ################################

    #endregion Generated Form Code

    #Save the initial state of the form
    $InitialFormWindowState = $form1.WindowState
    #Init the OnLoad event to correct the initial state of the form
    $form1.add_Load($OnLoadForm_StateCorrection)
    #Show the Form
    $form1.ShowDialog() | Out-Null

} #End Function

#==========================================================================
# Function		: ConvertTo-ObjectArrayListFromPsCustomObject
# Arguments     : Defined Object
# Returns   	: Custom Object List
# Description   : Convert a defined object to a custom, this will help you  if you got a read-only object
#
#==========================================================================
function ConvertTo-ObjectArrayListFromPsCustomObject {
    param (
        [Parameter(
            Position = 0,
            Mandatory = $true,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true
        )] $psCustomObject
    );

    process {

        $myCustomArray = New-Object System.Collections.ArrayList

        foreach ($myPsObject in $psCustomObject) {
            $hashTable = @{};
            $myPsObject | Get-Member -MemberType *Property | ForEach-Object {
                $hashTable.($_.name) = $myPsObject.($_.name);
            }
            $Newobject = new-object psobject -Property  $hashTable
            [void]$myCustomArray.add($Newobject)
        }
        return $myCustomArray
    }
}
#==========================================================================
# Function		: GetDomainController
# Arguments     : Domain FQDN,bol using creds, PSCredential
# Returns   	: Domain Controller
# Description   : Locate a domain controller in a specified domain
#==========================================================================
Function GetDomainController {
    Param([string] $strDomainFQDN,
        [bool] $bolCreds,
        [parameter(Mandatory = $false)]
        [System.Management.Automation.PSCredential] $Creds)

    $strDomainController = ""

    if ($bolCreds -eq $true) {

        $Context = New-Object DirectoryServices.ActiveDirectory.DirectoryContext("Domain", $strDomainFQDN, $Creds.UserName, $Creds.GetNetworkCredential().Password)
        $ojbDomain = [DirectoryServices.ActiveDirectory.Domain]::GetDomain($Context)
        $strDomainController = $($ojbDomain.FindDomainController()).name
    }
    else {

        $Context = New-Object DirectoryServices.ActiveDirectory.DirectoryContext("Domain", $strDomainFQDN )
        $ojbDomain = [DirectoryServices.ActiveDirectory.Domain]::GetDomain($Context)
        $strDomainController = $($ojbDomain.FindDomainController()).name
    }

    return $strDomainController

}
#==========================================================================
# Function		: GenerateDomainPicker
# Arguments     : -
# Returns   	: Domain DistinguishedName
# Description   : Windows Form List AD Domains in Forest
#==========================================================================
Function GenerateDomainPicker {
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

    $objForm = New-Object System.Windows.Forms.Form
    $objForm.Text = "Select a Domain"
    $objForm.Size = New-Object System.Drawing.Size(400, 200)
    $objForm.StartPosition = "CenterScreen"

    $objForm.KeyPreview = $True
    $objForm.Add_KeyDown( { if ($_.KeyCode -eq "Enter")
            { $x = $objListBoxDomainList.SelectedItem; $objForm.Close() } })
    $objForm.Add_KeyDown( { if ($_.KeyCode -eq "Escape")
            { $objForm.Close() } })

    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(75, 120)
    $OKButton.Size = New-Object System.Drawing.Size(75, 23)
    $OKButton.Text = "OK"
    $OKButton.Add_Click( { $global:strDommainSelect = $objListBoxDomainList.SelectedItem; $objForm.Close() })
    $objForm.Controls.Add($OKButton)

    $CancelButton = New-Object System.Windows.Forms.Button
    $CancelButton.Location = New-Object System.Drawing.Size(150, 120)
    $CancelButton.Size = New-Object System.Drawing.Size(75, 23)
    $CancelButton.Text = "Cancel"
    $CancelButton.Add_Click( { $objForm.Close() })
    $objForm.Controls.Add($CancelButton)

    $objLabel = New-Object System.Windows.Forms.Label
    $objLabel.Location = New-Object System.Drawing.Size(10, 20)
    $objLabel.Size = New-Object System.Drawing.Size(300, 20)
    $objLabel.Text = "Please select a domain:"
    $objForm.Controls.Add($objLabel)

    $objListBoxDomainList = New-Object System.Windows.Forms.ListBox
    $objListBoxDomainList.Location = New-Object System.Drawing.Size(10, 40)
    $objListBoxDomainList.Size = New-Object System.Drawing.Size(300, 20)
    $objListBoxDomainList.Height = 80


    $Config = ([adsi]"LDAP://rootdse").ConfigurationNamingContext
    $dse = [adsi]"LDAP://CN=Partitions,$config"

    $searcher = new-object System.DirectoryServices.DirectorySearcher($dse)
    [void]$searcher.PropertiesToLoad.("cn", "name", "trustParent", "nETBIOSName", "nCName")
    $searcher.filter = "(&(cn=*))"
    $colResults = $searcher.FindAll()
    $intCounter = 0

   	foreach ($objResult in $colResults) {
        $objExtendedRightsObject = $objResult.Properties
        if ( $objExtendedRightsObject.item("systemflags") -eq 3) {
            $strNetbios = $($objExtendedRightsObject.item("nETBIOSName"))
            $strDN = $($objExtendedRightsObject.item("nCName"))
            [void] $objListBoxDomainList.Items.Add($strDN)
        }
    }

    $objForm.Controls.Add($objListBoxDomainList)

    $objForm.Topmost = $True

    $objForm.Add_Shown( { $objForm.Activate() })
    [void] $objForm.ShowDialog()


}

#==========================================================================
# Function		: GenerateTrustedDomainPicker
# Arguments     : -
# Returns   	: Trusted Domain DistinguishedName
# Description   : Windows Form List AD Domains trusted by this Domain
#==========================================================================
Function GenerateTrustedDomainPicker {
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

    $global:strPrinDomDir = ""

    $objForm = New-Object System.Windows.Forms.Form
    $objForm.Text = "Locations"
    $objForm.Size = New-Object System.Drawing.Size(400, 200)
    $objForm.StartPosition = "CenterScreen"

    $objForm.KeyPreview = $True
    $objForm.Add_KeyDown( { if ($_.KeyCode -eq "Enter")
            { $x = $objListBoxDomainList.SelectedItem; $objForm.Close() } })
    $objForm.Add_KeyDown( { if ($_.KeyCode -eq "Escape")
            { $objForm.Close() } })

    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(75, 120)
    $OKButton.Size = New-Object System.Drawing.Size(75, 23)
    $OKButton.Text = "OK"
    $OKButton.Add_Click( {
            $global:strDomainPrinDNName = $objListBoxDomainList.SelectedItem

            if ( $global:strDomainPrinDNName -eq $global:strDomainLongName ) {
                $lblSelectPrincipalDom.text = $global:strDomainShortName + ":"
            }
            else {
                $dse = ([adsi]"LDAP://$global:strDC/CN=System,$global:strDomainDNName")


                $searcher = new-object System.DirectoryServices.DirectorySearcher($dse)
                [void]$searcher.PropertiesToLoad.("cn", "name", "trustParent", "nETBIOSName", "nCName")
                $searcher.filter = "(&(trustPartner=$global:strDomainPrinDNName))"
                $colResults = $searcher.FindOne()
                $intCounter = 0

                if ($colResults) {
                    $objExtendedRightsObject = $colResults.Properties
                    $global:strPrinDomDir = $objExtendedRightsObject.item("trustDirection")
                    $global:strPrinDomAttr = "{0:X2}" -f [int]  $objExtendedRightsObject.item("trustAttributes")[0]
                    $global:strPrinDomFlat = $objExtendedRightsObject.item("flatname")
                    $lblSelectPrincipalDom.text = $global:strPrinDomFlat + ":"
                }
            }
            $objForm.Close() })
    $objForm.Controls.Add($OKButton)

    $CancelButton = New-Object System.Windows.Forms.Button
    $CancelButton.Location = New-Object System.Drawing.Size(150, 120)
    $CancelButton.Size = New-Object System.Drawing.Size(75, 23)
    $CancelButton.Text = "Cancel"
    $CancelButton.Add_Click( { $objForm.Close() })
    $objForm.Controls.Add($CancelButton)

    $objLabel = New-Object System.Windows.Forms.Label
    $objLabel.Location = New-Object System.Drawing.Size(10, 20)
    $objLabel.Size = New-Object System.Drawing.Size(300, 20)
    $objLabel.Text = "Select the location you want to search."
    $objForm.Controls.Add($objLabel)

    $objListBoxDomainList = New-Object System.Windows.Forms.ListBox
    $objListBoxDomainList.Location = New-Object System.Drawing.Size(10, 40)
    $objListBoxDomainList.Size = New-Object System.Drawing.Size(300, 20)
    $objListBoxDomainList.Height = 80



    $dse = ([adsi]"LDAP://$global:strDC/CN=System,$global:strDomainDNName")


    $searcher = new-object System.DirectoryServices.DirectorySearcher($dse)
    [void]$searcher.PropertiesToLoad.("cn", "name", "trustParent", "nETBIOSName", "nCName")
    $searcher.filter = "(&(cn=*))"
    $colResults = $searcher.FindAll()
    $intCounter = 0

   	foreach ($objResult in $colResults) {
        $objExtendedRightsObject = $objResult.Properties
        if ( $objExtendedRightsObject.item("trustDirection") -gt 1) {
            $strNetbios = $($objExtendedRightsObject.item("flatName"))
            $strDN = $($objExtendedRightsObject.item("trustPartner"))
            [void] $objListBoxDomainList.Items.Add($strDN)
        }
    }
    [void] $objListBoxDomainList.Items.Add($global:strDomainLongName)
    $objForm.Controls.Add($objListBoxDomainList)

    $objForm.Topmost = $True

    $objForm.Add_Shown( { $objForm.Activate() })
    [void] $objForm.ShowDialog()


}

Function BuildSchemaDic {
    $global:dicSchemaIDGUIDs = @{"BF967ABA-0DE6-11D0-A285-00AA003049E2" = "user"; `
            "BF967A86-0DE6-11D0-A285-00AA003049E2"                      = "computer"; `
            "BF967A9C-0DE6-11D0-A285-00AA003049E2"                      = "group"; `
            "BF967ABB-0DE6-11D0-A285-00AA003049E2"                      = "volume"; `
            "F30E3BBE-9FF0-11D1-B603-0000F80367C1"                      = "gPLink"; `
            "F30E3BBF-9FF0-11D1-B603-0000F80367C1"                      = "gPOptions"; `
            "BF967AA8-0DE6-11D0-A285-00AA003049E2"                      = "printQueue"; `
            "4828CC14-1437-45BC-9B07-AD6F015E5F28"                      = "inetOrgPerson"; `
            "5CB41ED0-0E4C-11D0-A286-00AA003049E2"                      = "contact"; `
            "BF967AA5-0DE6-11D0-A285-00AA003049E2"                      = "organizationalUnit"; `
            "BF967A0A-0DE6-11D0-A285-00AA003049E2"                      = "pwdLastSet"
    }
    $global:dicSpecialIdentities = @{"S-1-0" = "Null Authority"; `
            "S-1-0-0"                        = "Nobody"; `
            "S-1-1"                          = "World Authority"; `
            "S-1-1-0"                        = "Everyone"; `
            "S-1-2"                          = "Local Authority"; `
            "S-1-2-0"                        = "Local "; `
            "S-1-2-1"                        = "Console Logon "; `
            "S-1-3"                          = "Creator Authority"; `
            "S-1-3-0"                        = "Creator Owner"; `
            "S-1-3-1"                        = "Creator Group"; `
            "S-1-3-2"                        = "Creator Owner Server"; `
            "S-1-3-3"                        = "Creator Group Server"; `
            "S-1-3-4"                        = "Owner Rights"; `
            "S-1-4"                          = "Non-unique Authority"; `
            "S-1-5"                          = "NT Authority"; `
            "S-1-5-1"                        = "Dialup"; `
            "S-1-5-2"                        = "Network"; `
            "S-1-5-3"                        = "Batch"; `
            "S-1-5-4"                        = "Interactive"; `
            "S-1-5-6"                        = "Service"; `
            "S-1-5-7"                        = "Anonymous"; `
            "S-1-5-8"                        = "Proxy"; `
            "S-1-5-9"                        = "Enterprise Domain Controllers"; `
            "S-1-5-10"                       = "Principal Self"; `
            "S-1-5-11"                       = "Authenticated Users"; `
            "S-1-5-12"                       = "Restricted Code"; `
            "S-1-5-13"                       = "Terminal Server Users"; `
            "S-1-5-14"                       = "Remote Interactive Logon"; `
            "S-1-5-15"                       = "This Organization"; `
            "S-1-5-17"                       = "IUSR"; `
            "S-1-5-18"                       = "Local System"
    }

    $global:dicNameToSchemaIDGUIDs = @{"user" = "BF967ABA-0DE6-11D0-A285-00AA003049E2"; `
            "computer"                        = "BF967A86-0DE6-11D0-A285-00AA003049E2"; `
            "group"                           = "BF967A9C-0DE6-11D0-A285-00AA003049E2"; `
            "volume"                          = "BF967ABB-0DE6-11D0-A285-00AA003049E2"; `
            "gPLink"                          = "F30E3BBE-9FF0-11D1-B603-0000F80367C1"; `
            "gPOptions"                       = "F30E3BBF-9FF0-11D1-B603-0000F80367C1"; `
            "printQueue"                      = "BF967AA8-0DE6-11D0-A285-00AA003049E2"; `
            "inetOrgPerson"                   = "4828CC14-1437-45BC-9B07-AD6F015E5F28"; `
            "contact"                         = "5CB41ED0-0E4C-11D0-A286-00AA003049E2"; `
            "organizationalUnit"              = "BF967AA5-0DE6-11D0-A285-00AA003049E2"; `
            "pwdLastSet"                      = "BF967A0A-0DE6-11D0-A285-00AA003049E2"
    }
}
BuildSchemaDic
$global:dicRightsGuids = @{"Seed" = "xxx" }
$global:dicSidToName = @{"Seed" = "xxx" }
$global:dicDCSpecialSids = @{"BUILTIN\Incoming Forest Trust Builders" = "S-1-5-32-557"; `
        "BUILTIN\Account Operators"                                   = "S-1-5-32-548"; `
        "BUILTIN\Server Operators"                                    = "S-1-5-32-549"; `
        "BUILTIN\Pre-Windows 2000 Compatible Access"                  = "S-1-5-32-554"; `
        "BUILTIN\Terminal Server License Servers"                     = "S-1-5-32-561"; `
        "BUILTIN\Windows Authorization Access Group"                  = "S-1-5-32-560"
}
$global:dicWellKnownSids = @{"S-1-0" = "Null Authority"; `
        "S-1-0-0"                    = "Nobody"; `
        "S-1-1"                      = "World Authority"; `
        "S-1-1-0"                    = "Everyone"; `
        "S-1-2"                      = "Local Authority"; `
        "S-1-2-0"                    = "Local "; `
        "S-1-2-1"                    = "Console Logon "; `
        "S-1-3"                      = "Creator Authority"; `
        "S-1-3-0"                    = "Creator Owner"; `
        "S-1-3-1"                    = "Creator Group"; `
        "S-1-3-2"                    = "Creator Owner Server"; `
        "S-1-3-3"                    = "Creator Group Server"; `
        "S-1-3-4"                    = "Owner Rights"; `
        "S-1-4"                      = "Non-unique Authority"; `
        "S-1-5"                      = "NT Authority"; `
        "S-1-5-1"                    = "Dialup"; `
        "S-1-5-2"                    = "Network"; `
        "S-1-5-3"                    = "Batch"; `
        "S-1-5-4"                    = "Interactive"; `
        "S-1-5-6"                    = "Service"; `
        "S-1-5-7"                    = "Anonymous"; `
        "S-1-5-8"                    = "Proxy"; `
        "S-1-5-9"                    = "Enterprise Domain Controllers"; `
        "S-1-5-10"                   = "Principal Self"; `
        "S-1-5-11"                   = "Authenticated Users"; `
        "S-1-5-12"                   = "Restricted Code"; `
        "S-1-5-13"                   = "Terminal Server Users"; `
        "S-1-5-14"                   = "Remote Interactive Logon"; `
        "S-1-5-15"                   = "This Organization"; `
        "S-1-5-17"                   = "IUSR"; `
        "S-1-5-18"                   = "Local System"; `
        "S-1-5-19"                   = "NT Authority"; `
        "S-1-5-20"                   = "NT Authority"; `
        "S-1-5-22"                   = "ENTERPRISE READ-ONLY DOMAIN CONTROLLERS BETA"; `
        "S-1-5-32-544"               = "Administrators"; `
        "S-1-5-32-545"               = "Users"; `
        "S-1-5-32-546"               = "Guests"; `
        "S-1-5-32-547"               = "Power Users"; `
        "S-1-5-32-548"               = "BUILTIN\Account Operators"; `
        "S-1-5-32-549"               = "Server Operators"; `
        "S-1-5-32-550"               = "Print Operators"; `
        "S-1-5-32-551"               = "Backup Operators"; `
        "S-1-5-32-552"               = "Replicator"; `
        "S-1-5-32-554"               = "BUILTIN\Pre-Windows 2000 Compatible Access"; `
        "S-1-5-32-555"               = "BUILTIN\Remote Desktop Users"; `
        "S-1-5-32-556"               = "BUILTIN\Network Configuration Operators"; `
        "S-1-5-32-557"               = "BUILTIN\Incoming Forest Trust Builders"; `
        "S-1-5-32-558"               = "BUILTIN\Performance Monitor Users"; `
        "S-1-5-32-559"               = "BUILTIN\Performance Log Users"; `
        "S-1-5-32-560"               = "BUILTIN\Windows Authorization Access Group"; `
        "S-1-5-32-561"               = "BUILTIN\Terminal Server License Servers"; `
        "S-1-5-32-562"               = "BUILTIN\Distributed COM Users"; `
        "S-1-5-32-568"               = "BUILTIN\IIS_IUSRS"; `
        "S-1-5-32-569"               = "BUILTIN\Cryptographic Operators"; `
        "S-1-5-32-573"               = "BUILTIN\Event Log Readers "; `
        "S-1-5-32-574"               = "BUILTIN\Certificate Service DCOM Access"; `
        "S-1-5-32-575"               = "BUILTIN\RDS Remote Access Servers"; `
        "S-1-5-32-576"               = "BUILTIN\RDS Endpoint Servers"; `
        "S-1-5-32-577"               = "BUILTIN\RDS Management Servers"; `
        "S-1-5-32-578"               = "BUILTIN\Hyper-V Administrators"; `
        "S-1-5-32-579"               = "BUILTIN\Access Control Assistance Operators"; `
        "S-1-5-32-580"               = "BUILTIN\Remote Management Users"; `
        "S-1-5-64-10"                = "NTLM Authentication"; `
        "S-1-5-64-14"                = "SChannel Authentication"; `
        "S-1-5-64-21"                = "Digest Authentication"; `
        "S-1-5-80"                   = "NT Service"; `
        "S-1-16-0"                   = "Untrusted Mandatory Level"; `
        "S-1-16-4096"                = "Low Mandatory Level"; `
        "S-1-16-8192"                = "Medium Mandatory Level"; `
        "S-1-16-8448"                = "Medium Plus Mandatory Level"; `
        "S-1-16-12288"               = "High Mandatory Level"; `
        "S-1-16-16384"               = "System Mandatory Level"; `
        "S-1-16-20480"               = "Protected Process Mandatory Level"; `
        "S-1-16-28672"               = "Secure Process Mandatory Level"
}
#==========================================================================
# Function		: Get-Forest
# Arguments     : string domain controller,credentials
# Returns   	: Forest
# Description   : Get AD Forest
#==========================================================================
function Get-Forest {
    Param($DomainController, [Management.Automation.PSCredential]$Credential)
    if (!$DomainController) {
        [DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
        return
    }
    if ($Creds) {
        $Context = new-object DirectoryServices.ActiveDirectory.DirectoryContext("DirectoryServer", $DomainController, $Creds.UserName, $Creds.GetNetworkCredential().Password)
    }
    else {
        $Context = New-Object DirectoryServices.ActiveDirectory.DirectoryContext("DirectoryServer", $DomainController)
    }
    $ojbForest = [DirectoryServices.ActiveDirectory.Forest]::GetForest($Context)

    return $ojbForest
}
#==========================================================================
# Function		: TestCreds
# Arguments     : System.Management.Automation.PSCredential
# Returns   	: Boolean
# Description   : Check If username and password is valid
#==========================================================================
Function TestCreds {
    Param([System.Management.Automation.PSCredential] $psCred)

    [void][reflection.assembly]::LoadWithPartialName("System.DirectoryServices.AccountManagement")

    if ($psCred.UserName -match "\\") {
        If ($psCred.UserName.split("\")[0] -eq "") {
            [directoryservices.directoryEntry]$root = (New-Object system.directoryservices.directoryEntry)

            $ctx = New-Object System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::Domain, $root.name)
        }
        else {

            $ctx = New-Object System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::Domain, $psCred.UserName.split("\")[0])
        }
        $bolValid = $ctx.ValidateCredentials($psCred.UserName.split("\")[1], $psCred.GetNetworkCredential().Password)
    }
    else {
        [directoryservices.directoryEntry]$root = (New-Object system.directoryservices.directoryEntry)

        $ctx = New-Object System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::Domain, $root.name)

        $bolValid = $ctx.ValidateCredentials($psCred.UserName, $psCred.GetNetworkCredential().Password)
    }

    return $bolValid
}
#==========================================================================
# Function		: GetTokenGroups
# Arguments     : Principal DistinguishedName string
# Returns   	: ArrayList of groups names
# Description   : Group names of all sids in tokenGroups
#==========================================================================
Function GetTokenGroups {
    Param($PrincipalDN,
        [bool] $bolCreds,
        [parameter(Mandatory = $false)]
        [System.Management.Automation.PSCredential] $Creds)


    $script:bolErr = $false
    $tokenGroups = New-Object System.Collections.ArrayList

    $tokenGroups.Clear()
    if ($bolCreds -eq $true) {

        $objADObject = new-object DirectoryServices.DirectoryEntry("LDAP://$global:strPinDomDC/$PrincipalDN", $Creds.UserName, $Creds.GetNetworkCredential().Password)

    }
    else {

        $objADObject = new-object DirectoryServices.DirectoryEntry("LDAP://$global:strPinDomDC/$PrincipalDN")

    }
    if ( $global:strDomainPrinDNName -eq $global:strDomainDNName ) {
        $objADObject.psbase.RefreshCache("tokenGroups")
        $SIDs = $objADObject.psbase.Properties.Item("tokenGroups")
    }
    else {
        $objADObject.psbase.RefreshCache("tokenGroupsGlobalandUniversal")
        $SIDs = $objADObject.psbase.Properties.Item("tokenGroupsGlobalandUniversal")
    }
    $ownerSIDs = $objADObject.psbase.Properties.Item("objectSID").tostring()
    # Populate hash table with security group memberships.


    $arrForeignSecGroups = FindForeignSecPrinMemberships $global:strDomainDNName $global:strDC $(GenerateSearchAbleSID $ownerSIDs)

    foreach ($ForeignMemb in $arrForeignSecGroups) {
        if ($null -ne $ForeignMemb ) {
            if ($ForeignMemb.tostring().length -gt 0 ) {
                [void]$tokenGroups.add($ForeignMemb)
            }
        }
    }



    ForEach ($Value In $SIDs) {



        $SID = New-Object System.Security.Principal.SecurityIdentifier $Value, 0


        # Translate into "pre-Windows 2000" name.
        & { #Try
            $Script:Group = $SID.Translate([System.Security.Principal.NTAccount])
        }
        Trap [SystemException] {
            $script:bolErr = $true
            $script:sidstring = GetSidStringFromSidByte $Value
            continue
        }
        if ($script:bolErr -eq $false) {

            [void]$tokenGroups.Add($Script:Group.Value)
        }
        else {

            [void]$tokenGroups.Add($script:sidstring)
            $script:bolErr = $false
        }

        $arrForeignSecGroups = FindForeignSecPrinMemberships $global:strDomainDNName $global:strDC $(GenerateSearchAbleSID $Value)

        foreach ($ForeignMemb in $arrForeignSecGroups) {
            if ($null -ne $ForeignMemb ) {
                if ($ForeignMemb.tostring().length -gt 0 ) {
                    [void]$tokenGroups.add($ForeignMemb)
                }
            }
        }

    }

    [void]$tokenGroups.Add("Everyone")
    [void]$tokenGroups.Add("NT AUTHORITY\Authenticated Users")
    if (($global:strPrinDomAttr -eq 14) -or ($global:strPrinDomAttr -eq 18) -or ($global:strPrinDomAttr -eq "5C") -or ($global:strPrinDomAttr -eq "1C") -or ($global:strPrinDomAttr -eq "44") -or ($global:strPrinDomAttr -eq "54") -or ($global:strPrinDomAttr -eq "50")) {
        [void]$tokenGroups.Add("NT AUTHORITY\Other Organization")
    }
    else {
        [void]$tokenGroups.Add("NT AUTHORITY\This Organization")
    }
    Return $tokenGroups

}
#==========================================================================
# Function		: GenerateSearchAbleSID
# Arguments     : SID Decimal form Value as string
# Returns   	: SID in String format for LDAP searcheds
# Description   : Convert SID from decimal to hex with "\" for searching with LDAP
#==========================================================================
Function GenerateSearchAbleSID {
    Param([String] $SidValue)

    $SidDec = $SidValue.tostring().split("")
    Foreach ($intSID in $SIDDec) {
        [string] $SIDHex = "{0:X2}" -f [int] $intSID
        $strSIDHextString = $strSIDHextString + "\" + $SIDHex

    }

    return $strSIDHextString
}
#==========================================================================
# Function		: FindForeignSecPrinMemberships
# Arguments     : SID Decimal form Value as string
# Returns   	: SID in String format for LDAP searcheds
# Description   : Convert SID from decimal to hex with "\" for searching with LDAP
#==========================================================================
Function FindForeignSecPrinMemberships {
    Param([string] $strLocalDomDN, [string] $strDC, [string] $strSearchAbleSID)

    $arrForeignMembership = New-Object System.Collections.ArrayList
    [void]$arrForeignMembership.clear()
    $domaininfo = new-object DirectoryServices.DirectoryEntry("LDAP://$strDC/CN=ForeignSecurityPrincipals,$strLocalDomDN")

    $srch = New-Object System.DirectoryServices.DirectorySearcher($domaininfo)

    $srch.SizeLimit = 100
    $strFilter = "(&(objectSID=$strSearchAbleSID))"
    $srch.Filter = $strFilter
    $srch.SearchScope = "Subtree"
    $res = $srch.FindOne()
    if ($res) {
        $objPrincipal = $res.GetDirectoryEntry()

        $objPrincipal.psbase.RefreshCache("memberof")
        Foreach ($member in @($objPrincipal.psbase.Properties.Item("memberof"))) {
            $objmember = new-object DirectoryServices.DirectoryEntry("LDAP://$strDC/$member")

            $objmember.psbase.RefreshCache("msDS-PrincipalName")
            $strPrinName = $($objmember.psbase.Properties.Item("msDS-PrincipalName"))
            if (($strPrinName -eq "") -or ($null -eq $strPrinName)) {
                $strNETBIOSNAME = $global:strPrinDomFlat
                $strPrinName = "$strNETBIOSNAME\$($objmember.psbase.Properties.Item("samAccountName"))"
            }
            [void]$arrForeignMembership.add($strPrinName)
        }


    }
    return $arrForeignMembership
}
#==========================================================================
# Function		: GetSidStringFromSidByte
# Arguments     : SID Value in Byte[]
# Returns   	: SID in String format
# Description   : Convert SID from Byte[] to String
#==========================================================================
Function GetSidStringFromSidByte {
    Param([byte[]] $SidByte)

    $objectSid = [byte[]]$SidByte
    $sid = New-Object System.Security.Principal.SecurityIdentifier($objectSid, 0)
    $sidString = ($sid.value).ToString()
    return $sidString
}
#==========================================================================
# Function		: GetSecPrinDN
# Arguments     : samAccountName
# Returns   	: DistinguishedName
# Description   : Search Security Principal and Return DistinguishedName
#==========================================================================
Function GetSecPrinDN {
    Param([string] $samAccountName,
        [string] $strDomainDN,
        [bool] $bolCreds,
        [parameter(Mandatory = $false)]
        [System.Management.Automation.PSCredential] $Creds)


    if ($bolCreds -eq $true) {


        $domaininfo = new-object DirectoryServices.DirectoryEntry("LDAP://$strDomainDN", $Creds.UserName, $Creds.GetNetworkCredential().Password)

    }
    else {

        $domaininfo = new-object DirectoryServices.DirectoryEntry("LDAP://$strDomainDN")
    }
    $srch = New-Object System.DirectoryServices.DirectorySearcher($domaininfo)

    $srch.SizeLimit = 100
    $strFilter = "(&(samAccountName=$samAccountName))"
    $srch.Filter = $strFilter
    $srch.SearchScope = "Subtree"
    $res = $srch.FindOne()
    if ($res) {
        $objPrincipal = $res.GetDirectoryEntry()
        $global:strPrincipalDN = $objPrincipal.distinguishedName
    }
    else {
        $global:strPrincipalDN = ""
    }

    return $global:strPrincipalDN

}


#==========================================================================
# Function		: GetSchemaObjectGUID
# Arguments     : Object Guid or Rights Guid
# Returns   	: LDAPDisplayName or DisplayName
# Description   : Searches in the dictionaries(Hash) dicRightsGuids and $global:dicSchemaIDGUIDs  and in Schema
#				for the name of the object or Extended Right, if found in Schema the dicRightsGuids is updated.
#				Then the functions return the name(LDAPDisplayName or DisplayName).
#==========================================================================
Function GetSchemaObjectGUID {
    Param([string] $Domain)
    [string] $strOut = ""
    [string] $objSchemaRecordset = ""
    [string] $strLDAPname = ""

    [void]$combObjectFilter.Items.Clear()
    BuildSchemaDic
    foreach ($ldapDisplayName in $global:dicSchemaIDGUIDs.values) {
        [void]$combObjectFilter.Items.Add($ldapDisplayName)
    }
			 if ($Domain -eq "") {
        # Connect to RootDSE
        $rootDSE = [ADSI]"LDAP://$global:strDC/RootDSE"
        #Connect to the Configuration Naming Context
        $schemaSearchRoot = [ADSI]("LDAP://$global:strDC/" + $rootDSE.Get("schemaNamingContext"))
			 }
			 else {
        $rootDSE = [ADSI]"LDAP://$global:strDC/$Domain"
        $schemaSearchRoot = [ADSI]("LDAP://$global:strDC/" + $rootDSE.Get("objectCategory"))
        $schemaSearchRoot = $schemaSearchRoot.path.replace("LDAP://$global:strDC/CN=Domain-DNS,", "")
        $schemaSearchRoot = [ADSI]("LDAP://$global:strDC/" + $schemaSearchRoot)
			 }
			 $searcher = new-object System.DirectoryServices.DirectorySearcher($schemaSearchRoot)
			 $searcher.PropertiesToLoad.addrange(('cn', 'name', 'distinguishedNAme', 'lDAPDisplayName', 'schemaIDGUID'))
			 $searcher.PageSize = 1000
    $searcher.filter = "(&(schemaIDGUID=*))"
			 $colResults = $searcher.FindAll()
    $intCounter = 0


		 	foreach ($objResult in $colResults) {
        $objSchemaObject = $objResult.Properties
        $strLDAPname = $objSchemaObject.item("lDAPDisplayName")[0]
        $guidGUID = [System.GUID]$objSchemaObject.item("schemaIDGUID")[0]
        $strGUID = $guidGUID.toString().toUpper()
        If (!($global:dicSchemaIDGUIDs.ContainsKey($strGUID))) {
            $global:dicSchemaIDGUIDs.Add($strGUID, $strLDAPname)
            $global:dicNameToSchemaIDGUIDs.Add($strLDAPname, $strGUID)
            [void]$combObjectFilter.Items.Add($strLDAPname)
        }

			 }

    return $strOut
}

#==========================================================================
# Function		: Get-ADSchemaClass
# Arguments     : string class,string domain controller,credentials
# Returns   	: Class Object
# Description   : Get AD Schema Class
#==========================================================================
function Get-ADSchemaClass {
    Param($Class = ".*")

    $ADSchemaClass = $global:Forest.Schema.FindAllClasses() | Where-Object { $_.Name -match "^$Class`$" }

    return $ADSchemaClass
}



#==========================================================================
# Function		: CheckDNExist
# Arguments     : string distinguishedName
# Returns   	: Boolean
# Description   : Check If distinguishedName exist
#==========================================================================
function CheckDNExist {
    Param (
        $sADobjectName
    )
    $sADobjectName = "LDAP://" + $sADobjectName
    $ADobject = [ADSI] $sADobjectName
    If ($null -eq $ADobject.distinguishedName)
    { return $false }
    else
    { return $true }

}
#==========================================================================
# Function		: ReverseString
# Arguments     : string
# Returns   	: string backwards
# Description   : Turn a string backwards
#==========================================================================
Function ReverseString {

    param ($string)
    ForEach ($char in $string) {
        ([regex]::Matches($char, '.', 'RightToLeft') | ForEach-Object { $_.value }) -join ''
    }

}


#==========================================================================
# Function		: GetAllChildNodes
# Arguments     : Node distinguishedName
# Returns   	: List of Nodes
# Description   : Search for a Node and returns distinguishedName
#==========================================================================
function GetAllChildNodes {
    param ($firstnode,
        [boolean] $bolSubtree)
    $nodelist = New-Object System.Collections.ArrayList
    $nodelist2 = New-Object System.Collections.ArrayList
    $nodelist.Clear()
    $nodelist2.Clear()
    # Add all Children found as Sub Nodes to the selected TreeNode

    $strFilterAll = "(&(objectClass=*))"
    $strFilterContainer = "(&(|(objectClass=organizationalUnit)(objectClass=container)(objectClass=DomainDNS)(objectClass=dMD)))"
    $strFilterOU = "(&(|(objectClass=organizationalUnit)(objectClass=DomainDNS)(objectClass=dMD)))"
    $srch = New-Object System.DirectoryServices.DirectorySearcher

    if ($firstnode -match "/") {
        $firstnode = $firstnode.Replace("/", "\/")
    }

    $srch.SearchRoot = "LDAP://$firstnode"
    If ($rdbScanAll.checked -eq $true) {
        $srch.Filter = $strFilterAll
    }
    If ($rdbScanOU.checked -eq $true) {
        $srch.Filter = $strFilterOU
    }
    If ($rdbScanContainer.checked -eq $true) {
        $srch.Filter = $strFilterContainer
    }
    if ($bolSubtree -eq $true) {
        $srch.SearchScope = "Subtree"
    }
    else {
        $srch.SearchScope = "onelevel"
    }
    $srch.PageSize = 1000
    $srch.PropertiesToLoad.addrange(('cn', 'distinguishedNAme'))
    foreach ($res in $srch.FindAll()) {
        $oNode = $res.GetDirectoryEntry()
        [void] $nodelist.Add($(ReverseString -String $oNode.distinguishedName))
    }
    if ($bolSubtree -eq $false) {
        [void] $nodelist.Add($(ReverseString -String $firstnode))
    }
    foreach ($bkwrNode in $($nodelist | Sort-Object)) {
        [void] $nodelist2.Add($(ReverseString -String $bkwrNode))

    }

    return $nodelist2

}
#==========================================================================
# Function		: Get-DomainDNfromFQDN
# Arguments     : Domain FQDN
# Returns   	: Domain DN
# Description   : Take domain FQDN as input and returns Domain name
#                  in DN
#==========================================================================
function Get-DomainDNfromFQDN {
    Param($strDomainFQDN)

    $strADObjectDNModified = $strDomainFQDN.tostring().Replace(".", ",DC=")

    $strDomDN = "DC=" + $strADObjectDNModified


    return $strDomDN
}

#==========================================================================
# Function		: Get-DomainDN
# Arguments     : string AD object distinguishedName
# Returns   	: Domain DN
# Description   : Take dinstinguishedName as input and returns Domain name
#                  in DN
#==========================================================================
function Get-DomainDN {
    Param($strADObjectDN)

    $strADObjectDNModified = $strADObjectDN.Replace(",DC=", "*")

    [array]$arrDom = $strADObjectDNModified.split("*")
    $intSplit = ($arrDom).count - 1
    $strDomDN = ""
    for ($i = $intSplit; $i -ge 1; $i-- ) {
        if ($i -eq 1) {
            $strDomDN = "DC=" + $arrDom[$i] + $strDomDN
        }
        else {
            $strDomDN = ",DC=" + $arrDom[$i] + $strDomDN
        }
    }

    return $strDomDN
}

#==========================================================================
# Function		: Get-DomainFQDN
# Arguments     : string AD object distinguishedName
# Returns   	: Domain FQDN
# Description   : Take dinstinguishedName as input and returns Domain name
#                  in FQDN
#==========================================================================
function Get-DomainFQDN {
    Param($strADObjectDN)

    $strADObjectDNModified = $strADObjectDN.Replace(",DC=", "*")

    [array]$arrDom = $strADObjectDNModified.split("*")
    $intSplit = ($arrDom).count - 1
    $strDomName = ""
    for ($i = $intSplit; $i -ge 1; $i-- ) {
        if ($i -eq $intSplit) {
            $strDomName = $arrDom[$i] + $strDomName
        }
        else {
            $strDomName = $arrDom[$i] + "." + $strDomName
        }
    }

    return $strDomName
}
#==========================================================================
# Function		: GetDomainShortName
# Arguments     : domain name
# Returns   	: N/A
# Description   : Search for short domain name
#==========================================================================
function GetDomainShortName {
    Param($strDomain,
        [string]$strForestDN)

    $objDomain = [ADSI]"LDAP://$global:strDC/$strDomain"

    $ReturnShortName = ""


    $strRootPath = "LDAP://$global:strDC/CN=Partitions,CN=Configuration,$strForestDN"

    $root = [ADSI]$strRootPath

    $ads = New-Object System.DirectoryServices.DirectorySearcher($root)
    $ads.PropertiesToLoad.addrange(('cn', 'distinguishedNAme', 'nETBIOSName'))
    $ads.filter = "(&(objectClass=crossRef)(nCName=$strDomain))"
    $s = $ads.FindOne()
    If ($s) {
        $ReturnShortName = $s.GetDirectoryEntry().nETBIOSName
    }
    else {
        $ReturnShortName = ""
    }
    return $ReturnShortName
}
#==========================================================================
# Function		: GetNCShortName
# Arguments     : AD NamingContext distinguishedName
# Returns   	: N/A
# Description   : Return CN of NC
#==========================================================================
function GetNCShortName {
    Param($strNode)
    $objNC = [ADSI]"LDAP://$global:strDC/$strNode"
    Switch -regex ($objNC.objectCategory) {
        "CN=Domain-DNS,CN=Schema,CN=Configuration"
        { [string]$strNCcn = $objNC.name }
        "CN=Configuration,CN=Schema,CN=Configuration"
        { [string]$strNCcn = $objNC.cn }
        "CN=DMD,CN=Schema,CN=Configuration"
        { [string]$strNCcn = $objNC.cn }
    }
    return $strNCcn
}

#==========================================================================
# Function		: Check-PermDef
# Arguments     : Trustee Name,Right,Allow/Deny,object guid,Inheritance,Inheritance object guid
# Returns   	: Boolean
# Description   : Compares the Security Descriptor with the DefaultSecurity
#==========================================================================
Function Check-PermDef {
    Param($objNodeDefSD,
        [string]$strTrustee,
        [string]$adRights,
        [string]$InheritanceType,
        [string]$ObjectTypeGUID,
        [string]$InheritedObjectTypeGUID,
        [string]$ObjectFlags,
        [string]$AccessControlType,
        [string]$IsInherited,
        [string]$InheritedFlags,
        [string]$PropFlags)
    $SDResult = $false
    $Identity = "$strTrustee"

    $sdOUDef = $objNodeDefSD | ForEach-Object { $_.DefaultObjectSecurityDescriptor } | ForEach-Object { $objNodeDefSD.DefaultObjectSecurityDescriptor.access }
    $index = 0
    while ($index -le $sdOUDef.count - 1) {
        if (($sdOUDef[$index].IdentityReference -eq $strTrustee) -and ($sdOUDef[$index].ActiveDirectoryRights -eq $adRights) -and ($sdOUDef[$index].AccessControlType -eq $AccessControlType) -and ($sdOUDef[$index].ObjectType -eq $ObjectTypeGUID) -and ($sdOUDef[$index].InheritanceType -eq $InheritanceType) -and ($sdOUDef[$index].InheritedObjectType -eq $InheritedObjectTypeGUID)) {
            $SDResult = $true
        }#} #End If
        $index++
    } #End While

    return $SDResult

}

#==========================================================================
# Function		: CacheRightsGuids
# Arguments     : none
# Returns   	: nothing
# Description   : Enumerates all Extended Rights and put them in a Hash dicRightsGuids
#==========================================================================
Function CacheRightsGuids([string] $Domain) {
    if (!$Domain) {
        # Connect to RootDSE
        $rootDSE = [ADSI]"LDAP://RootDSE"
        #Connect to the Configuration Naming Context
        $configSearchRoot = [ADSI]("LDAP://CN=Extended-Rights," + $rootDSE.Get("configurationNamingContext"))
    }
    else {
        $rootDSE = [ADSI]"LDAP://$global:strDC/$Domain"
        $configSearchRoot = [ADSI]("LDAP://$global:strDC/" + $rootDSE.Get("objectCategory"))
        $configSearchRoot = $configSearchRoot.psbase.path.replace("LDAP://CN=Domain-DNS,CN=Schema,", "")

        $configSearchRoot = [ADSI]("LDAP://$global:strDC/CN=Extended-Rights,CN=Configuration," + $global:ForestRootDomainDN)
    }

    $searcher = new-object System.DirectoryServices.DirectorySearcher($configSearchRoot)
    $searcher.PropertiesToLoad.("cn", "name", "distinguishedNAme", "rightsGuid")
    $searcher.filter = "(&(objectClass=controlAccessRight))"
    $colResults = $searcher.FindAll()
    $intCounter = 0


    foreach ($objResult in $colResults) {
        $objExtendedRightsObject = $objResult.Properties
        If (($objExtendedRightsObject.item("validAccesses") -eq 48) -or ($objExtendedRightsObject.item("validAccesses") -eq 256)) {

            $strRightDisplayName = $objExtendedRightsObject.item("displayName")
            $strRightGuid = $objExtendedRightsObject.item("rightsGuid")
            $strRightGuid = $($strRightGuid).toString()
            $global:dicRightsGuids.Add($strRightGuid, $strRightDisplayName)

        }
        $intCounter++
    }


}
#==========================================================================
# Function		: MapGUIDToMatchingName
# Arguments     : Object Guid or Rights Guid
# Returns   	: LDAPDisplayName or DisplayName
# Description   : Searches in the dictionaries(Hash) dicRightsGuids and $global:dicSchemaIDGUIDs  and in Schema
#				for the name of the object or Extended Right, if found in Schema the dicRightsGuids is updated.
#				Then the functions return the name(LDAPDisplayName or DisplayName).
#==========================================================================
Function MapGUIDToMatchingName {
    Param([string] $strGUIDAsString, [string] $Domain)
    [string] $strOut = ""
    [string] $objSchemaRecordset = ""
    [string] $strLDAPname = ""
    If ($strGUIDAsString -eq "") {
        Break
    }
    $strGUIDAsString = $strGUIDAsString.toUpper()
    $strOut = ""
    if ($global:dicRightsGuids.ContainsKey($strGUIDAsString)) {
        $strOut = $global:dicRightsGuids.Item($strGUIDAsString)
    }

    If ($strOut -eq "") {
        #Didn't find a match in extended rights
        If ($global:dicSchemaIDGUIDs.ContainsKey($strGUIDAsString)) {
            $strOut = $global:dicSchemaIDGUIDs.Item($strGUIDAsString)
        }
        else {

            if ($strGUIDAsString -match ("^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$")) {

                $ConvertGUID = ConvertGUID($strGUIDAsString)
                if (!($Domain -eq "")) {
                    # Connect to RootDSE
                    $rootDSE = [ADSI]"LDAP://RootDSE"
                    #Connect to the Configuration Naming Context
                    $schemaSearchRoot = [ADSI]("LDAP://" + $rootDSE.Get("schemaNamingContext"))
                }
                else {
                    $rootDSE = [ADSI]"LDAP://$global:strDC/$Domain"
                    $schemaSearchRoot = [ADSI]("LDAP://$global:strDC/" + $rootDSE.Get("objectCategory"))
                    $schemaSearchRoot = $schemaSearchRoot.path.replace("LDAP://CN=Domain-DNS,", "")
                    $schemaSearchRoot = [ADSI]("LDAP://$global:strDC/" + $schemaSearchRoot)
                }
                $searcher = new-object System.DirectoryServices.DirectorySearcher($schemaSearchRoot)
                $searcher.PropertiesToLoad.addrange(('cn', 'name', 'distinguishedNAme', 'lDAPDisplayName'))
                $searcher.filter = "(&(schemaIDGUID=$ConvertGUID))"
                $Object = $searcher.FindOne()
                if ($Object) {
                    $objSchemaObject = $Object.Properties
                    $strLDAPname = $objSchemaObject.item("lDAPDisplayName")[0]
                    $global:dicSchemaIDGUIDs.Add($strGUIDAsString.toUpper(), $strLDAPname)
                    $strOut = $strLDAPname

                }
            }
        }
    }
    return $strOut
}
#==========================================================================
# Function		: ConvertGUID
# Arguments     : Object Guid or Rights Guid
# Returns   	: AD Searchable GUID String
# Description   : Convert a GUID to a string

#==========================================================================
function ConvertGUID($guid) {

    $test = "(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})"
    $pattern = '"\$4\$3\$2\$1\$6\$5\$8\$7\$9\$10\$11\$12\$13\$14\$15\$16"'
    $ConvertGUID = [regex]::Replace($guid.replace("-", ""), $test, $pattern).Replace("`"", "")
    return $ConvertGUID
}
#==========================================================================
# Function		: fixfilename
# Arguments     : Text for naming text file
# Returns   	: Text with replace special characters
# Description   : Replace characters that be contained in a file name.

#==========================================================================
function fixfilename([string] $strFileName) {

    $strFileName = $strFileName.Replace("*", "#")
    $strFileName = $strFileName.Replace("/", "#")
    $strFileName = $strFileName.Replace("\", "#")
    $strFileName = $strFileName.Replace(":", "#")
    $strFileName = $strFileName.Replace("<", "#")
    $strFileName = $strFileName.Replace(">", "#")
    $strFileName = $strFileName.Replace("|", "#")
    $strFileName = $strFileName.Replace('"', "#")
    $strFileName = $strFileName.Replace('?', "#")

    return $strFileName
}
#==========================================================================
# Function		: WritePermCSV
# Arguments     : Security Descriptor, OU distinguishedName, Ou put text file
# Returns   	: n/a
# Description   : Writes the SD to a text file.
#==========================================================================
function WritePermCSV($sd, [string]$ou, [string] $fileout, [bool] $ACLMeta, [string]  $strACLDate, [string] $strInvocationID, [string] $strOrgUSN) {

    $sd  | ForEach-Object {
        If ($global:dicDCSpecialSids.ContainsKey($_.IdentityReference.toString())) {
            $strAccName = $global:dicDCSpecialSids.Item($_.IdentityReference.toString())
        }
        else {
            $strAccName = $_.IdentityReference.toString()
        }
        If ($ACLMeta -eq $true) {
            $ou + ";" + `
                $_.IdentityReference.toString() + ";" + `
                $_.ActiveDirectoryRights.toString() + ";" + `
                $_.InheritanceType.toString() + ";" + `
                $_.ObjectType.toString() + ";" + `
                $_.InheritedObjectType.toString() + ";" + `
                $_.ObjectFlags.toString() + ";" + `
                $_.AccessControlType.toString() + ";" + `
                $_.IsInherited.toString() + ";" + `
                $_.InheritanceFlags.toString() + ";" + `
                $_.PropagationFlags.toString() + ";" + `
                $strACLDate.toString() + ";" + `
                $strInvocationID.toString() + ";" + `
                $strOrgUSN.toString() + ";" | Out-File -Append -FilePath $fileout
        }
        else {
            $ou + ";" + `
                $_.IdentityReference.toString() + ";" + `
                $_.ActiveDirectoryRights.toString() + ";" + `
                $_.InheritanceType.toString() + ";" + `
                $_.ObjectType.toString() + ";" + `
                $_.InheritedObjectType.toString() + ";" + `
                $_.ObjectFlags.toString() + ";" + `
                $_.AccessControlType.toString() + ";" + `
                $_.IsInherited.toString() + ";" + `
                $_.InheritanceFlags.toString() + ";" + `
                $_.PropagationFlags.toString() + ";;;;" | Out-File -Append -FilePath $fileout
        }
    }

}
#==========================================================================
# Function		: ConvertSidTo-Name
# Arguments     : SID string
# Returns   	: Friendly Name of Security Object
# Description   : Try to translate the SID if it fails it try to match a Well-Known.
#==========================================================================
function ConvertSidTo-Name($server, $sid) {
    $ID = New-Object System.Security.Principal.SecurityIdentifier($sid)

    & { #Try
        $User = $ID.Translate( [System.Security.Principal.NTAccount])
        $strAccName = $User.Value
    }
    Trap [SystemException] {
        If ($global:dicWellKnownSids.ContainsKey($sid)) {
            $strAccName = $global:dicWellKnownSids.Item($sid)
            return $strAccName
        }
        ; Continue
    }
    If ($global:dicSidToName.ContainsKey($sid)) {
        $strAccName = $global:dicSidToName.Item($sid)
    }
    else {
        $objSID = [ADSI]"LDAP://$server/<SID=$sid>"
        $strAccName = $objSID.samAccountName
        $global:dicSidToName.Add($sid, $strAccName)
    }
    If ($strAccName -eq $nul) {
        $strAccName = $sid
    }

    return $strAccName
}

#==========================================================================
# Function		: WriteHTM
# Arguments     : Security Descriptor, OU dn string, Output htm file
# Returns   	: n/a
# Description   : Wites the SD info to a HTM table, it appends info if the file exist
#==========================================================================
function WriteHTM([bool] $bolACLExist, $sd, [string]$ou, [bool] $OUHeader, [string] $strColorTemp, [string] $htmfileout, [bool] $CompareMode, [bool] $FilterMode, [bool]$boolReplMetaDate, [string]$strReplMetaDate, [bool]$boolACLSize, [string]$strACLSize, [bool]$boolOUProtected, [bool]$bolOUPRotected, [bool]$bolCriticalityLevel) {


    $strTHOUColor = "E5CF00"
    $strTHColor = "EFAC00"
    $strLegendColor = ""
    $strLegendTextVal = "Info"
    $strLegendTextInfo = "Info"
    $strLegendTextLow = "Low"
    $strLegendTextMedium = "Medium"
    $strLegendTextWarning = "Warning"
    $strLegendTextCritical = "Critical"
    $strLegendColorInfo = @"
bgcolor="#A4A4A4"
"@
    $strLegendColorLow = @"
bgcolor="#0099FF"
"@
    $strLegendColorMedium = @"
bgcolor="#FFFF00"
"@
    $strLegendColorWarning = @"
bgcolor="#FFCC00"
"@
    $strLegendColorCritical = @"
bgcolor="#DF0101"
"@
    $strFont = @"
<FONT size="1" face="verdana, hevetica, arial">
"@
    $strFontRights = @"
<FONT size="1" face="verdana, hevetica, arial">
"@
    $strFontOU = @"
<FONT size="1" face="verdana, hevetica, arial">
"@
    $strFontTH = @"
<FONT size="2" face="verdana, hevetica, arial">
"@
    If ($OUHeader -eq $true) {
        if ($boolReplMetaDate -eq $true) {
            if ($boolACLSize -eq $true) {
                if ($boolOUProtected -eq $true) {
                    if ($bolOUProtected -eq $true) {
                        $strHTMLText = @"
<TR bgcolor="$strTHOUColor"><TD><b>$strFontOU $strReplMetaDate</b><TD><b>$strFontOU $strACLSize bytes</b><TD bgcolor="FF0000"><b>$strFontOU $bolOUProtected</b><TD><b>$strFontOU $ou</b></TR>
"@
                    }
                    else {
                        $strHTMLText = @"
<TR bgcolor="$strTHOUColor"><TD><b>$strFontOU $strReplMetaDate</b><TD><b>$strFontOU $strACLSize bytes</b><TD><b>$strFontOU $bolOUProtected</b><TD><b>$strFontOU $ou</b></TR>
"@
                    }
                }
                else {
                    $strHTMLText = @"
<TR bgcolor="$strTHOUColor"><TD><b>$strFontOU $strReplMetaDate</b><TD><b>$strFontOU $strACLSize bytes</b><TD><b>$strFontOU $ou</b></TR>
"@
                }
            }
            else {
                if ($boolOUProtected -eq $true) {
                    if ($bolOUProtected -eq $true) {
                        $strHTMLText = @"
<TR bgcolor="$strTHOUColor"><TD><b>$strFontOU $strReplMetaDate</b><TD bgcolor="FF0000"><b>$strFontOU $bolOUProtected</b><TD><b>$strFontOU $ou</b></TR>
"@
                    }
                    else {
                        $strHTMLText = @"
<TR bgcolor="$strTHOUColor"><TD><b>$strFontOU $strReplMetaDate</b><TD><b>$strFontOU $bolOUProtected</b><TD><b>$strFontOU $ou</b></TR>
"@
                    }
                }
                else {
                    $strHTMLText = @"
<TR bgcolor="$strTHOUColor"><TD><b>$strFontOU $strReplMetaDate</b><TD><b>$strFontOU $ou</b></TR>
"@
                }
            }
        }
        else {
            if ($boolACLSize -eq $true) {
                if ($boolOUProtected -eq $true) {
                    if ($bolOUProtected -eq $true) {
                        $strHTMLText = @"
<TR bgcolor="$strTHOUColor"><TD><b>$strFontOU $strACLSize bytes</b><TD bgcolor="FF0000"><b>$strFontOU $bolOUProtected</b><TD><b>$strFontOU $ou</b></TR>
"@
                    }
                    else {
                        $strHTMLText = @"
<TR bgcolor="$strTHOUColor"><TD><b>$strFontOU $strACLSize bytes</b><TD><b>$strFontOU $bolOUProtected</b><TD><b>$strFontOU $ou</b></TR>
"@
                    }
                }
                else {
                    $strHTMLText = @"
<TR bgcolor="$strTHOUColor"><TD><b>$strFontOU $strACLSize bytes</b><TD><b>$strFontOU $ou</b></TR>
"@
                }
            }
            else {
                if ($boolOUProtected -eq $true) {
                    if ($bolOUProtected -eq $true) {
                        $strHTMLText = @"
<TR bgcolor="$strTHOUColor"><TD bgcolor="FF0000"><b>$strFontOU $bolOUProtected</b><TD><b>$strFontOU $ou</b></TR>
"@
                    }
                    else {
                        $strHTMLText = @"
<TR bgcolor="$strTHOUColor"><TD><b>$strFontOU $bolOUProtected</b><TD><b>$strFontOU $ou</b></TR>
"@
                    }
                }
                else {
                    $strHTMLText = @"
<TR bgcolor="$strTHOUColor"><TD><b>$strFontOU $ou</b></TR>
"@
                }
            }
        }
    } #End If
    Switch ($strColorTemp) {

        "1" {
            $strColor = "DDDDDD"
            $strColorTemp = "2"
        }
        "2" {
            $strColor = "AAAAAA"
            $strColorTemp = "1"
        }
        "3" {
            $strColor = "FF1111"
        }
        "4" {
            $strColor = "00FFAA"
        }
        "5" {
            $strColor = "FFFF00"
        }
    }# End Switch

    if ($bolACLExist) {
        $sd  | ForEach-Object {
            $objAccess = $($_.AccessControlType.toString())
            $objFlags = $($_.ObjectFlags.toString())
            $objType = $($_.ObjectType.toString())
            $objInheritedType = $($_.InheritedObjectType.toString())
            $objRights = $($_.ActiveDirectoryRights.toString())
            $objInheritanceType = $($_.InheritanceType.toString())



            if ($chkBoxEffectiveRightsColor.checked -eq $false) {
                Switch ($objRights) {
                    "DeleteChild, DeleteTree, Delete" {
                        $objRights = "DeleteChild, DeleteTree, Delete"

                    }
                    "GenericRead" {
                        $objRights = "Read Permissions,List Contents,Read All Properties,List"
                    }
                    "CreateChild" {
                        $objRights = "Create"
                    }
                    "DeleteChild" {
                        $objRights = "Delete"
                    }
                    "GenericAll" {
                        $objRights = "Full Control"
                    }
                    "CreateChild, DeleteChild" {
                        $objRights = "Create/Delete"
                    }
                    "ReadProperty" {
                        Switch ($objInheritanceType) {
                            "None" {

                                Switch ($objFlags) {
                                    "ObjectAceTypePresent" {
                                        $objRights = "Read"
                                    }

                                    "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                                        $objRights = "Read"
                                    }
                                    default
                                    { $objRights = "Read All Properties"	}
                                }#End switch



                            }
                            "Children" {

                                Switch ($objFlags) {
                                    "ObjectAceTypePresent" {
                                        $objRights = "Read"
                                    }

                                    "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                                        $objRights = "Read"
                                    }
                                    default
                                    { $objRights = "Read All Properties"	}
                                }#End switch
                            }
                            "Descendents" {

                                Switch ($objFlags) {
                                    "ObjectAceTypePresent" {
                                        $objRights = "Read"
                                    }

                                    "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                                        $objRights = "Read"
                                    }
                                    default
                                    { $objRights = "Read All Properties"	}
                                }#End switch
                            }
                            default
                            { $objRights = "Read All Properties"	}
                        }#End switch


                    }
                    "ReadProperty, WriteProperty" {
                        $objRights = "Read All Properties;Write All Properties"
                    }
                    "WriteProperty" {
                        Switch ($objInheritanceType) {
                            "None" {

                                Switch ($objFlags) {
                                    "ObjectAceTypePresent" {
                                        $objRights = "Write"
                                    }

                                    "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                                        $objRights = "Write"
                                    }
                                    default
                                    { $objRights = "Write All Properties"	}
                                }#End switch



                            }
                            "Children" {

                                Switch ($objFlags) {
                                    "ObjectAceTypePresent" {
                                        $objRights = "Write"
                                    }

                                    "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                                        $objRights = "Write"
                                    }
                                    default
                                    { $objRights = "Write All Properties"	}
                                }#End switch
                            }
                            "Descendents" {

                                Switch ($objFlags) {
                                    "ObjectAceTypePresent" {
                                        $objRights = "Write"
                                    }

                                    "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                                        $objRights = "Write"
                                    }
                                    default
                                    { $objRights = "Write All Properties"	}
                                }#End switch
                            }
                            default
                            { $objRights = "Write All Properties"	}
                        }#End switch
                    }
                }# End Switch
            }
            else {
                Switch ($objRights) {
                    "ListChildren" {
                        If ($objAccess -eq "Allow") {
                            $strLegendColor = $strLegendColorInfo
                            $strLegendTextVal = $strLegendTextInfo
                        }
                    }
                    "Modify permissions" {
                        $strLegendColor = $strLegendColorCritical
                        $strLegendTextVal = $strLegendTextCritical
                    }
                    "DeleteChild, DeleteTree, Delete" {
                        If ($objAccess -eq "Allow") {
                            $strLegendColor = $strLegendColorWarning
                            $strLegendTextVal = $strLegendTextWarning
                        }
                        $objRights = "DeleteChild, DeleteTree, Delete"

                    }
                    "Delete" {
                        If ($objAccess -eq "Allow") {
                            $strLegendColor = $strLegendColorWarning
                            $strLegendTextVal = $strLegendTextWarning
                        }
                    }
                    "GenericRead" {
                        If ($objAccess -eq "Allow") {
                            $strLegendColor = $strLegendColorLow
                            $strLegendTextVal = $strLegendTextLow
                        }
                        $objRights = "Read Permissions,List Contents,Read All Properties,List"
                    }
                    "CreateChild" {
                        If ($objAccess -eq "Allow") {
                            $strLegendColor = $strLegendColorWarning
                            $strLegendTextVal = $strLegendTextWarning
                        }
                        $objRights = "Create"
                    }
                    "DeleteChild" {
                        If ($objAccess -eq "Allow") {
                            $strLegendColor = $strLegendColorWarning
                            $strLegendTextVal = $strLegendTextWarning
                        }
                        $objRights = "Delete"
                    }
                    "ExtendedRight" {
                        If ($objAccess -eq "Allow") {
                            $strLegendColor = $strLegendColorWarning
                            $strLegendTextVal = $strLegendTextWarning
                        }
                    }
                    "GenericAll" {
                        If ($objAccess -eq "Allow") {
                            $strLegendColor = $strLegendColorCritical
                            $strLegendTextVal = $strLegendTextCritical
                        }
                        $objRights = "Full Control"
                    }
                    "CreateChild, DeleteChild" {
                        If ($objAccess -eq "Allow") {
                            $strLegendColor = $strLegendColorWarning
                            $strLegendTextVal = $strLegendTextWarning
                        }
                        $objRights = "Create/Delete"
                    }
                    "ReadProperty" {
                        If ($objAccess -eq "Allow") {
                            $strLegendColor = $strLegendColorLow
                            $strLegendTextVal = $strLegendTextLow
                        }
                        Switch ($objInheritanceType) {
                            "None" {

                                Switch ($objFlags) {
                                    "ObjectAceTypePresent" {

                                        $objRights = "Read"
                                    }

                                    "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                                        $objRights = "Read"
                                    }
                                    default
                                    { $objRights = "Read All Properties"	}
                                }#End switch



                            }
                            "Children" {

                                Switch ($objFlags) {
                                    "ObjectAceTypePresent" {
                                        $objRights = "Read"
                                    }

                                    "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                                        $objRights = "Read"
                                    }
                                    default
                                    { $objRights = "Read All Properties"	}
                                }#End switch
                            }
                            "Descendents" {

                                Switch ($objFlags) {
                                    "ObjectAceTypePresent" {
                                        $objRights = "Read"
                                    }

                                    "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                                        $objRights = "Read"
                                    }
                                    default
                                    { $objRights = "Read All Properties"	}
                                }#End switch
                            }
                            default
                            { $objRights = "Read All Properties"	}
                        }#End switch


                    }
                    "ReadProperty, WriteProperty" {
                        If ($objAccess -eq "Allow") {
                            $strLegendTextVal = $strLegendTextMedium
                            $strLegendColor = $strLegendColorMedium
                        }
                        $objRights = "Read All Properties;Write All Properties"
                    }
                    "WriteProperty" {
                        If ($objAccess -eq "Allow") {
                            $strLegendColor = $strLegendColorMedium
                            $strLegendTextVal = $strLegendTextMedium
                        }
                        Switch ($objInheritanceType) {
                            "None" {

                                Switch ($objFlags) {
                                    "ObjectAceTypePresent" {
                                        $objRights = "Write"
                                    }

                                    "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                                        $objRights = "Write"
                                    }
                                    default {
                                        $objRights = "Write All Properties"
                                    }
                                }#End switch

                            }
                            "Children" {

                                Switch ($objFlags) {
                                    "ObjectAceTypePresent" {
                                        $objRights = "Write"
                                    }

                                    "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                                        $objRights = "Write"
                                    }
                                    default {
                                        $objRights = "Write All Properties"
                                    }
                                }#End switch
                            }
                            "Descendents" {

                                Switch ($objFlags) {
                                    "ObjectAceTypePresent" {
                                        $objRights = "Write"
                                    }
                                    "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                                        $objRights = "Write"
                                    }
                                    default {
                                        $objRights = "Write All Properties"
                                    }
                                }#End switch
                            }
                            default {
                                $objRights = "Write All Properties"
                            }
                        }#End switch
                    }
                    default {
                        If ($objAccess -eq "Allow") {
                            if ($objRights -match "Write") {
                                $strLegendColor = $strLegendColorMedium
                                $strLegendTextVal = $strLegendTextMedium
                            }
                            if ($objRights -match "Create") {
                                $strLegendColor = $strLegendColorWarning
                                $strLegendTextVal = $strLegendTextWarning
                            }
                            if ($objRights -match "Delete") {
                                $strLegendColor = $strLegendColorWarning
                                $strLegendTextVal = $strLegendTextWarning
                            }
                            if ($objRights -match "ExtendedRight") {
                                $strLegendColor = $strLegendColorWarning
                                $strLegendTextVal = $strLegendTextWarning
                            }
                            if ($objRights -match "WriteDacl") {
                                $strLegendColor = $strLegendColorCritical
                                $strLegendTextVal = $strLegendTextCritical
                            }
                            if ($objRights -match "WriteOwner") {
                                $strLegendColor = $strLegendColorCritical
                                $strLegendTextVal = $strLegendTextCritical
                            }
                        }
                    }
                }# End Switch
            }
            $strNTAccount = $($_.IdentityReference.toString())

            If ($strNTAccount.contains("S-1-5")) {
                $strNTAccount = ConvertSidTo-Name -server $global:strDomainLongName -Sid $strNTAccount

            }

            Switch ($strColorTemp) {

                "1" {
                    $strColor = "DDDDDD"
                    $strColorTemp = "2"
                }
                "2" {
                    $strColor = "AAAAAA"
                    $strColorTemp = "1"
                }
                "3" {
                    $strColor = "FF1111"
                }
                "4" {
                    $strColor = "00FFAA"
                }
                "5" {
                    $strColor = "FFFF00"
                }
            }# End Switch

            Switch ($objInheritanceType) {
                "All" {
                    Switch ($objFlags) {
                        "InheritedObjectAceTypePresent" {
                            $strPerm = "$strFont This object and all child objects</TD><TD $strLegendColor>$strFontRights $objRights $(MapGUIDToMatchingName -strGUIDAsString $objInheritedType -Domain $global:strDomainDNName)</TD>"
                        }
                        "ObjectAceTypePresent" {
                            $strPerm = "$strFont This object and all child objects</TD><TD $strLegendColor>$strFontRights $objRights $(MapGUIDToMatchingName -strGUIDAsString $objType -Domain $global:strDomainDNName)</TD>"
                        }
                        "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                            $strPerm = "$strFont $(MapGUIDToMatchingName -strGUIDAsString $objInheritedType -Domain $global:strDomainDNName)</TD><TD $strLegendColor>$strFontRights $objRights $(MapGUIDToMatchingName -strGUIDAsString $objType -Domain $global:strDomainDNName)</TD>"
                        }
                        "None" {
                            $strPerm = "$strFont This object and all child objects</TD><TD $strLegendColor>$strFontRights $objRights</TD>"
                        }
                        default {
                            $strPerm = "Error: Failed to display permissions 1K"
                        }

                    }# End Switch

                }
                "Descendents" {

                    Switch ($objFlags) {
                        "InheritedObjectAceTypePresent" {
                            $strPerm = "$strFont $(MapGUIDToMatchingName -strGUIDAsString $objInheritedType -Domain $global:strDomainDNName)</TD><TD $strLegendColor>$strFontRights $objRights</TD>"
                        }
                        "None" {
                            $strPerm = "$strFont Child Objects Only</TD><TD $strLegendColor>$strFontRights $objRights</TD>"
                        }
                        "ObjectAceTypePresent" {
                            $strPerm = "$strFont Child Objects Only</TD><TD $strLegendColor>$strFontRights $objRights $(MapGUIDToMatchingName -strGUIDAsString $objType -Domain $global:strDomainDNName)</TD>"
                        }
                        "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                            $strPerm =	"$strFont $(MapGUIDToMatchingName -strGUIDAsString $objInheritedType -Domain $global:strDomainDNName)</TD><TD $strLegendColor>$strFontRights $objRights $(MapGUIDToMatchingName -strGUIDAsString $objType -Domain $global:strDomainDNName)</TD>"
                        }
                        default {
                            $strPerm = "Error: Failed to display permissions 2K"
                        }

                    }
                }
                "None" {
                    Switch ($objFlags) {
                        "ObjectAceTypePresent" {
                            $strPerm = "$strFont This Object Only</TD><TD $strLegendColor>$strFontRights $objRights $(MapGUIDToMatchingName -strGUIDAsString $objType -Domain $global:strDomainDNName)</TD>"
                        }
                        "None" {
                            $strPerm = "$strFont This Object Only</TD><TD $strLegendColor>$strFontRights $objRights</TD>"
                        }
                        default {
                            $strPerm = "Error: Failed to display permissions 4K"
                        }

                    }
                }
                "SelfAndChildren" {
                    Switch ($objFlags) {
                        "ObjectAceTypePresent" {
                            $strPerm = "$strFont This object and all child objects within this conatainer only</TD><TD $strLegendColor>$strFontRights $objRights $(MapGUIDToMatchingName -strGUIDAsString $objType -Domain $global:strDomainDNName)</TD>"
                        }
                        "InheritedObjectAceTypePresent" {
                            $strPerm = "$strFont Children within this conatainer only</TD><TD $strLegendColor>$strFontRights $objRights $(MapGUIDToMatchingName -strGUIDAsString $objInheritedType -Domain $global:strDomainDNName)</TD>"
                        }

                        "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                            $strPerm = "$strFont $(MapGUIDToMatchingName -strGUIDAsString $objInheritedType -Domain $global:strDomainDNName)</TD><TD $strLegendColor>$strFontRights $objRights $(MapGUIDToMatchingName -strGUIDAsString $objType -Domain $global:strDomainDNName)</TD>"
                        }
                        "None" {
                            $strPerm = "$strFont This object and all child objects</TD><TD $strLegendColor>$strFontRights $objRights</TD>"
                        }
                        default {
                            $strPerm = "Error: Failed to display permissions 5K"
                        }

                    }
                }
                "Children" {
                    Switch ($objFlags) {
                        "InheritedObjectAceTypePresent" {
                            $strPerm = "$strFont Children within this conatainer only</TD><TD $strLegendColor>$strFontRights $objRights $(MapGUIDToMatchingName -strGUIDAsString $objInheritedType -Domain $global:strDomainDNName)</TD>"
                        }
                        "None" {
                            $strPerm = "$strFont Children  within this conatainer only</TD><TD $strLegendColor>$strFontRights $objRights</TD>"
                        }
                        "ObjectAceTypePresent, InheritedObjectAceTypePresent" {
                            $strPerm = "$strFont $(MapGUIDToMatchingName -strGUIDAsString $objInheritedType -Domain $global:strDomainDNName)</TD><TD>$strFont $(MapGUIDToMatchingName -strGUIDAsString $objType -Domain $global:strDomainDNName) $objRights</TD>"
                        }
                        "ObjectAceTypePresent" {
                            $strPerm = "$strFont Children within this conatainer only</TD><TD $strLegendColor>$strFontRights $objRights $(MapGUIDToMatchingName -strGUIDAsString $objType -Domain $global:strDomainDNName)</TD>"
                        }
                        default {
                            $strPerm = "Error: Failed to display permissions 6K"
                        }

                    }
                }
                default {
                    $strPerm = "Error: Failed to display permissions 7K"
                }
            }# End Switch
            if ($CompareMode) {
                if ($boolReplMetaDate -eq $true) {
                    if ($bolCriticalityLevel -eq $true) {
                        $objColor = $($_.Color.toString())
                        $strStatus = "<TD>$strFont $objColor</TD>"
                        $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strReplMetaDate</TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm
$strStatus
<TD $strLegendColor>$strFont $strLegendTextVal</TD>
</TR>
"@
                    }
                    else {
                        $objColor = $($_.Color.toString())
                        $strStatus = "<TD>$strFont $objColor</TD>"
                        $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strReplMetaDate</TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm
$strStatus
</TR>
"@
                    }
                }
                else {
                    if ($bolCriticalityLevel -eq $true) {
                        $objColor = $($_.Color.toString())
                        $strStatus = "<TD>$strFont $objColor</TD>"
                        $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm
$strStatus
<TD $strLegendColor>$strFont $strLegendTextVal</TD>
</TR>
"@
                    }
                    else {
                        $objColor = $($_.Color.toString())
                        $strStatus = "<TD>$strFont $objColor</TD>"
                        $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm
$strStatus
</TR>
"@
                    }
                } #End If ReplMeta Data

            }
            else {
                if ($boolReplMetaDate -eq $true) {
                    if ($boolACLSize -eq $true) {
                        if ($boolOUProtected -eq $true) {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strReplMetaDate</TD><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont $bolOUPRotected </TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm
<TD $strLegendColor>$strFont $strLegendTextVal</TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strReplMetaDate</TD><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont $bolOUPRotected </TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm

</TR>
"@
                            }
                        }
                        else {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strReplMetaDate</TD><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm
<TD $strLegendColor>$strFont $strLegendTextVal</TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strReplMetaDate</TD><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm

</TR>
"@
                            }
                        }
                    }
                    else {
                        if ($boolOUProtected -eq $true) {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strReplMetaDate</TD><TD>
$strFont $bolOUPRotected</TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm
<TD $strLegendColor>$strFont $strLegendTextVal</TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strReplMetaDate</TD><TD>
$strFont $bolOUPRotected</TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm

</TR>
"@
                            }
                        }
                        else {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strReplMetaDate</TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm
<TD $strLegendColor>$strFont $strLegendTextVal</TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strReplMetaDate</TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm

</TR>
"@
                            }
                        }
                    }
                }
                else {
                    if ($boolACLSize -eq $true) {
                        if ($boolOUProtected -eq $true) {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont $bolOUPRotected</TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm
<TD $strLegendColor>$strFont $strLegendTextVal</TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont $bolOUPRotected</TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm

</TR>
"@
                            }
                        }
                        else {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm
<TD $strLegendColor>$strFont $strLegendTextVal</TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm

</TR>
"@
                            }
                        }
                    }
                    else {
                        if ($boolOUProtected -eq $true) {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $bolOUPRotected</TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm
<TD $strLegendColor>$strFont $strLegendTextVal</TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $bolOUPRotected</TD><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm

</TR>
"@
                            }
                        }
                        else {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm
<TD $strLegendColor>$strFont $strLegendTextVal</TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $ou</TD><TD>
$strFont $strNTAccount</TD><TD>
$strFont $($_.AccessControlType.toString()) </TD><TD>
$strFont $($_.IsInherited.toString())</TD><TD>
$strPerm

</TR>
"@
                            }
                        }
                    }
                } #End If ReplMeta Data
            }# End if CompareMode

        }# End foreach
    }
    else {
        if (!$CompareMode) {
            if ($FilterMode) {
                if ($boolReplMetaDate -eq $true) {
                    if ($bolCriticalityLevel -eq $true) {
                        $strACLHTMLText = @"
<TR bgcolor="$strColor"><TD>$strFont
$strFont $strReplMetaDate</TD><TD>
$strFont $ou</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Matching Permissions Set</TD><TD>
</TR>
"@
                    }
                    else {
                        $strACLHTMLText = @"
<TR bgcolor="$strColor"><TD>$strFont
$strFont $strReplMetaDate</TD><TD>
$strFont $ou</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Matching Permissions Set</TD>
</TR>
"@
                    }
                }
                else {
                    if ($bolCriticalityLevel -eq $true) {
                        $strACLHTMLText = @"
<TR bgcolor="$strColor"><TD>$strFont
$strFont $ou</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Matching Permissions Set</TD><TD>
</TR>
"@
                    }
                    else {
                        $strACLHTMLText = @"
<TR bgcolor="$strColor"><TD>$strFont
$strFont $ou</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Matching Permissions Set</TD>
</TR>
"@
                    }
                }#End If ReplMeta Data
            }
            else {
                if ($boolReplMetaDate -eq $true) {
                    if ($boolACLSize -eq $true) {
                        if ($boolOUProtected -eq $true) {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strReplMetaDate</TD><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont $bolOUPRotected</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD><TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strReplMetaDate</TD><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont $bolOUPRotected</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD>
</TR>
"@
                            }
                        }
                        else {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strReplMetaDate</TD><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD><TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strReplMetaDate</TD><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD>
</TR>
"@
                            }
                        }
                    }
                    else {
                        if ($boolOUProtected -eq $true) {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
<TR bgcolor="$strColor"><TD>$strFont
$strFont $strReplMetaDate</TD><TD>
$strFont $bolOUPRotected</TD><TD>
$strFont $ou</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD><TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
<TR bgcolor="$strColor"><TD>$strFont
$strFont $strReplMetaDate</TD><TD>
$strFont $bolOUPRotected</TD><TD>
$strFont $ou</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD>
</TR>
"@
                            }
                        }
                        else {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
<TR bgcolor="$strColor"><TD>$strFont
$strFont $strReplMetaDate</TD><TD>
$strFont $ou</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD><TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
<TR bgcolor="$strColor"><TD>$strFont
$strFont $strReplMetaDate</TD><TD>
$strFont $ou</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD>
</TR>
"@
                            }
                        }
                    }
                }
                else {
                    if ($boolACLSize -eq $true) {
                        if ($boolOUProtected -eq $true) {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont $bolOUPRotected</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD><TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont $bolOUPRotected</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD>
</TR>
"@
                            }
                        }
                        else {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD><TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
$strACLHTMLText
<TR bgcolor="$strColor"><TD>
$strFont $strACLSize bytes</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD>
</TR>
"@
                            }
                        }
                    }
                    else {
                        if ($boolOUProtected -eq $true) {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
<TR bgcolor="$strColor"><TD>$strFont
$strFont $bolOUPRotected</TD><TD>
$strFont $ou</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD><TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
<TR bgcolor="$strColor"><TD>$strFont
$strFont $bolOUPRotected</TD><TD>
$strFont $ou</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD>
</TR>
"@
                            }
                        }
                        else {
                            if ($bolCriticalityLevel -eq $true) {
                                $strACLHTMLText = @"
<TR bgcolor="$strColor"><TD>$strFont
$strFont $ou</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD><TD>
</TR>
"@
                            }
                            else {
                                $strACLHTMLText = @"
<TR bgcolor="$strColor"><TD>$strFont
$strFont $ou</TD><TD>
$strFont N/A</TD><TD>
$strFont N/A </TD><TD>
$strFont N/A</TD><TD>
$strFont N/A</TD><TD>
$strFont No Permissions Set</TD>
</TR>
"@
                            }
                        }
                    }
                }#End If ReplMeta Data
            }
        }# End if
    }# End If

    $strHTMLText = $strHTMLText + $strACLHTMLText

    Out-File -InputObject $strHTMLText -Append -FilePath $htmfileout
    Out-File -InputObject $strHTMLText -Append -FilePath $strFileHTM

    $strHTMLText = ""

}

#==========================================================================
# Function		: InitiateHTM
# Arguments     : Output htm file
# Returns   	: n/a
# Description   : Wites base HTM table syntax, it appends info if the file exist
#==========================================================================
Function InitiateHTM([string] $htmfileout, [bool]$RepMetaDate , [bool]$ACLSize, [bool]$bolACEOUProtected, [bool]$bolCirticaltiy) {
    $strHTMLText = "<TABLE BORDER=1>"
    $strTHOUColor = "E5CF00"
    $strTHColor = "EFAC00"
    $strFont = @"
<FONT size="1" face="verdana, hevetica, arial">
"@
    $strFontOU = @"
<FONT size="1" face="verdana, hevetica, arial">
"@
    $strFontTH = @"
<FONT size="2" face="verdana, hevetica, arial">
"@
    if ($RepMetaDate -eq $true) {
        if ($ACLSize -eq $true) {
            if ($bolACEOUProtected -eq $true) {
                if ($bolCirticaltiy -eq $true) {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH Security Descriptor Modified</font><th bgcolor="$strTHColor">$strFontTH DACL Size</font><th bgcolor="$strTHColor">$strFontTH Inheritance Disabled</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th><th bgcolor="$strTHColor">$strFontTH Criticality Level</font></th>
"@
                }
                else {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH Security Descriptor Modified</font><th bgcolor="$strTHColor">$strFontTH DACL Size</font><th bgcolor="$strTHColor">$strFontTH Inheritance Disabled</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th>
"@
                }
            }
            else {
                if ($bolCirticaltiy -eq $true) {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH Security Descriptor Modified</font><th bgcolor="$strTHColor">$strFontTH DACL Size</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th><th bgcolor="$strTHColor">$strFontTH Criticality Level</font></th>
"@
                }
                else {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH Security Descriptor Modified</font><th bgcolor="$strTHColor">$strFontTH DACL Size</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th>
"@
                }
            }
        }
        else {
            if ($bolACEOUProtected -eq $true) {
                if ($bolCirticaltiy -eq $true) {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH Security Descriptor Modified</font><th bgcolor="$strTHColor">$strFontTH Inheritance Disabled</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th><th bgcolor="$strTHColor">$strFontTH Criticality Level</font></th>
"@
                }
                else {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH Security Descriptor Modified</font><th bgcolor="$strTHColor">$strFontTH Inheritance Disabled</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th>
"@
                }
            }
            else {
                if ($bolCirticaltiy -eq $true) {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH Security Descriptor Modified</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th><th bgcolor="$strTHColor">$strFontTH Criticality Level</font></th>
"@
                }
                else {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH Security Descriptor Modified</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th>
"@
                }
            }
        }
    }
    else {
        if ($ACLSize -eq $true) {
            if ($bolACEOUProtected -eq $true) {
                if ($bolCirticaltiy -eq $true) {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH DACL Size</font><th bgcolor="$strTHColor">$strFontTH Inheritance Disabled</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th><th bgcolor="$strTHColor">$strFontTH Criticality Level</font></th>
"@
                }
                else {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH DACL Size</font><th bgcolor="$strTHColor">$strFontTH Inheritance Disabled</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th>
"@
                }
            }
            else {
                if ($bolCirticaltiy -eq $true) {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH DACL Size</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th><th bgcolor="$strTHColor">$strFontTH Criticality Level</font></th>
"@
                }
                else {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH DACL Size</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th>
"@
                }
            }
        }
        else {
            if ($bolACEOUProtected -eq $true) {
                if ($bolCirticaltiy -eq $true) {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH Inheritance Disabled</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th><th bgcolor="$strTHColor">$strFontTH Criticality Level</font></th>
"@
                }
                else {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH Inheritance Disabled</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th>
"@
                }
            }
            else {
                if ($bolCirticaltiy -eq $true) {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th><th bgcolor="$strTHColor">$strFontTH Criticality Level</font></th>
"@
                }
                else {
                    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th>
"@
                }
            }
        }

    }
    Out-File -InputObject $strHTMLText -Append -FilePath $htmfileout
}
#==========================================================================
# Function		: InitiateCompareHTM
# Arguments     : Output htm file
# Returns   	: n/a
# Description   : Wites base HTM table syntax, it appends info if the file exist
#==========================================================================
Function InitiateCompareHTM([string] $htmfileout, [boolean]$RepMetaDate) {
    $strHTMLText = "<TABLE BORDER=1>"
    $strTHOUColor = "E5CF00"
    $strTHColor = "EFAC00"
    $strFont = @"
<FONT size="1" face="verdana, hevetica, arial">
"@
    $strFontOU = @"
<FONT size="1" face="verdana, hevetica, arial">
"@
    $strFontTH = @"
<FONT size="2" face="verdana, hevetica, arial">
"@
    if ($RepMetaDate -eq $true) {
        $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH Security Descriptor Modified</font><th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th><th bgcolor="$strTHColor">$strFontTH State</font></th>
"@
    }
    else {
        $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH OU</font></th><th bgcolor="$strTHColor">$strFontTH Trustee</font></th><th bgcolor="$strTHColor">$strFontTH Right</font></th><th bgcolor="$strTHColor">$strFontTH Inherited</font></th><th bgcolor="$strTHColor">$strFontTH Apply To</font></th><th bgcolor="$strTHColor">$strFontTH Permission</font></th><th bgcolor="$strTHColor">$strFontTH State</font></th>
"@
    }
    Out-File -InputObject $strHTMLText -Append -FilePath $htmfileout
}
#==========================================================================
# Function		: CreateHTA
# Arguments     : OU Name, Ou put HTA file
# Returns   	: n/a
# Description   : Initiates a base HTA file with Export(Save As),Print and Exit buttons.
#==========================================================================
function CreateHTA([string]$NodeName, [string]$htafileout, [string]$htmfileout, [string] $folder) {
    $strHTAText = @"
<html>
<head>
<hta:Application ID="hta"
ApplicationName="Report">
<title>Report on $NodeName</title>
<script type="text/vbscript">
Sub ExportToCSV()
Dim objFSO,objFile,objNewFile,oShell,oEnv
Set oShell=CreateObject("wscript.shell")
Set oEnv=oShell.Environment("System")
strTemp=oShell.ExpandEnvironmentStrings("%USERPROFILE%")
strTempFile="$htmfileout"
strOutputFolder="$folder"
strFile=SaveAs("$NodeName.htm",strOutputFolder)
If strFile="" Then Exit Sub
Set objFSO=CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile strTempFile,strFile, true
MsgBox "Finished exporting to " & strFile,vbOKOnly+vbInformation,"Export"
End Sub
Function SaveAs(strFile,strOutFolder)
Dim objDialog
SaveAs=InputBox("Enter the filename and path."&vbCrlf&vbCrlf&"Example: "&strOutFolder&"\CONTOSO-contoso.htm","Export",strOutFolder&"\"&strFile)
End Function
</script>
</head>
<body>
<input type="button" value="Export" onclick="ExportToCSV" tabindex="9">
<input id="print_button" type="button" value="Print" name="Print_button" class="Hide" onClick="Window.print()">
<input type="button" value="Exit" onclick=self.close name="B3" tabindex="1" class="btn">
"@
    Out-File -InputObject $strHTAText -Force -FilePath $htafileout
}
#==========================================================================
# Function		: WriteSPNHTM
# Arguments     : Security Principal Name,  Output htm file
# Returns   	: n/a
# Description   : Wites the account membership info to a HTM table, it appends info if the file exist
#==========================================================================
function WriteSPNHTM([string] $strSPN, $tokens, [string]$objType, [int]$intMemberOf, [string] $strColorTemp, [string] $htafileout, [string] $htmfileout) {


    $strTHOUColor = "E5CF00"
    $strTHColor = "EFAC00"
    $strFont = @"
<FONT size="1" face="verdana, hevetica, arial">
"@
    $strFontOU = @"
<FONT size="1" face="verdana, hevetica, arial">
"@
    $strFontTH = @"
<FONT size="2" face="verdana, hevetica, arial">
"@

    $strHTMLText = @"
<TR bgcolor="$strTHOUColor"><TD><b>$strFontOU $strSPN</b><TD><b>$strFontOU $objType</b><TD><b>$strFontOU $intMemberOf</b></TR>
"@
    $strHTMLText = @"
$strHTMLText
<TR bgcolor="$strTHColor"><TD><b>$strFontTH Groups</b></TD><TD></TD><TD></TD></TR>
"@


    $tokens  | ForEach-Object {
        if ($($_.toString()) -ne $strSPN) {
            Switch ($strColorTemp) {

                "1" {
                    $strColor = "DDDDDD"
                    $strColorTemp = "2"
                }
                "2" {
                    $strColor = "AAAAAA"
                    $strColorTemp = "1"
                }
                "3" {
                    $strColor = "FF1111"
                }
                "4" {
                    $strColor = "00FFAA"
                }
                "5" {
                    $strColor = "FFFF00"
                }
            }# End Switch
            $strGroupText = $strGroupText + @"
<TR bgcolor="$strColor"><TD>
$strFont $($_.toString())</TD></TR>
"@
        }
    }
    $strHTMLText = $strHTMLText + $strGroupText


    Out-File -InputObject $strHTMLText -Append -FilePath $htafileout
    Out-File -InputObject $strHTMLText -Append -FilePath $htmfileout

    $strHTMLText = ""

}
#==========================================================================
# Function		: CreateColorLegenedReportHTA
# Arguments     : OU Name, Ou put HTA file
# Returns   	: n/a
# Description   : Initiates a base HTA file with Export(Save As),Print and Exit buttons.
#==========================================================================
function CreateColorLegenedReportHTA([string]$htafileout) {
    $strHTAText = @"
<html>
<head>
<hta:Application ID="hta"
ApplicationName="Legend">
<title>Color Code</title>
<script type="text/vbscript">
Sub Window_Onload

 	self.ResizeTo 500,500
End sub
</script>
</head>
<body>

<input type="button" value="Exit" onclick=self.close name="B3" tabindex="1" class="btn">
"@

    $strTHOUColor = "E5CF00"
    $strTHColor = "EFAC00"
    $strFont = @"
<FONT size="1" face="verdana, hevetica, arial">
"@
    $strFontOU = @"
<FONT size="1" face="verdana, hevetica, arial">
"@
    $strFontTH = @"
<FONT size="2" face="verdana, hevetica, arial">
"@
    $strLegendColorInfo = @"
bgcolor="#A4A4A4"
"@
    $strLegendColorLow = @"
bgcolor="#0099FF"
"@
    $strLegendColorMedium = @"
bgcolor="#FFFF00"
"@
    $strLegendColorWarning = @"
bgcolor="#FFCC00"
"@
    $strLegendColorCritical = @"
bgcolor="#DF0101"
"@

    $strHTAText = @"
$strHTAText
<h4>Use colors in report to identify criticality level of permissions.<br>This might help you in implementing <B>Least-Privilege</B> Administrative Models.</h4>
<TABLE BORDER=1>
<th bgcolor="$strTHColor">$strFontTH Permissions</font></th><th bgcolor="$strTHColor">$strFontTH Criticality</font></th>
<TR><TD> $strFontTH <B>Deny Permissions<TD $strLegendColorInfo> Info</TR>
<TR><TD> $strFontTH <B>List<TD $strLegendColorInfo>Info</TR>
<TR><TD> $strFontTH <B>Read Properties<TD $strLegendColorLow>Low</TR>
<TR><TD> $strFontTH <B>Read Object<TD $strLegendColorLow>Low</TR>
<TR><TD> $strFontTH <B>Read Permissions<TD $strLegendColorLow>Low</TR>
<TR><TD> $strFontTH <B>Write Propeties<TD $strLegendColorMedium>Medium</TR>
<TR><TD> $strFontTH <B>Create Object<TD $strLegendColorWarning>Warning</TR>
<TR><TD> $strFontTH <B>Delete Object<TD $strLegendColorWarning>Warning</TR>
<TR><TD> $strFontTH <B>ExtendedRight<TD $strLegendColorWarning>Warning</TR>
<TR><TD> $strFontTH <B>Modify Permisions<TD $strLegendColorCritical>Critical</TR>
<TR><TD> $strFontTH <B>Full Control<TD $strLegendColorCritical>Critical</TR>

"@


    ##
    Out-File -InputObject $strHTAText -Force -FilePath $htafileout
}
#==========================================================================
# Function		: CreateServicePrincipalReportHTA
# Arguments     : OU Name, Ou put HTA file
# Returns   	: n/a
# Description   : Initiates a base HTA file with Export(Save As),Print and Exit buttons.
#==========================================================================
function CreateServicePrincipalReportHTA([string]$SPN, [string]$htafileout, [string]$htmfileout, [string] $folder) {
    $strHTAText = @"
<html>
<head>
<hta:Application ID="hta"
ApplicationName="Report">
<title>Membership Report on $SPN</title>
<script type="text/vbscript">
Sub ExportToCSV()
Dim objFSO,objFile,objNewFile,oShell,oEnv
Set oShell=CreateObject("wscript.shell")
Set oEnv=oShell.Environment("System")
strTemp=oShell.ExpandEnvironmentStrings("%USERPROFILE%")
strTempFile="$htmfileout"
strOutputFolder="$folder"
strFile=SaveAs("$SPN.htm",strOutputFolder)
If strFile="" Then Exit Sub
Set objFSO=CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile strTempFile,strFile, true
MsgBox "Finished exporting to " & strFile,vbOKOnly+vbInformation,"Export"
End Sub
Function SaveAs(strFile,strOutFolder)
Dim objDialog
SaveAs=InputBox("Enter the filename and path."&vbCrlf&vbCrlf&"Example: "&strOutFolder&"\CONTOSO-contoso.htm","Export",strOutFolder&"\"&strFile)
End Function
</script>
</head>
<body>
<input type="button" value="Export" onclick="ExportToCSV" tabindex="9">
<input id="print_button" type="button" value="Print" name="Print_button" class="Hide" onClick="Window.print()">
<input type="button" value="Exit" onclick=self.close name="B3" tabindex="1" class="btn">
"@
    Out-File -InputObject $strHTAText -Force -FilePath $htafileout
}
#==========================================================================
# Function		: CreateHTM
# Arguments     : OU Name, Ou put HTM file
# Returns   	: n/a
# Description   : Initiates a base HTM file with Export(Save As),Print and Exit buttons.
#==========================================================================
function CreateSPNHTM([string]$SPN, [string]$htmfileout) {
    $strHTAText = @"
<html>
<head[string]$SPN
<title>Membership Report on $SPN</title>
"@
    Out-File -InputObject $strHTAText -Force -FilePath $htmfileout

}
#==========================================================================
# Function		: InitiateHTM
# Arguments     : Output htm file
# Returns   	: n/a
# Description   : Wites base HTM table syntax, it appends info if the file exist
#==========================================================================
Function InitiateSPNHTM([string] $htmfileout) {
    $strHTMLText = "<TABLE BORDER=1>"
    $strTHOUColor = "E5CF00"
    $strTHColor = "EFAC00"
    $strFont = @"
<FONT size="1" face="verdana, hevetica, arial">
"@
    $strFontOU = @"
<FONT size="1" face="verdana, hevetica, arial">
"@
    $strFontTH = @"
<FONT size="2" face="verdana, hevetica, arial">
"@


    $strHTMLText = @"
$strHTMLText
<th bgcolor="$strTHColor">$strFontTH Account Name</font></th><th bgcolor="$strTHColor">$strFontTH Object Type</font></th><th bgcolor="$strTHColor">$strFontTH Number of Groups</font></th>
"@



    Out-File -InputObject $strHTMLText -Append -FilePath $htmfileout
}
#==========================================================================
# Function		: CreateHTM
# Arguments     : OU Name, Ou put HTM file
# Returns   	: n/a
# Description   : Initiates a base HTM file with Export(Save As),Print and Exit buttons.
#==========================================================================
function CreateHTM([string]$NodeName, [string]$htmfileout) {
    $strHTAText = @"
<html>
<head>
<title>Report on $NodeName</title>
"@

    Out-File -InputObject $strHTAText -Force -FilePath $htmfileout
}
#==========================================================================
# Function		: BuildTree
# Arguments     : TreeView Node
# Returns   	: TreeView Node
# Description   : Build the Tree with AD objects
#==========================================================================
Function BuildTree($treeNode) {
    #$de = New-Object system.directoryservices.directoryEntry("LDAP://$strDC/$($treeNode.Name)")
    # Add all Children found as Sub Nodes to the selected TreeNode

    $strFilterOUCont = "(&(|(objectClass=organizationalUnit)(objectClass=container)))"
    $strFilterAll = "(&(name=*))"
    $srch = New-Object System.DirectoryServices.DirectorySearcher
    $srch.SizeLimit = 100
    $treeNodePath = $treeNode.name

    $treeNodePath = $treeNodePath.Replace("/", "\/")

    $srch.SearchRoot = "LDAP://$global:strDC/" + $treeNodePath
    If ($rdbBrowseAll.checked -eq $true) {
        $srch.Filter = $strFilterAll

    }
    else {
        $srch.Filter = $strFilterOUCont
    }
    $srch.SearchScope = "OneLevel"
    foreach ($res in $srch.FindAll()) {
        $oOU = $res.GetDirectoryEntry()
        If ($null -ne $oOU.name) {
            $TN = New-Object System.Windows.Forms.TreeNode
            $TN.Name = $oOU.distinguishedName
            $TN.Text = $oOU.name
            $TN.tag = "NotEnumerated"
            $treeNode.Nodes.Add($TN)
        }
    }
    $treeNode.tag = "Enumerated"

}
#==========================================================================
# Function		: GetADPartitions
# Arguments     : domain name
# Returns   	: N/A
# Description   : Returns AD Partitions
#==========================================================================
function GetADPartitions {
    Param($strDomain)
    $ADPartlist = @{"domain" = $strDomain }
    $objDomain = [ADSI]"LDAP://$strDomain"
    [string]$strDomainObjectCateory = $objDomain.objectCategory
    [array] $dnSplit = $strDomainObjectCateory.split(",")
    $intSplit = ($dnSplit).count - 1
    $strConfig = ""
    for ($i = $intSplit; $i -ge 0; $i-- ) {
        If ($dnSplit[$i] -match "CN=Configuration") {
            $intConfig = $i
            $strDomainConfig = $dnSplit[$i]
        }
        If ($i -gt $intConfig) {
            If ($strConfig.Length -eq 0) {
                $strConfig = $dnSplit[$i]
            }
            else {
                $strConfig = $dnSplit[$i] + "," + $strConfig
            }
        }
    }
    $strDomainConfig = $strDomainConfig + "," + $strConfig
    $strDNSchema = "LDAP://CN=Enterprise Schema,CN=Partitions," + $strDomainConfig
    $ojbSchema = [ADSI]$strDNSchema

    $ADPartlist.Add("config", $strDomainConfig)
    $ADPartlist.Add("schema", $ojbSchema.nCName)

    return $ADPartlist
}
#==========================================================================
# Function		: Select-File
# Arguments     : n/a
# Returns   	: folder path
# Description   : Dialogbox for selecting a file
#==========================================================================
function Select-File {
    param (
        [System.String]$Title = "Select Template File",
        [System.String]$InitialDirectory = $CurrentFSPath,
        [System.String]$Filter = "All Files(*.csv)|*.csv"
    )

    $dialog = New-Object System.Windows.Forms.OpenFileDialog
    $dialog.Filter = $filter
    $dialog.InitialDirectory = $initialDirectory
    $dialog.ShowHelp = $true
    $dialog.Title = $title
    $result = $dialog.ShowDialog($owner)

    if ($result -eq "OK") {
        return $dialog.FileName
    }
    else {
        return ""

    }
}
#==========================================================================
# Function		: Select-Folder
# Arguments     : n/a
# Returns   	: folder path
# Description   : Dialogbox for selecting a folder
#==========================================================================
function Select-Folder($message = 'Select a folder', $path = 0) {
    $object = New-Object -comObject Shell.Application

    $folder = $object.BrowseForFolder(0, $message, 0, $path)
    if ($null -ne $folder) {
        $folder.self.Path
    }
}
#==========================================================================
# Function		: Get-Perm
# Arguments     : List of OU Path
# Returns   	: All Permissions on a speficied object
# Description   : Enumerates all access control entries on a speficied object
#==========================================================================
Function Get-Perm {
    Param([System.Collections.ArrayList]$ALOUdn, [string]$DomainNetbiosName, [boolean]$SkipDefaultPerm, [boolean]$FilterEna, [boolean]$bolGetOwnerEna, [boolean]$bolCSVOnly, [boolean]$bolRepMeta, [boolean]$bolACLsize, [boolean]$bolEffectiveR, [boolean] $bolGetOUProtected)
    $SDResult = $false
    $strOwner = ""
    $strACLSize = ""
    $bolOUProtected = $false
    $aclcount = 0

    If ($bolCSV) {
        If ((Test-Path $strFileCSV) -eq $true) {
            Remove-Item $strFileCSV
        }
    }
    $count = 0
    while ($count -le $ALOUdn.count - 1) {
        $sd = New-Object System.Collections.ArrayList
        $GetOwnerEna = $bolGetOwnerEna
        $ADObjDN = $($ALOUdn[$count])

        if ($ADObjDN -match "/") {
            #if ($rdbOneLevel.checked -eq $false)
            #{

            #   if ($ADObjDN -match "/")
            #   {
            $ADObjDN = $ADObjDN.Replace("/", "\/")
            #   }
            #}
            #else
            #{
            #if($count -lt $ALOUdn.count -1)
            #{

            #  if ($ADObjDN -match "/")
            #  {

            #     $ADObjDN = $ADObjDN.Replace("/", "\/")
            # }
            #}
            #}
        }

        $DSobject = [adsi]("LDAP://$global:strDC/$ADObjDN")


        $secd = $DSobject.psbase.get_objectSecurity().getAccessRules($true, $chkInheritedPerm.checked, [System.Security.Principal.NTAccount])
        $sd.clear()
        $(ConvertTo-ObjectArrayListFromPsCustomObject  $secd) | ForEach-Object { [void]$sd.add($_) }

        If ($GetOwnerEna -eq $true) {

            $strOwner = $DSobject.psbase.get_objectSecurity().getOwner([System.Security.Principal.NTAccount])
            $newSdOwnerObject = New-Object psObject | `
                Add-Member NoteProperty IdentityReference $strOwner -PassThru |`
                Add-Member NoteProperty ActiveDirectoryRights "Modify permissions" -PassThru |`
                Add-Member NoteProperty InheritanceType "None" -PassThru |`
                Add-Member NoteProperty ObjectType  "None" -PassThru |`
                Add-Member NoteProperty ObjectFlags "None" -PassThru |`
                Add-Member NoteProperty AccessControlType "Owner" -PassThru |`
                Add-Member NoteProperty IsInherited "False" -PassThru |`
                Add-Member NoteProperty InheritanceFlags "None" -PassThru |`
                Add-Member NoteProperty InheritedObjectType "None" -PassThru |`
                Add-Member NoteProperty PropagationFlags "None"  -PassThru
            [void]$sd.insert(0, $newSdOwnerObject)

        }
        If ($SkipDefaultPerm) {
            $strNodeObjectClass = $DSobject.objectClass.tostring()
            [array] $arrObjClassSplit = $strNodeObjectClass.split(" ")
            foreach ($strObjClass in $arrObjClassSplit) {
            }
            $objNodeDefSD = Get-ADSchemaClass $strObjClass
        }
        if ($bolACLsize -eq $true) {
            $strACLSize = $DSobject.psbase.get_objectSecurity().GetSecurityDescriptorBinaryForm().length
        }
        if ($bolGetOUProtected -eq $true) {
            $bolOUProtected = $DSobject.psbase.get_objectSecurity().areaccessrulesprotected
        }
        if ($bolRepMeta -eq $true) {

            $AclChange = $(GetACLMeta  $global:strDC $ADObjDN)
            $objLastChange = $AclChange.split(";")[0]
            $strOrigInvocationID = $AclChange.split(";")[1]
            $strOrigUSN = $AclChange.split(";")[2]
        }


        If (($FilterEna -eq $true) -and ($bolEffectiveR -eq $false)) {
            If ($chkBoxType.Checked) {
                if ($combAccessCtrl.SelectedIndex -gt -1) {
                    $sd = @($sd | Where-Object { $_.AccessControlType -eq $combAccessCtrl.SelectedItem })
                }
            }
            If ($chkBoxObject.Checked) {
                if ($combObjectFilter.SelectedIndex -gt -1) {

                    $sd = @($sd | Where-Object { ($_.ObjectType -eq $global:dicNameToSchemaIDGUIDs.Item($combObjectFilter.SelectedItem)) -or ($_.InheritedObjectType -eq $global:dicNameToSchemaIDGUIDs.Item($combObjectFilter.SelectedItem)) })
                }
            }
            If ($chkBoxTrustee.Checked) {
                if ($txtFilterTrustee.Text.