Universal.Apps.ActiveDirectory.psm1



Get-ChildItem $PSScriptRoot\Reports | ForEach-Object {
    . $_.FullName
}

function New-UDActiveDirectoryApp {
    $Navigation = {
        Protect-UDSection -Role @("Administrator", "AD Admin", "AD Users") -Children {
            New-UDListItem -Label 'Users' -Icon (New-UDIcon -Icon 'User') -Children {
                New-UDListItem -Label 'Search Users' -Icon (New-UDIcon -Icon 'Search') -Href '/search-users' -Nested
                New-UDListItem -Label 'Create User' -Icon (New-UDIcon -Icon 'UserPlus') -Href '/create-user' -Nested
                New-UDListItem -Label 'Reset Password' -Icon (New-UDIcon -Icon 'Key') -Href '/reset-password' -Nested
                New-UDListItem -Label 'Restore Deleted User' -Icon (New-UDIcon -Icon 'Trash') -Href '/restore-deleted-user' -Nested
            }
        }
        Protect-UDSection -Role @("Administrator", "AD Admin", "AD Groups") -Children {
            New-UDListItem -Label 'Groups' -Icon (New-UDIcon -Icon 'Users') -Children {
                New-UDListItem -Label 'Search Groups' -Icon (New-UDIcon -Icon 'Search') -Href '/groups' -Nested
                New-UDListItem -Label 'Create Group' -Icon (New-UDIcon -Icon 'UsersCog') -Href '/create-group' -Nested
                New-UDListItem -Label 'Group Membership' -Icon (New-UDIcon -Icon 'Users') -Href '/group-membership' -Nested
            }
        }
        Protect-UDSection -Role @("Administrator", "AD Admin") -Children {
            New-UDListItem -Label 'Infrastructure' -Icon (New-UDIcon -Icon 'Server') -Children {
                New-UDListItem -Label 'Search Computers' -Icon (New-UDIcon -Icon 'Search') -Href '/Search-Computers' -Nested
                New-UDListItem -Label 'Domain Controllers' -Icon (New-UDIcon -Icon 'Database') -Href '/Domain-Controllers' -Nested
            }
        }
        New-UDListItem -Label 'Object Search' -Icon (New-UDIcon -Icon 'Search') -Href '/object-search'
        New-UDListItem -Label 'Reports' -Icon (New-UDIcon -Icon 'UsersGear') -Href '/reports'
    }
      
    function New-ADReportPage {
        param(
            $Title,  
            $Description,
            $Module,
            $Command,
            $Url)

        $Script = "$Module\$Command"
      
        New-UDPage -Name $Title -Url $Url -Content {
            New-UDStack -Direction row -Content {
                New-UDButton -Text 'Back to Reports' -Icon (New-UDIcon -Icon ArrowAltCircleLeft) -OnClick {
                    Invoke-UDRedirect "/reports"
                }
      
                New-UDButton -Text 'Run Report' -OnClick {
                    Show-UDToast "Running report..."
                    Invoke-PSUScript -Integrated -Name $Script | Wait-PSUJob -Integrated
                    Sync-UDElement -Id "$($Title)_Table" 
                    Show-UDToast "Report complete."
                } -Icon (New-UDIcon -Icon 'Play') -ShowLoading 
            }
      
            New-UDAlert -Severity info -Title $Title -Text $Description
      
            New-UDDynamic -Id "$($Title)_Table" -Content {
                $Job = Get-PSUScript -Integrated -Name $Script | Get-PSUJob -Integrated -OrderDirection Descending -OrderBy StartTime -First 1
                if ($Job -eq $null) {
                    Show-UDToast 'Running report...'
                    $Data = Invoke-PSUScript -Integrated -Name $Script -Wait 
                    $JobTime = Get-Date
                }
                else {
                    $Data = $Job | Get-PSUJobPipelineOutput -Integrated
                    $JobTime = $Job.EndTime
                }
      
                New-UDTable -Title $Title -Icon (New-UDIcon -Icon User -Style @{ marginRight = "10px" }) -Data $Data -ShowExport -ShowPagination
                New-UDStack -Direction column -Content {
                    New-UDTypography -Text "Report Created: $JobTime"
                }
            } -LoadingComponent {
                New-UDSkeleton -Height 10
            }
        }
    }
      
    $Reports = @(
        @{
            Title       = "Computers - Disabled"
            Url         = "/reports/computers/disabled"
            Description = "A report of computers that are disabled."
            Module      = "Universal.Apps.ActiveDirectory"
            Command     = "Get-UDDisabledComputers"
        }
        @{
            Title       = "Computers - Domain Controllers"
            Url         = "/reports/computers/domain-controllers"
            Description = "A report of domain controllers."
            Module      = "Universal.Apps.ActiveDirectory"
            Command     = "Get-UDDomainControllers"
        }
        @{
            Title       = "Computers - Inactive"
            Url         = "/reports/computers/inactive"
            Description = "A report of computers that have been inactive for 30 days or more."
            Module      = "Universal.Apps.ActiveDirectory"
            Command     = "Get-UDInactiveComputers"
        }
        @{
            Title       = "Users - Inactive"
            Url         = "/reports/users/inactive"
            Description = "A report of users that have been inactive for 30 days or more."
            Module      = "Universal.Apps.ActiveDirectory"
            Command     = "Get-UDInactiveUsers"
        }
        @{
            Title       = "Users - Locked Out"
            Url         = "/reports/users/locked-out"
            Description = "A report of users that are locked out."
            Module      = "Universal.Apps.ActiveDirectory"
            Command     = "Get-UDLockedOutUsers"
        }
        @{
            Title       = "Users - Never Logged On"
            Url         = "/reports/users/never-logged-on"
            Description = "A report of users that have never logged on."
            Module      = "Universal.Apps.ActiveDirectory"
            Command     = "Get-UDUsersNeverLoggedOn"
        }
        @{
            Title       = "Users - Recently Created"
            Url         = "/reports/users/recently-created"
            Description = "A report of users that have been created in the last 30 days."
            Module      = "Universal.Apps.ActiveDirectory"
            Command     = "Get-UDUsersRecentlyCreated"
        }
        @{
            Title       = "Users - Recently Modified"
            Url         = "/reports/users/recently-modified"
            Description = "A report of users that have been modified in the last 30 days."
            Module      = "Universal.Apps.ActiveDirectory"
            Command     = "Get-UDUsersRecentlyModified"
        }
        @{
            Title       = "Users - Without Manager"
            Url         = "/reports/users/without-manager"
            Description = "A report of users that do not have managers"
            Module      = "Universal.Apps.ActiveDirectory"
            Command     = "Get-UDUsersWithoutManager"
        }
    )
      
    New-UDDashboard -Title "Active Directory Tools" -Pages @(
        & "$PSScriptRoot\pages\Create User.ps1"
        & "$PSScriptRoot\pages\Create Group.ps1"
        & "$PSScriptRoot\pages\Domain Controllers.ps1"
        & "$PSScriptRoot\pages\Groups.ps1"
        & "$PSScriptRoot\pages\Group Membership.ps1"
        & "$PSScriptRoot\pages\Object Info.ps1"
        & "$PSScriptRoot\pages\Object Search.ps1"
        & "$PSScriptRoot\pages\Search Computers.ps1"
        & "$PSScriptRoot\pages\Search Users.ps1"
        & "$PSScriptRoot\pages\Reset Password.ps1"
        & "$PSScriptRoot\pages\Restore Deleted User.ps1"
        New-UDPage -Name 'Reports' -Content {
            New-UDTypography -Text 'Reports' -Variant h4
            New-UDHtml -Markup '<hr/>'
            New-UDLayout -Columns 3 -Content {
                $Reports | ForEach-Object {
                    $Job = Get-PSUScript -Integrated -Name "$($_.Module)\$($_.Command)" | Get-PSUJob -Integrated -OrderDirection Descending -OrderBy StartTime -First 1
                    $LastRun = "Never"
                    $Objects = "Unknown"
                    if ($Job) {
                        $LastRun = $Job.EndTime
                        $Objects = ($Job | Get-PSUJobPipelineOutput -Integrated | Measure-Object).Count
                    }
                    $Url = $_.Url
                    New-UDElement -Content {
                        New-UDCard -Title $_.Title -Content {
                            New-UDStack -Direction column -Content {
                                New-UDTypography -Text $_.Description -Style @{ fontWeight = 'bold'; marginBottom = '5px' }
                                New-UDTypography -Text "Last Run: $LastRun"
                                New-UDTypography -Text "Object Count: $Objects"
                            }
      
                        }
                    } -Tag 'div' -Attributes @{
                        onClick = {
                            Invoke-UDRedirect $Url
                        }
                        style   = @{
                            cursor = 'pointer'
                        }
                    }
                }
            }
      
        }
        $Reports | ForEach-Object {
            New-ADReportPage @_
        }
    ) -NavigationLayout Permanent -LoadNavigation $Navigation
}