Public/New-CitrixScheduledTasks.ps1

<#
.SYNOPSIS
    Ensures Citrix report folder structure exists and creates scheduled tasks under "Citrix Licensing".
 
.DESCRIPTION
    The `New-CitrixScheduledTasks` function:
    - Creates the folder structure at `C:\Reports` if missing.
    - Creates a folder in Task Scheduler called "Citrix Licensing".
    - Adds three scheduled tasks to this folder:
      1. **Report 1** – Runs every minute.
      2. **Report 2** – Runs daily at 12:05 AM (Monday to Friday).
      3. **Report 3** – Runs on the first Monday of each month at 1 AM.
    - Uses the **current user account** to run these tasks.
 
.PARAMETER AdminAddress
    The Citrix Server Admin Address.
 
.PARAMETER Recipients
    The email recipients for the reports.
 
.PARAMETER SmtpServer
    The SMTP server for sending reports.
 
#>

Function New-CitrixScheduledTasks {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]$AdminAddress,

        [Parameter(Mandatory = $true)]
        [string]$Recipients,

        [Parameter(Mandatory = $true)]
        [string]$SmtpServer
    )

    try {

        $ReportFolder = Read-Host "Enter the folder location (Press Enter for default 'C:\Reports')"

        if ([string]::IsNullOrWhiteSpace($ReportFolder)) {
            $ReportFolder = "C:\Reports"
            Create-CitrixReportFolders -Location $ReportFolder
            Write-Host "No input detected. Using default location: $ReportFolder" -ForegroundColor Yellow
        } else {
            Write-Host "You entered: $ReportFolder" -ForegroundColor Green
        }
        
        if (-not (Test-Path -Path $ReportFolder)) {
            Write-Host "Folder does not exist. Creating: $ReportFolder" -ForegroundColor Cyan
            New-Item -Path $ReportFolder -ItemType Directory -Force | Out-Null
            Create-CitrixReportFolders -Location $ReportFolder
        }

        $CurrentUser = "$env:USERDOMAIN\$env:USERNAME"

        $TaskFolder = "Citrix Licensing"
        $scheduleObject = New-Object -ComObject schedule.service
        $scheduleObject.Connect()
        
        $rootFolder = $scheduleObject.GetFolder("\")
        $existingFolders = $rootFolder.GetFolders(0) | Select-Object -ExpandProperty Name

        if ($existingFolders -notcontains $TaskFolder) {
            $rootFolder.CreateFolder($TaskFolder) | Out-Null
        }

        $Action1 = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -WindowStyle Hidden -Command `"Get-CitrixLicenseReport -AdminAddress '$AdminAddress' -Csv -Folder '$ReportFolder'`""
        $Trigger1 = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(1) -RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration (New-TimeSpan -Days 1)
        Register-ScheduledTask -TaskName "Citrix_License_Report_Every_Minute" -TaskPath "\Citrix Licensing" -Action $Action1 -Trigger $Trigger1 -User $CurrentUser -RunLevel Highest -Force

        $Action2 = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -WindowStyle Hidden -Command `"Invoke-CitrixReportProcessing -Recipients '$Recipients' -InputFolder '$ReportFolder\Daily\csv' -OutputFolder '$ReportFolder\Daily\Excel' -SmtpServer '$SmtpServer' -ReportType Daily`""
        $Trigger2 = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday,Tuesday,Wednesday,Thursday,Friday -At "12:05AM"
        Register-ScheduledTask -TaskName "Citrix_Daily_Report" -TaskPath "\Citrix Licensing" -Action $Action2 -Trigger $Trigger2 -User $CurrentUser -RunLevel Highest -Force

        $Action3 = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -WindowStyle Hidden -Command `"Invoke-CitrixReportProcessing -Recipients '$Recipients' -InputFolder '$ReportFolder\Daily\Excel' -OutputFolder '$ReportFolder\Monthly' -SmtpServer '$SmtpServer' -ReportType Monthly`""
        $Trigger3 = New-ScheduledTaskTrigger -Weekly -WeeksInterval 5 -DaysOfWeek Monday -At "1:00AM"
        $Trigger3.Id = "FirstMondayTrigger"
        Register-ScheduledTask -TaskName "Citrix_Monthly_Report" -TaskPath "\Citrix Licensing" -Action $Action3 -Trigger $Trigger3 -User $CurrentUser -RunLevel Highest -Force

    } catch {
        Write-Host "[ERROR] Failed to create scheduled tasks: $($_.Exception.Message)" -ForegroundColor Red
    }
}