ContentLibrary/Hackathon/Content-Pages/1Get-UDSystemUsers.ps1
Function 1Get-UDSystemUsers () { $PageText = 'Users' $PageName = 'SystemUsers' $UDPage = New-UDPage -Name:($PageName) -Content { New-UDRow { New-UDColumn -Size 3 { $LegendOptions = New-UDChartLegendOptions -Position right $Options = New-UDLineChartOptions -LegendOptions $LegendOptions New-UDChart -Title "Active Users" -Type pie -RefreshInterval 60 -Endpoint { try { $object = @(); $object += [PSCustomObject]@{ "Enabled" = "Active"; "Data" = (Get-JCUser -activated $true).count } $object += [PSCustomObject]@{ "Enabled" = "Pending"; "Data" = (Get-JCUser -activated $false).count } $object | Out-UDChartData -DataProperty "Data" -LabelProperty "Enabled" -BackgroundColor @("#803AE8CE", "#80962F23") -HoverBackgroundColor @("#803AE8CE", "#80962F23") } catch { 0 | Out-UDChartData -DataProperty "Count" -LabelProperty "Name" } } -Options $Options # MFA Users New-UDChart -Title "MFA Enrollment" -Type pie -RefreshInterval 60 -Endpoint { try { $object = @(); $object += [PSCustomObject]@{ "Enabled" = "Active"; "Data" = (Get-JCUser -totp_enabled $true).count } $object += [PSCustomObject]@{ "Enabled" = "Pending"; "Data" = (Get-JCUser -totp_enabled $false).count } $object | Out-UDChartData -DataProperty "Data" -LabelProperty "Enabled" -BackgroundColor @("#803AE8CE", "#80962F23") -HoverBackgroundColor @("#803AE8CE", "#80962F23") } catch { 0 | Out-UDChartData -DataProperty "Count" -LabelProperty "Name" } } -Options $Options # Expired Users New-UDGrid -Title "Expired Users" -Properties @("Username", "Email") -Endpoint { Get-JCUser -password_expired $true | ForEach-Object { [PSCustomObject]@{ Username = (New-UDLink -Text $_.username -Url "https://console.jumpcloud.com/#/users/$($_.id)/details" -OpenInNewWindow); Email = $_.email } } | Out-UDGridData } # Suspended Users New-UDGrid -Title "Suspended Users" -Properties @("Username", "Email") -Endpoint { Get-JCUser -suspended $true | ForEach-Object { [PSCustomObject]@{ Username = (New-UDLink -Text $_.username -Url "https://console.jumpcloud.com/#/users/$($_.id)/details" -OpenInNewWindow); Email = $_.email } } | Out-UDGridData } } New-UDColumn -Size 6 { # Locked out Users New-UDGrid -Title "Locked Out Users" -AutoRefresh -RefreshInterval 1 -Properties @("Username", "Email", "Unlock") -Endpoint { Get-JCUser -account_locked $true | ForEach-Object { [PSCustomObject]@{ Username = (New-UDLink -Text $_.username -Url "https://console.jumpcloud.com/#/users/$($_.id)/details" -OpenInNewWindow); Email = $_.email; Unlock = (New-UDButton -Text "Unlock" -OnClick { Set-JCUser $_.username -account_locked $false; Show-UDToast -Message "User $($_.username) is unlocked!"; }); } } | Out-UDGridData } New-UDGrid -Title "AD-Managed Users" -AutoRefresh -RefreshInterval 1 -Properties @("Username", "Email", "Disassociate") -Endpoint { Get-JCUser -externally_managed $true | ForEach-Object { [PSCustomObject]@{ Username = (New-UDLink -Text $_.username -Url "https://console.jumpcloud.com/#/users/$($_.id)/details" -OpenInNewWindow); Email = $_.email; Disassociate = (New-UDButton -Text "Disassociate" -OnClick { Set-JCUser $_.username -externally_managed $false; Show-UDToast -Message "User $($_.username) is no longer managed by AD!"; }); } } | Out-UDGridData } # Password expirations in the next 30 days New-UDGrid -Title "Upcoming Password Expirations (Expiring in the next 30 days)" -Properties @("Username", "Email", "Password Expiration Date") -Endpoint { Get-JCUser -filterDateProperty password_expiration_date -dateFilter before -date (Get-Date).AddDays(30) -returnProperties username, password_expiration_date, firstname, lastname, email -password_expired $false -externally_managed $false -activated $true | Sort-Object password_expiration_date -Descending | ForEach-Object { [PSCustomObject]@{ "Password Expiration Date" = $_.password_expiration_date; Username = (New-UDLink -Text $_.username -Url "https://console.jumpcloud.com/#/users/$($_.id)/details" -OpenInNewWindow); Email = $_.email } } | Out-UDGridData } } New-UDColumn -Size 3 { # Users created in the last 30 days New-UDGrid -Title "New Users (Created in the last 30 days)" -Properties @("Username", "Email", "Created") -Endpoint { Get-JCUser -filterDateProperty created -dateFilter after -date (Get-Date).AddDays(-30) | Sort-Object created -Descending | ForEach-Object { [PSCustomObject]@{ Created = $_.created; Username = (New-UDLink -Text $_.username -Url "https://console.jumpcloud.com/#/users/$($_.id)/details" -OpenInNewWindow); Email = $_.email } } | Out-UDGridData } New-UDGrid -Title "Deleted Users (Deleted in the last 7 days)" -Properties @("Username", "First Name", "Last Name", "Email", "Deleted") -Endpoint { # User Deletes $IncrementType = "days" #hours, minutes are alternatives $UTCOffset = 7 $IncrementAmount = 1 $StartDate = (Get-Date).AddDays(-7).AddHours($UTCOffset) $EndDate = (Get-Date).AddHours($UTCOffset) $EventsArray = @() [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $TimeIncrements = Do { $startDate = Switch ($IncrementType) { 'hours' { (Get-Date -Date:($startDate)).AddHours($IncrementAmount) } 'minutes' { (Get-Date -Date:($startDate)).AddMinutes($IncrementAmount) } 'days' { (Get-Date -Date:($startDate)).AddDays($IncrementAmount) } Default { Write-Error ('Unknown increment value.') } } (Get-Date -Date:($startDate) -Format s) } Until ($startDate -ge $endDate) For ($i = 1; $i -le $TimeIncrements.Length - 1; $i++) { $startTime = ($TimeIncrements[$i - 1]) $endTime = ($TimeIncrements[$i]) Write-Host ('Pulling events from ' + $startTime + ' to ' + $endTime) $UrlTemplate = 'https://events.jumpcloud.com/events?startDate={0}Z&endDate={1}Z' $url = $UrlTemplate -f $startTime, $endTime $hdrs = @{"X-API-KEY" = "a5b5e17089971807a2663080d9e2ee8b79325459" } $events = Invoke-RestMethod -Method GET -Uri $url -Header $hdrs if ($events) { Write-Host ("$($events.count) " + 'events found in range ' + $startTime + ' to ' + $endTime ) $EventsArray += $events } $DeleteEvents = $EventsArray | Where-Object type -EQ 'systemusers' | Where-Object { $_.details.action -EQ 'DELETE' } } $DeleteEvents | Sort-Object time -Descending | ForEach-Object { [PSCustomObject]@{ Deleted = $_.time; Username = $_.details.document.username; Email = $_.details.document.email } } | Out-UDGridData } } } } $UDSideNavItem = New-UDSideNavItem -Text:($PageText) -PageName:($PageName) -Icon:('Users') Return [PSCustomObject]@{ 'UDPage' = $UDPage; 'UDSideNavItem' = $UDSideNavItem; } } |