# Skript zum erstellen bzw. Anpassen eine Neustarttasks
# Stannek GmbH - Version 1.3 - 15.06.2023 ES

# Diese Skript muss als Administrator ausgeführt werden, ansonsten wird es nicht gestartet
#Requires -RunAsAdministrator

# Parameter
$TaskName = "einmaliger Neustart"

# Assemblys laden
Add-Type -AssemblyName System.Windows.Forms

## Abfrage Fenster ##

# Erstellt das Hauptfenster
$font = New-Object System.Drawing.Font("Arial", 11)
$mainForm = New-Object System.Windows.Forms.Form
$mainForm.Text = "Neustart-Task planen"
$mainForm.Font = $font
$mainForm.ForeColor = "Black"
$mainForm.BackColor = "White"
$mainForm.Width = 300
$mainForm.Height = 200
$mainForm.StartPosition = "CenterScreen"
$mainForm.MaximizeBox = $False

# Erzeugt das Description Label
$DescriptLabel = New-Object System.Windows.Forms.Label
$DescriptLabel.Text = "Wann soll der Computer neustarten?"
$DescriptLabel.Location = "15, 10"
$DescriptLabel.Height = 22
$DescriptLabel.Width = 280
# Fügt Label zum Hauptfenster hinzu
$mainForm.Controls.Add($DescriptLabel)


# Rezeugt das DatePicker Label
$datePickerLabel = New-Object System.Windows.Forms.Label
$datePickerLabel.Text = "Datum"
$datePickerLabel.Location = "15, 45"
$datePickerLabel.Height = 22
$datePickerLabel.Width = 90
# Fügt Label zum Hauptfenster hinzu
$mainForm.Controls.Add($datePickerLabel)

# Erzeugt das TimePicker Label
$TimePickerLabel = New-Object System.Windows.Forms.Label
$TimePickerLabel.Text = "Uhrzeit"
$TimePickerLabel.Location = "15, 80"
$TimePickerLabel.Height = 22
$TimePickerLabel.Width = 90
# Fügt Label zum Hauptfenster hinzu
$mainForm.Controls.Add($TimePickerLabel)

# Erzeugt das DatePicker-Feld
$datePicker = New-Object System.Windows.Forms.DateTimePicker
$datePicker.Location = "110, 42"
$datePicker.Width = "150"
$datePicker.Format = [windows.forms.datetimepickerFormat]::custom
$datePicker.CustomFormat = "dd/MM/yyyy"
# Fügt DatePicker-Feld zum Hauptfenster hinzu
$mainForm.Controls.Add($datePicker)

# Erzeugt das TimePicker-Feld
$TimePicker = New-Object System.Windows.Forms.DateTimePicker
$TimePicker.Location = "110, 77"
$TimePicker.Width = "150"
$TimePicker.Format = [windows.forms.datetimepickerFormat]::custom
$TimePicker.CustomFormat = "HH:mm"
$TimePicker.ShowUpDown = $TRUE
# Fügt TimePicker-Feld zum Hauptfenster hinzu
$mainForm.Controls.Add($TimePicker)

# Erzeugt den OK Button
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = "15, 130"
$okButton.ForeColor = "Black"
$okButton.BackColor = "White"
$okButton.Text = "OK"
# Legt die Button Aktion fest (DialogResult auf OK und Eingabefenster schließen
$okButton.add_Click({$mainForm.DialogResult = "OK";$mainForm.close()})
# Fügt Button zum Hauptfenster hinzu
$mainForm.Controls.Add($okButton)

# Fensterausgabe
[void] $mainForm.ShowDialog()

## Ende Abfrage Fenster ##

# Skript abbrechen, wenn Fenster geschlossen wird
If ($mainForm.DialogResult -eq "Cancel") {Break}

# Datum und Uhrzeit aus Abfrage für Task aufbereiten
$TaskDatetrigger = Get-Date -Date $datePicker.Value.Date -Hour $TimePicker.Value.TimeOfDay.Hours -Minute $TimePicker.Value.TimeOfDay.Minutes

# Erstelle Task oder passe vorhanden Task an

# TaskTrigger Zeit setzen
$TaskTrigger = New-ScheduledTaskTrigger -At $TaskDatetrigger -Once

If ((Get-ScheduledTask -TaskName $Taskname -ErrorAction SilentlyContinue).TaskName -eq $TaskName) 
    {# Setzt den neue Tasktrigger
    Set-ScheduledTask -TaskName $Taskname -Trigger $TaskTrigger
    }
Else
    {# Erstellt Neustart Task, da keiner vorhanden ist
    $TaskAction = New-ScheduledTaskAction -Execute "shutdown.exe" -Argument "/r /f /t 5"
    $TaskSettings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -ExecutionTimeLimit 00:15:00
    $TaskSettings.StartWhenAvailable = $false
    $TaskPrincipal = New-ScheduledTaskPrincipal -UserId $(Get-WMIObject -class Win32_ComputerSystem | select UserName).username -RunLevel Highest -LogonType Interactive
    Register-ScheduledTask -Action $TaskAction -Trigger $TaskTrigger -Settings $TaskSettings -Principal $TaskPrincipal -TaskName $TaskName -Description "Führt einen Neustart des Computers zu einer festgelegten Zeit aus"
    }

# Pruefe Task ob dieser deaktiviert ist
If ((Get-ScheduledTask -TaskName $Taskname).State -eq "Disabled") {Enable-ScheduledTask -TaskName $TaskName}
