2023-07-12 20:37:31 +00:00
#!/bin/pwsh
2023-06-22 20:56:43 +00:00
. " $PSScriptRoot /../Scripts/Context.ps1 " ;
2023-06-29 18:01:54 +00:00
$preparedUsernameProperty = " AutoLoginUser " ;
$preparedPasswordProperty = " AutoLoginPassword " ;
$autoLoginTriggerProperty = " AutoLoginTrigger " ;
2023-06-29 17:24:42 +00:00
$uacDisablerTriggerProperty = " UACDisablerTrigger " ;
2023-06-22 20:56:43 +00:00
function New-PersonalUser([Context ] $context )
{
2023-06-30 01:38:18 +00:00
if ( -not ( Get-LocalUser $context . UserName -ErrorAction SilentlyContinue ) )
2023-06-22 20:56:43 +00:00
{
2023-06-23 12:04:46 +00:00
Write-Host " Creating Personal User " ;
2023-06-22 21:36:45 +00:00
while ( $true ) {
Write-Host (
[ string ] :: Join (
" `n " ,
" So... Windows is too dumb to create users which are bound to a Microsoft Account. " ,
" Thus, you have to do it by yourself. " ,
" So sorry... " ) ) ;
2023-06-22 20:56:43 +00:00
2023-06-23 10:34:12 +00:00
$users = Get-LocalUser | ForEach-Object { $_ . Name } ;
2023-06-23 00:34:53 +00:00
Write-Host " Following users exist already: "
Write-Host $users ;
2023-06-22 21:36:45 +00:00
Read-Host " Please hit enter once you're done... " ;
2023-06-22 21:39:49 +00:00
$user = Get-LocalUser | Where-Object { -not ( $users -contains $_ . Name ) } | Select-Object -Last 1 ;
2023-06-22 21:36:45 +00:00
if ( $user ) {
2023-06-22 22:20:30 +00:00
Write-Information " Found New User: " ;
Write-Information $user ;
2023-06-22 21:36:45 +00:00
break ;
}
}
2023-06-22 20:56:43 +00:00
2023-06-23 18:16:47 +00:00
Write-Information " Renaming the new User to $( $context . UserName ) " ;
2023-06-26 22:57:24 +00:00
Rename-LocalUser $user $context . UserName ;
2023-06-28 20:36:40 +00:00
Add-LocalGroupMember -Group " Administrators " -Member $user & & Set-LocalUser $context . AdminName -Password ( ConvertTo-SecureString -AsPlainText " Admin " ) & & Disable-LocalUser $context . AdminName ;
2023-06-23 18:16:47 +00:00
2023-06-29 13:05:06 +00:00
Write-Host " Registering setup script for all new users " ;
$context . RegisterNewUserReboot ( ) ;
2023-06-28 20:10:23 +00:00
Write-Information " Enabling UAC for the next login (Microsoft Account login won't work otherwise, lol) " ;
2023-06-28 23:51:30 +00:00
Enable-UACNextLogin $context ;
2023-06-28 20:10:23 +00:00
Write-Information " Disabling Auto login " ;
2023-06-25 16:26:06 +00:00
$context . RemoveAutologin ( ) ;
2023-06-29 17:13:33 +00:00
$context . SetStage ( " DisableUAC " ) ;
2023-06-25 16:11:30 +00:00
Restart-Computer ;
2023-06-25 16:11:56 +00:00
exit ;
2023-06-22 20:56:43 +00:00
}
2023-06-29 17:13:33 +00:00
elseif ( $context . GetStage ( ) -eq " DisableUAC " )
2023-06-28 20:28:22 +00:00
{
2023-06-29 17:05:22 +00:00
Enable-PersonalUserAutologon $context ;
2023-06-29 15:29:42 +00:00
$context . RegisterReboot ( ) ;
2023-06-30 02:29:59 +00:00
$context . SetStage ( " RemoveAdmin " ) ;
2023-06-29 17:24:42 +00:00
Write-EventLog -LogName Application -Source " Application " -EventId $context . Get ( $uacDisablerTriggerProperty ) -Message " This event was created by $env:Username " ;
2023-06-29 15:27:00 +00:00
exit ;
2023-06-28 20:28:22 +00:00
}
2023-06-30 02:29:59 +00:00
elseif ( $context . GetStage ( ) -eq " RemoveAdmin " )
{
Write-Information " Removing Admin Account " ;
Get-CimInstance -ClassName " Win32_UserProfile " -Filter " SID = ' $( ( Get-LocalUser $context . AdminName ) . SID ) ' " | Remove-CimInstance ;
2023-06-30 09:54:32 +00:00
$context . RemoveStage ( ) ;
2023-06-30 02:29:59 +00:00
}
2023-06-22 20:56:43 +00:00
}
2023-06-28 09:48:08 +00:00
2023-06-28 23:51:30 +00:00
function Enable-UACNextLogin([Context ] $context ) {
2023-07-03 11:44:51 +00:00
$context . SetUACState ( $true ) ;
2023-06-29 02:05:12 +00:00
$tempTask = " PortValhalla Temp " ;
2023-06-30 09:57:50 +00:00
$autoLoginName = " PortValhalla AutoLogin Setup " ;
$uacDisablerName = " PortValhalla UAC Disabler " ;
2023-06-30 01:40:04 +00:00
$autoLoginTrigger = Get-Random -Maximum 65535 ;
$uacDisablerTrigger = Get-Random -Maximum 65535 ;
2023-06-29 17:24:42 +00:00
2023-06-29 18:01:54 +00:00
$context . Set ( $autoLoginTriggerProperty , $autoLoginTrigger , " DWord " ) ;
2023-06-29 17:24:42 +00:00
$context . Set ( $uacDisablerTriggerProperty , $uacDisablerTrigger , " DWord " ) ;
2023-06-28 09:48:08 +00:00
2023-06-30 00:49:00 +00:00
$optionCollection = [ System.Tuple[int, string, string[]][] ] @ (
2023-06-29 18:01:54 +00:00
[ System.Tuple ] :: Create (
$autoLoginTrigger ,
2023-06-30 09:57:50 +00:00
$autoLoginName ,
2023-06-29 18:01:54 +00:00
@ (
" . ' $PSScriptRoot /../Scripts/Context.ps1'; " ,
" `$ context = [Context]::new(); " ,
" `$ username = `$ context.Get(' $preparedUsernameProperty '); " ,
" `$ password = `$ context.Get(' $preparedPasswordProperty '); " ,
" `$ context.SetAutologin( `$ username, `$ password); " ,
2023-06-30 10:01:18 +00:00
" `$ context.Remove(' $preparedUsernameProperty '); " ,
2023-06-29 18:01:54 +00:00
" `$ context.Remove(' $preparedPasswordProperty '); " ) ) ,
2023-06-29 17:40:54 +00:00
[ System.Tuple ] :: Create (
$uacDisablerTrigger ,
" PortValhalla UAC Disabler " ,
2023-06-28 20:06:35 +00:00
@ (
2023-06-30 09:58:16 +00:00
" Unregister-ScheduledTask -Confirm: `$ false ' $autoLoginName '; " ,
2023-06-29 00:54:31 +00:00
" Unregister-ScheduledTask -Confirm: `$ false ' $uacDisablerName '; " ,
2023-06-29 00:53:54 +00:00
" . ' $PSScriptRoot /../Scripts/Context.ps1'; " ,
2023-06-28 23:51:30 +00:00
" `$ context = [Context]::new(); " ,
2023-07-03 11:44:51 +00:00
" `$ context.SetUACState( `$ false); " ,
2023-07-03 11:43:58 +00:00
" `$ context.Remove(' $autoLoginTriggerProperty '); " ,
" `$ context.Remove(' $uacDisablerTriggerProperty '); " ,
2023-06-29 15:29:42 +00:00
" `$ context.DeregisterNewUserReboot(); " ,
2023-06-29 00:57:10 +00:00
" Restart-Computer -Force; " ) ) ) ;
2023-06-28 19:20:59 +00:00
2023-06-29 17:40:54 +00:00
foreach ( $options in $optionCollection ) {
$action = New-ScheduledTaskAction -Execute " pwsh.exe " -Argument (
[ string ] :: Join (
" " ,
(
@ ( " -c " ) +
( $options . Item3 | ForEach-Object { $_ . TrimEnd ( " ; " ) + " ; " } ) ) ) ) ;
schtasks / Create / SC ONEVENT / EC Application / MO " *[System[Provider[@Name='Application'] and EventID= $( $options . Item1 ) ]] " / TR cmd . exe / TN " $tempTask " ;
$trigger = ( Get-ScheduledTask $tempTask ) . Triggers ;
$principal = New-ScheduledTaskPrincipal -UserId " SYSTEM " -RunLevel Highest ;
$task = New-ScheduledTask -Action $action -Principal $principal -Trigger $trigger ;
$null = Register-ScheduledTask $options . Item2 -InputObject $task ;
$null = Unregister-ScheduledTask -Confirm: $false $tempTask ;
}
2023-06-28 09:48:08 +00:00
}
2023-06-28 20:50:39 +00:00
2023-06-29 17:05:22 +00:00
function Enable-PersonalUserAutologon([Context ] $context )
2023-06-28 20:50:39 +00:00
{
Add-Type -assemblyname System . DirectoryServices . AccountManagement ;
Write-Information " Re-Enabling Autologin for Current User " ;
$principalContext = [ System.DirectoryServices.AccountManagement.PrincipalContext ] :: new ( " Machine " ) ;
while ( $true )
{
$password = Read-Host " Please enter the password of your user " -MaskInput ;
if ( $principalContext . ValidateCredentials ( $context . UserName , $password ) )
{
break ;
}
else {
Write-Error " The specified password is incorrect! " ;
}
}
2023-06-29 18:01:54 +00:00
$context . Set ( $preparedUsernameProperty , $context . UserName , " ExpandString " ) ;
2023-06-30 02:36:28 +00:00
$context . Set ( $preparedPasswordProperty , $password , " ExpandString " ) ;
2023-06-29 18:01:54 +00:00
Write-EventLog -LogName Application -Source " Application " -EventId $context . Get ( $autoLoginTriggerProperty ) -Message " This event was created by $env:Username " ;
2023-06-28 20:50:39 +00:00
}