-
Notifications
You must be signed in to change notification settings - Fork 2
/
setup.ps1
120 lines (107 loc) · 3.47 KB
/
setup.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
using namespace System.Security.Principal
param (
[switch] $Run,
[switch] $Uninstall
)
$ErrorActionPreference = "Stop"
$UpdateActiveHours = {
$key = "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings"
$hour = (get-date).hour
if ($hour -ge 18 -or $hour -lt 6) {
Set-ItemProperty $key ActiveHoursStart 18
Set-ItemProperty $key ActiveHoursEnd 12
}
else {
Set-ItemProperty $key ActiveHoursStart 6
Set-ItemProperty $key ActiveHoursEnd 0
}
Set-ItemProperty $key IsActiveHoursEnabled 1
}
function GetTask {
return Get-ScheduledTask | Where-Object { $_.TaskName -eq $TaskName -and $_.TaskPath -eq $TaskPath }
}
function RunTask {
$task = GetTask
if ($task) {
$task | Start-ScheduledTask
Write-Output "$TaskPath$TaskName executed"
}
else {
Write-Output "$TaskPath$TaskName not found"
}
}
function InstallTask {
$command = EncodeCommand $UpdateActiveHours
$arguments = "-NoLogo -NonInteractive -WindowStyle Hidden"
$options = @{
Force = $true
Action = New-ScheduledTaskAction `
-Execute "powershell" `
-Argument "$arguments -EncodedCommand $command"
Principal = New-ScheduledTaskPrincipal `
-UserId "LOCALSERVICE" `
-LogonType ServiceAccount `
-RunLevel Highest
Settings = New-ScheduledTaskSettingsSet `
-WakeToRun `
-StartWhenAvailable `
-DontStopOnIdleEnd `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries
Trigger = @(
New-ScheduledTaskTrigger_AtWakeUp
New-ScheduledTaskTrigger -AtStartup
New-ScheduledTaskTrigger -Daily -At "06:00"
New-ScheduledTaskTrigger -Daily -At "18:00"
)
}
Register-ScheduledTask $TaskName $TaskPath @options | Out-Null
Write-Output "$TaskPath$TaskName installed"
RunTask
}
function UninstallTask {
$task = GetTask
if ($task) {
$task | Unregister-ScheduledTask -Confirm:$false
$pathName = $TaskPath.Replace("\", "")
$scheduleObject = New-Object -ComObject Schedule.Service
$scheduleObject.Connect()
$rootFolder = $scheduleObject.GetFolder("\")
$rootFolder.DeleteFolder("$pathName", $null)
Write-Output "$TaskPath$TaskName uninstalled"
}
else {
Write-Output "$TaskPath$TaskName not found"
}
}
function New-ScheduledTaskTrigger_AtWakeUp {
$name = "MSFT_TaskEventTrigger"
$namespace = "Root/Microsoft/Windows/TaskScheduler:MSFT_TaskEventTrigger"
$class = Get-CimClass -ClassName $name -Namespace $namespace
$trigger = New-CimInstance -CimClass $class -ClientOnly
$trigger.Enabled = $true
$trigger.Subscription = "<QueryList><Query Id=""0"" Path=""System""><Select Path=""System"">*[System[Provider[@Name='Microsoft-Windows-Power-Troubleshooter'] and EventID=1]]</Select></Query></QueryList>"
return $trigger
}
function EncodeCommand {
param ([string] $command)
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
return $encodedCommand
}
if (-not ([WindowsPrincipal][WindowsIdentity]::GetCurrent()).IsInRole([WindowsBuiltInRole]::Administrator)) {
Write-Output "Run as administrator"
exit
}
$TaskName = "Update"
$TaskPath = "\Win10ActiveHours\"
if ($Run.IsPresent) {
RunTask
}
elseif ($Uninstall.IsPresent) {
UninstallTask
}
else {
InstallTask
}
exit