Files
2026-05-11 09:15:08 +02:00

143 lines
4.4 KiB
PowerShell

# Get the report names from the files in the Module folder
function Get-Reports {
# Get the path to the module
$atapFile = (Get-Module -ListAvailable ATAPAuditor).Path
if ($atapFile.Count -gt 1) {
$atapFile = $atapFile[0] # use the first result if there are several
} elseif ($atapFile.Count -eq 0) {
Write-Host "The ATAP module could not be found."
pressAnyKeyToQuit
Exit
}
# find all *.ps1 report files
$atapDir = Split-Path -parent $atapFile
$reportsDir = Join-Path -Path $atapDir -ChildPath "Reports"
$reportFiles = Get-ChildItem -Path "$reportsDir\*.ps1" -Recurse
# Build a dictionary from the file names without the extension
$i = 1
$reports = [ordered]@{}
foreach ($reportName in $reportFiles) {
$reports.add([string]$i, $reportName.BaseName)
$i++
}
return $reports
}
# present a menu based on the dict given as argument
function Show-Menu {
param (
[System.Collections.Specialized.OrderedDictionary]$reports
)
Clear-Host
Write-Host "============== AuditTAP Reports ==============`n"
$padCount = ([string]$reports.Count).Length
foreach ($item in $reports.GetEnumerator()) {
Write-Host (' {0}: {1}' -f $item.Key.PadLeft($padCount, ' '), $item.Value)
}
Write-Host ""
}
function askSelection {
param (
[System.Collections.Specialized.OrderedDictionary]$reports
)
$retry = $false
:loop while ($true) {
# show menu and ask the user for a selection (or multiple)
Show-Menu $reports
if ($retry) {
[string]$selection = Read-Host "Invalid selection. Please try again`nYou can select multiple reports by comma separating the numbers"
} else {
[string]$selection = Read-Host "Please choose a report to run`nYou can select multiple reports by comma separating the numbers"
}
# sanitize input data
$selection = $selection -replace '\s',''
$selection = $selection.Trim(',')
$selectionArray = $selection.Split(",")
$selectionArray = $selectionArray | Select-Object -Unique
# Check if requested reports are valid / actually present
$reportsValid = @()
foreach ($i in $selectionArray) {
if (!$reports.Contains($i)) {
Write-Host "Report $i does not exist"
$retry = $true
Continue loop
} else {
$reportsValid += $reports[$i]
}
}
# return the list of valid reports as an array of strings
return $reportsValid
}
}
function runReports {
param (
[string[]]$report
)
Clear-Host
Import-Module -Name ATAPAuditor -Force
foreach ($i in $report) {
Write-Host "Running report: $i"
Save-ATAPHtmlReport -ReportName $i -Force
Write-Host ""
}
}
function isAdmin {
$unixOS = [System.Environment]::OSVersion.Platform -eq 'Unix'
if ($unixOS) {
return ($(id -u) -eq 0)
} else {
return ([Security.Principal.WindowsIdentity]::GetCurrent().Groups -contains 'S-1-5-32-544')
}
}
function pressAnyKeyToQuit {
if ($psISE) {
Return
}
Write-Host "Press any key to quit"
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
}
if (!(isAdmin)) {
Write-Host "Please run as administrator`n"
pressAnyKeyToQuit
} else {
$reports = Get-Reports
Show-Menu $reports
$sel = askSelection $reports
runReports $sel
if ([System.Environment]::OSVersion.Platform -eq 'Unix') {
if (($env:XDG_SESSION_TYPE -eq 'tty') -or ($null -eq $env:SUDO_USER)) {
# 1. reason to return: no graphical environment to open the file explorer
# 2. reason to return: we do not want to open the file explorer as root
Return
}
}
[string]$action = Read-Host "Do you want to open the output directory? (Y/N)"
if ($action -eq 'y' -or $action -eq 'Y') {
if ($null -eq $env:ATAPReportPath) {
$outPath = [Environment]::GetFolderPath('MyDocuments') | Join-Path -ChildPath 'ATAPReports'
} else {
$outPath = $env:ATAPReportPath
}
if (Test-Path -Path $outPath) {
if ([System.Environment]::OSVersion.Platform -eq 'Unix') {
su $env:SUDO_USER -c "xdg-open $outPath"
} else {
explorer.exe $outPath
}
}
}
}