SetUpBasic.TaskScheduler.ps1

#EasyTaskscheduler -Name "Once1" -Program "C:\base\github.com\NaitWatch\PwshSrvConfigHelper\common.ps1" -Arguments @("hello") -Time "04:00:00" -day @("Sunday")
#EasyTaskscheduler -Name "Once2" -Program "C:\base\github.com\NaitWatch\PwshSrvConfigHelper\common.ps1" -Time "05:00:00" -day @("Sunday")
#EasyTaskscheduler -Name "Once3" -Program "c:\temp\x.ps1" -Arguments @("foo","fa il") -Time "05:00:00"
#EasyTaskscheduler -Name "Once4" -Program "c:\temp\x x.bat" -Arguments @("foo","fa il")
#EasyTaskscheduler -Name "Once5" -Program "$env:comspec.exe" -Arguments @("/c","""c:\temp\x x.bat""","""foo""")

function EasyTaskscheduler {

    param (
        [Parameter(Mandatory)]
        [string]$Name,
        [Parameter(Mandatory)]
        [string]$Program,
        [string[]]$Arguments,
        [timespan]$Time,
        [dayofweek[]]$day = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'),
        [bool]$LaunchAsapIfMissed = $false
    )
    
    #starTime is required for a task to start the operations at a specific date, calculating a default at current day 00:00 if no starttime was givven
    [datetime]$startTime = $(Get-Date)
    if ($Time -eq $null)
    {
        $startTime = $($(Get-Date) - $(Get-Date).TimeOfDay)
    }
    else {
        $startTime = $($(Get-Date) - $(Get-Date).TimeOfDay) + $Time
    }

    if ($Program.EndsWith(".ps1") -or $Program.EndsWith(".ps1")  )
    {
        #if the program is a powershell script, that set the program exe to powershell.exe and pass the .ps1 + arguments as parameter
        $temp = @() ;  $Arguments | ForEach-Object{ $temp += """$_""" } ;
        if ($Arguments.Count -gt 0)
        {
            $Arguments = $temp
        }
        else {
            $Arguments = $null
        }
        $Argument = "-ExecutionPolicy Bypass -File ""$Program"" $($Arguments -join " ") ";
        $Program = """$($(Get-Command "powershell.exe").Source)""";
    }
    elseif ($Program.EndsWith(".cmd") -or $Program.EndsWith(".bat")  )
    {
        $temp = @() ;  $Arguments | ForEach-Object{ $temp += """$_""" } ;
        if ($Arguments.Count -gt 0)
        {
            $Arguments = $temp
        }
        else {
            $Arguments = $null
        }
        $Argument = "/c "" ""$Program"" $($Arguments -join " ") """;
        $Program = """$($(Get-Command "cmd.exe").Source)""";
    }
    else {
        $Argument = "$($Arguments -join " ")";
    }

    $actions = (New-ScheduledTaskAction -Execute "$Program" -Argument "$Argument" -Id "$Name")
    $trigger = New-ScheduledTaskTrigger -Weekly -WeeksInterval 1 -DaysOfWeek $day -At $startTime
    $principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest

    if ($LaunchAsapIfMissed)
    {
        $settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 15) -StartWhenAvailable
    }
    else {
        $settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 15)
    }
    
    $task = New-ScheduledTask -Action $actions -Principal $principal -Trigger $trigger -Settings $settings
    
    Register-ScheduledTask "$Name" -Force -InputObject $task
}

Add-Type @'
public enum LogonUserType {
    SYSTEM = 0,
    CURRENTUSER = 1,
    ANYUSER = 2,
}
'@


Add-Type @'
public enum ScheduleType{
    TIME = 0,
    LOGON = 1,
}
'@


function Private-New-SubTask {
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseApprovedVerbs", "")]
    param (
        [Parameter(Mandatory)]
        [string]$Name,
        [Parameter(Mandatory)]
        [string]$Program,
        [string]$Arguments = "",

        [ScheduleType]$ScheduleType = [ScheduleType]::LOGON,
        [LogonUserType]$LogonUserType = [LogonUserType]::CURRENTUSER,
        [bool]$HideScripts = $false,

        [timespan]$Time,
        [dayofweek[]]$day = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday')

    )

    #starTime is required for a task to start the operations at a specific date, calculating a default at current day 00:00 if no starttime was givven
    [datetime]$startTime = $(Get-Date)
    if ($Time -eq $null)
    {
        $startTime = $($(Get-Date) - $(Get-Date).TimeOfDay)
    }
    else {
        $startTime = $($(Get-Date) - $(Get-Date).TimeOfDay) + $Time
    }

    Private-Script-Task-Helper -Program ([ref]$Program) -Arguments ([ref]$Arguments) -HideScripts $HideScripts

    if ($Arguments.Trim() -eq "")
    {
        $actions = (New-ScheduledTaskAction -Execute "$Program" -Id "$Name")
    }
    else {
        $actions = (New-ScheduledTaskAction -Execute "$Program" -Argument "$Arguments" -Id "$Name")
    }

    if ($LogonUserType -eq [LogonUserType]::SYSTEM)
    {
        $principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest
    }
    elseif ($LogonUserType -eq [LogonUserType]::CURRENTUSER) {
        $principal = New-ScheduledTaskPrincipal -UserId "$([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)" -LogonType Interactive
    }
    elseif ($LogonUserType -eq [LogonUserType]::ANYUSER) {
        $principal = New-ScheduledTaskPrincipal -GroupId "NT AUTHORITY\Interactive"
    }

    if ($ScheduleType -eq [ScheduleType]::TIME)
    {
        $trigger = New-ScheduledTaskTrigger -Weekly -WeeksInterval 1 -DaysOfWeek $day -At $startTime
        $settings = New-ScheduledTaskSettingsSet -StartWhenAvailable
    }
    elseif ($ScheduleType -eq [ScheduleType]::LOGON)
    {
        if ($LogonUserType -eq [LogonUserType]::SYSTEM)
        {
            $trigger = New-ScheduledTaskTrigger -AtLogon
            $settings = New-ScheduledTaskSettingsSet
        }
        elseif ($LogonUserType -eq [LogonUserType]::CURRENTUSER) {
            $trigger = New-ScheduledTaskTrigger -AtLogon -User "$([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)"
            $settings = New-ScheduledTaskSettingsSet
        }
        elseif ($LogonUserType -eq [LogonUserType]::ANYUSER) {
            $trigger = New-ScheduledTaskTrigger -AtLogon
            $settings = New-ScheduledTaskSettingsSet
        }

    }

    $task = New-ScheduledTask -Action $actions -Principal $principal -Trigger $trigger -Settings $settings

    Register-ScheduledTask "$Name" -Force -InputObject $task
}

function Private-Script-Task-Helper {
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseApprovedVerbs", "")]
    param (
        [Parameter(Mandatory)]
        [ref]$Program,
        [Parameter(Mandatory)]
        [ref]$Arguments,
        [Parameter(Mandatory)]
        [bool]$HideScripts
    )

    [string]$NewProgram
    [string]$NewArguments

    if ($Program.Value.EndsWith(".ps1") -and ($HideScripts -eq $false))
    {
        $NewProgram = "$([System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName)"
        $NewArguments = "-ExecutionPolicy Bypass -File $($Program.Value) $($Arguments.Value)"
    }
    if ($Program.Value.EndsWith(".ps1") -and ($HideScripts -eq $true))
    {
        $NewProgram = "$PSScriptRoot\SubSystemWin.exe"
        $NewArguments = "$([System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName) -ExecutionPolicy Bypass -File $($Program.Value) $($Arguments.Value)"
    }
    else {
        $NewProgram = $Program.Value
        $NewArguments = $Arguments.Value 
    }

    $Program.Value = $NewProgram
    $Arguments.Value = $NewArguments

}

#(Get-ChildItem -recurse -LiteralPath 'C:\Windows\System32\Tasks' -File) | where-object { $_.VersionInfo -Like '*RBCM*' } | Select-Object -Property FullName
function test{
   

    #Get-ScheduledTask -TaskPath '*' | where-object { $_.TaskPath -Like '*xxxx*' } | ForEach-Object { Unregister-ScheduledTask -TaskName $_.TaskName -TaskPath $_.TaskPath -Confirm:$false }
    
    #must be x64 session
    $usr = "local"
    $pawd = "123"
    Remove-LocalUser -Name "$usr" | Out-Null
    New-LocalUser "$usr" -Password (ConvertTo-SecureString "$pawd" -AsPlainText -Force) -FullName "$usr" -Description "$usr" -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword
    Add-LocalGroupMember -Group "Administrators" -Member "$usr"

    Stop-Service -Name "Fax" -Force
    Set-Service  -Name "Fax" -Startuptype Disable
    #Remove-Service -Name "Fax"

    #test
    #$x = 1
}


#Private-New-SubTask -Name "1aaatesting" -Program "C:\temp\test.ps1" -Arguments "-Argss abs" -ScheduleType LOGON -LogonUserType CURRENTUSER
#New-SubTask -Name "1aaatesting" -Program "C:\temp\test.ps1" -HideScript $true -ScheduleType LOGON -LogonUserType CURRENTUSER