Register-ScheduledReboot.ps1

function Register-ScheduledReboot
{
  <#
      .SYNOPSIS
      Creates a scheduled task to restart a computera t a specified time.
      .DESCRIPTION
      Accesses a remote computer to schedule a reboot at the specified time.
      .EXAMPLE
      Register-ScheduledReboot -computer server1 -hour 23 -minute 30
      Creates a scheduled task to invoke the command
        shutdown.exe /d P:2:18 /r /t 30 /f
      at 11:30PM.
  #>

  [CmdletBinding()]
  param
  (
    [Parameter(Mandatory=$false, Position=0)]
    [System.String]
    $computer = 'localhost',
    
    [Parameter(Mandatory=$false, Position=1)]
    [int]
    $hour = 17,
    
    [Parameter(Mandatory=$false, Position=2)]
    [Int]
    $minute = 00
  )
  
  function Register-RebootTask ($hour,$minute,$domain,$user) {
    Get-ScheduledTask -TaskName "Server Reboot - Scheduled" | Unregister-ScheduledTask -Confirm:$false -ErrorAction SilentlyContinue
    $taskAction = New-ScheduledTaskAction -Execute "shutdown.exe" `
    -Argument "/d P:2:18 /r /t 30 /f"
    $taskTrigger = New-ScheduledTaskTrigger -Once -At (Get-Date -hour $hour  -Minute $minute -Second 00)
    #$Principal = New-ScheduledTaskPrincipal -UserID "$domain\$user" -LogonType ServiceAccount -RunLevel Highest
    $Principal = New-ScheduledTaskPrincipal -GroupId "BUILTIN\Administrators" -RunLevel Highest
    Register-ScheduledTask -Action $taskAction -Trigger $taskTrigger -TaskName "Server Reboot - Scheduled" -Description "Scheduled System Reboot by $domain\$user. Created at $(Get-Date)." -Principal $Principal
    Get-ScheduledTask -TaskName "Server Reboot - Windows Update"
    }

  Invoke-Command -ComputerName $computer -ScriptBlock ${function:Register-RebootTask} -ArgumentList $hour,$minute,$env:USERDOMAIN,$env:USERNAME
}