Restructure the project
This commit is contained in:
parent
3c1c4f2710
commit
78fc179bf2
|
@ -1,56 +1,18 @@
|
|||
using namespace Microsoft.Win32;
|
||||
using namespace System.Management.Automation.Host;
|
||||
using namespace System.Security.AccessControl;
|
||||
using namespace System.Security.Principal;
|
||||
|
||||
enum WindowsInstallerStage {
|
||||
Initialize
|
||||
Run
|
||||
Cleanup
|
||||
Completed
|
||||
}
|
||||
|
||||
enum SetupStage {
|
||||
Initialize
|
||||
Configure
|
||||
Install
|
||||
CreateUser
|
||||
}
|
||||
|
||||
enum BackupStage {
|
||||
Initialize
|
||||
Backup
|
||||
BackupUsers
|
||||
}
|
||||
|
||||
enum UserStage {
|
||||
Create
|
||||
Configure
|
||||
Cleanup
|
||||
Completed
|
||||
}
|
||||
|
||||
$null = New-Module {
|
||||
[string] $configRoot = "HKLM:\Software\PortValhalla";
|
||||
[string] $stageOption = "Stage";
|
||||
[string] $setupStageOption = "SetupStage";
|
||||
[string] $backupStageOption = "BackupStage";
|
||||
[string] $userOption = "SetupUser";
|
||||
[string] $userStageOption = "UserStage";
|
||||
[string] $accountOption = "MSAccount";
|
||||
[string] $finishedOption = "Finished";
|
||||
[RegistryKey] $key = $null;
|
||||
. "$PSScriptRoot/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../Windows/Scripts/Registry.ps1";
|
||||
. "$PSScriptRoot/../../Windows/Types/WindowsInstallerAction.ps1";
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Prompts the user to select a profile to act on.
|
||||
#>
|
||||
function Show-ProfileNamePrompt {
|
||||
. "$PSScriptRoot/../../Windows/Types/WindowsInstallerAction.ps1";
|
||||
|
||||
$profiles = & {
|
||||
. "$PSScriptRoot/SoftwareManagement.ps1";
|
||||
|
||||
if (-not $IsWindows -or (Test-Command "wsl")) {
|
||||
return Invoke-ConfigScript "getProfiles";
|
||||
} else {
|
||||
|
@ -93,75 +55,6 @@ $null = New-Module {
|
|||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Converts the specified path to linux and escapes it for the use in a script.
|
||||
|
||||
.PARAMETER Path
|
||||
The path to convert.
|
||||
#>
|
||||
function ConvertTo-LinuxPath {
|
||||
param(
|
||||
[string] $Path
|
||||
)
|
||||
|
||||
& {
|
||||
$ErrorActionPreference = 'Continue';
|
||||
$completed = $false;
|
||||
|
||||
while (-not $completed) {
|
||||
$job = Start-Job {
|
||||
$env:Value = Resolve-Path $Using:Path;
|
||||
$env:WSLENV = "Value/p";
|
||||
$result = wsl -- bash -c 'echo "$Value"';
|
||||
wsl -e printf "%q" "$result";
|
||||
};
|
||||
|
||||
$result = Receive-Job -Wait $job;
|
||||
|
||||
|
||||
if ((Split-Path -Leaf $Path) -ne (Split-Path -Leaf $result)) {
|
||||
Write-Error "The result of the path conversion of ``$Path`` was unexpected: ``$result``";
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($job.State -ne ([System.Management.Automation.JobState]::Completed)) {
|
||||
Write-Error "An error occurred while converting ``$Path`` to a Linux path.`nOutput: ``$result``";
|
||||
continue;
|
||||
}
|
||||
|
||||
$completed = $true;
|
||||
}
|
||||
|
||||
$result;
|
||||
};
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the registry key containing options related to the setup.
|
||||
#>
|
||||
function Get-SetupConfigKey {
|
||||
if (-not (Test-Path $configRoot)) {
|
||||
$key = New-Item $configRoot;
|
||||
$acl = Get-Acl $configRoot;
|
||||
|
||||
$acl.AddAccessRule(
|
||||
[RegistryAccessRule]::new(
|
||||
[SecurityIdentifier]::new([WellKnownSidType]::BuiltinUsersSid, $null),
|
||||
[RegistryRights]::FullControl,
|
||||
[InheritanceFlags]::ObjectInherit -bor [InheritanceFlags]::ContainerInherit,
|
||||
[PropagationFlags]::None,
|
||||
[AccessControlType]::Allow));
|
||||
|
||||
Set-Acl $configRoot $acl;
|
||||
} else {
|
||||
$key = Get-Item $configRoot;
|
||||
}
|
||||
|
||||
return $key;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Runs a script based on the `config.fish` script.
|
||||
|
@ -174,6 +67,7 @@ $null = New-Module {
|
|||
[string] $Script
|
||||
)
|
||||
|
||||
. "$PSScriptRoot/../../Windows/Scripts/WSL.ps1";
|
||||
$scriptPath = "$PSScriptRoot/../../Common/Scripts/config.fish";
|
||||
|
||||
if ($env:CONFIG_NAME -or ($Script -eq "getProfiles")) {
|
||||
|
@ -335,273 +229,4 @@ $null = New-Module {
|
|||
param()
|
||||
Get-OSConfig "setupUser.name";
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the value of an option related to the setup.
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the option value to get.
|
||||
#>
|
||||
function Get-SetupOption {
|
||||
param(
|
||||
[string] $Name
|
||||
)
|
||||
|
||||
$key = Get-SetupConfigKey;
|
||||
|
||||
if ($key.GetValueNames().Contains($Name)) {
|
||||
return $key.GetValue($Name);
|
||||
} else {
|
||||
return $null;
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the value of an option related to the setup.
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the option to set.
|
||||
|
||||
.PARAMETER Value
|
||||
The value to set the option to.
|
||||
#>
|
||||
function Set-SetupOption {
|
||||
param(
|
||||
[string] $Name,
|
||||
$Value
|
||||
)
|
||||
|
||||
$key = (Get-SetupConfigKey).PSPath;
|
||||
|
||||
if ($null -eq $Value) {
|
||||
Remove-ItemProperty $key -Name $Name;
|
||||
} else {
|
||||
$null = Set-ItemProperty $key -Name $Name -Value $Value;
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the name of the current stage of the Windows install script action.
|
||||
#>
|
||||
function Get-Stage {
|
||||
$stage = Get-SetupOption $stageOption;
|
||||
|
||||
if ($null -ne $stage) {
|
||||
$stage = [WindowsInstallerStage]$stage;
|
||||
}
|
||||
|
||||
return $stage;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the name of the current stage of the Windows install script action.
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the stage to set.
|
||||
#>
|
||||
function Set-Stage {
|
||||
param(
|
||||
$Name
|
||||
)
|
||||
|
||||
if (-not (($null -eq $Name) -or ($Name -is [string]))) {
|
||||
$Name = ([WindowsInstallerStage]$Name).ToString();
|
||||
}
|
||||
|
||||
$null = Set-SetupOption $stageOption $Name;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the name of the current setup stage.
|
||||
#>
|
||||
function Get-SetupStage {
|
||||
$stage = Get-SetupOption $setupStageOption;
|
||||
|
||||
if ($null -ne $stage) {
|
||||
$stage = [SetupStage]$stage;
|
||||
}
|
||||
|
||||
return $stage;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the current stage.
|
||||
|
||||
.PARAMETER Name
|
||||
The name to set the current stage to.
|
||||
#>
|
||||
function Set-SetupStage {
|
||||
param(
|
||||
$Name
|
||||
)
|
||||
|
||||
if (-not (($null -eq $Name) -or ($Name -is [string]))) {
|
||||
$Name = ([SetupStage]$Name).ToString();
|
||||
}
|
||||
|
||||
$null = Set-SetupOption $setupStageOption $Name;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the name of the current stage of the backup.
|
||||
#>
|
||||
function Get-BackupStage {
|
||||
$stage = Get-SetupOption $backupStageOption;
|
||||
|
||||
if ($null -ne $stage) {
|
||||
$stage = [BackupStage]$stage;
|
||||
}
|
||||
|
||||
return $stage;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the current stage of the backup.
|
||||
|
||||
.PARAMETER Name
|
||||
The name to set the current stage to.
|
||||
#>
|
||||
function Set-BackupStage {
|
||||
param(
|
||||
$Name
|
||||
)
|
||||
|
||||
if (-not (($null -eq $Name) -or ($Name -is [string]))) {
|
||||
$Name = ([BackupStage]$Name).ToString();
|
||||
}
|
||||
|
||||
$null = Set-SetupOption $backupStageOption $Name;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the current user to set up.
|
||||
#>
|
||||
function Get-CurrentUser {
|
||||
return (Get-SetupOption $userOption) ?? 0;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the index of the current user to set up.
|
||||
|
||||
.PARAMETER Value
|
||||
The index of the user to set up.
|
||||
#>
|
||||
function Set-CurrentUser {
|
||||
param(
|
||||
[int] $Value
|
||||
)
|
||||
|
||||
Set-SetupOption $userOption $value;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the name of the current stage of the user setup.
|
||||
#>
|
||||
function Get-UserStage {
|
||||
$stage = Get-SetupOption $userStageOption;
|
||||
|
||||
if ($null -ne $stage) {
|
||||
$stage = [UserStage]$stage;
|
||||
}
|
||||
|
||||
return $stage;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the current stage of the user setup.
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the stage to set.
|
||||
#>
|
||||
function Set-UserStage {
|
||||
param(
|
||||
$Name
|
||||
)
|
||||
|
||||
if (-not (($null -eq $Name) -or ($Name -is [string]))) {
|
||||
$Name = ([UserStage]$Name).ToString();
|
||||
}
|
||||
|
||||
$null = Set-SetupOption $userStageOption $Name;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the name of the microsoft account to create.
|
||||
#>
|
||||
function Get-MSAccountName {
|
||||
return Get-SetupOption $accountOption;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the name of the microsoft account to create.
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the microsoft account to create.
|
||||
#>
|
||||
function Set-MSAccountName {
|
||||
param(
|
||||
[string] $Name
|
||||
)
|
||||
|
||||
Set-SetupOption $accountOption $Name;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets a value indicating whether the setup has finished.
|
||||
#>
|
||||
function Get-IsFinished {
|
||||
return [bool](Get-SetupOption $finishedOption);
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets a value indicating whether the setup has finished.
|
||||
#>
|
||||
function Set-IsFinished {
|
||||
param(
|
||||
$Value
|
||||
)
|
||||
|
||||
Set-SetupOption $finishedOption $true;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks whether the running system is a QEMU virtual machine.
|
||||
#>
|
||||
function Test-Qemu {
|
||||
((Get-WmiObject win32_computersystem).Manufacturer) -eq "QEMU";
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks whether the current user is the setup user.
|
||||
#>
|
||||
function Test-SetupUser {
|
||||
($IsWindows ? $env:UserName : $env:USER) -eq (Get-SetupUser);
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks whether the active session is executed with admin rights.
|
||||
#>
|
||||
function Test-Admin {
|
||||
net session 2> $null | Out-Null;
|
||||
return $?;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,35 +1,17 @@
|
|||
using namespace System.Management.Automation.Host;
|
||||
|
||||
. "$PSScriptRoot/../Types/OneShotTask.ps1";
|
||||
|
||||
$null = New-Module {
|
||||
. "$PSScriptRoot/Config.ps1";
|
||||
. "$PSScriptRoot/Scripting.ps1";
|
||||
. "$PSScriptRoot/../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../Types/OneShotTask.ps1";
|
||||
. "$PSScriptRoot/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../Windows/Scripts/Constants.ps1";
|
||||
. "$PSScriptRoot/../../Windows/Scripts/Hooks.ps1";
|
||||
. "$PSScriptRoot/../../Windows/Scripts/PowerManagement.ps1";
|
||||
. "$PSScriptRoot/../../Windows/Scripts/Registry.ps1";
|
||||
. "$PSScriptRoot/../../Windows/Scripts/Security.ps1";
|
||||
. "$PSScriptRoot/../../Windows/Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../Windows/Scripts/System.ps1";
|
||||
. "$PSScriptRoot/../../Windows/Scripts/Tasks.ps1";
|
||||
. "$PSScriptRoot/../../Windows/Scripts/WSL.ps1";
|
||||
$oneShotTaskName = "PortValhalla OneShot";
|
||||
$logName = "Application";
|
||||
$oneShotTrigger = 1337;
|
||||
$taskOption = "OneShotTask";
|
||||
|
||||
$getErrorPath = {
|
||||
Join-Path (Get-ArtifactRoot) "error.txt";
|
||||
};
|
||||
|
||||
$getUserName = {
|
||||
"$(Get-SetupUser)OneShot";
|
||||
};
|
||||
|
||||
$taskSetter = {
|
||||
param([Nullable[OneShotTask]] $Task)
|
||||
Set-SetupOption $taskOption ([string]$Task);
|
||||
};
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
|
@ -289,141 +271,6 @@ $null = New-Module {
|
|||
& $cleanup;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the current OneShot task.
|
||||
#>
|
||||
function Get-OneShotTask {
|
||||
$task = Get-SetupOption $taskOption;
|
||||
|
||||
if ($task) {
|
||||
return [OneShotTask]$task;
|
||||
} else {
|
||||
return $null;
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Registers a task for listening to OneShot invocations.
|
||||
#>
|
||||
function Enable-OneShotListener {
|
||||
$tempTask = "PortValhalla Temp";
|
||||
$user = & $getUserName;
|
||||
$password = [string]([guid]::NewGuid());
|
||||
|
||||
$adminGroup = @{
|
||||
SID = [SecurityIdentifier]::new([WellKnownSidType]::BuiltinAdministratorsSid, $null);
|
||||
};
|
||||
|
||||
$null = New-LocalUser -Name $user -Password (ConvertTo-SecureString -AsPlainText $password);
|
||||
Add-LocalGroupMember -Member $user @adminGroup;
|
||||
$logPath = Join-Path (Get-ArtifactRoot) "OneShotTask.log";
|
||||
$path = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList";
|
||||
$null = New-Item -Force -ErrorAction SilentlyContinue $path;
|
||||
Set-ItemProperty $path -Name $user -Value 0;
|
||||
|
||||
$action = New-ScheduledTaskAction -Execute "pwsh" -Argument "-Command & { $([string](Get-StartupCommand)) } 2>&1 | Tee-Object -FilePath $(ConvertTo-Injection $logPath)";
|
||||
schtasks /Create /SC ONEVENT /EC $logName /MO "*[System[Provider[@Name='$logName'] and EventID=$($oneShotTrigger)]]" /TR cmd.exe /TN $tempTask;
|
||||
$trigger = (Get-ScheduledTask $tempTask).Triggers;
|
||||
$null = Register-ScheduledTask -Force $oneShotTaskName -Action $action -Trigger $trigger -RunLevel Highest -User $user -Password $password;
|
||||
$null = Unregister-ScheduledTask -Confirm:$false $tempTask;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Removes the OneShot task.
|
||||
#>
|
||||
function Disable-OneShotListener {
|
||||
Unregister-ScheduledTask -Confirm:$false $oneShotTaskName;
|
||||
$user = Get-LocalUser (& $getUserName);
|
||||
[string] $sid = $user.SID;
|
||||
Remove-LocalUser $user;
|
||||
Get-CimInstance Win32_UserProfile | Where-Object { $_.SID -eq $sid } | Remove-CimInstance;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Invokes a one-shot task.
|
||||
|
||||
.PARAMETER Task
|
||||
The task to run.
|
||||
#>
|
||||
function Invoke-OneShot {
|
||||
param(
|
||||
[OneShotTask] $Task
|
||||
)
|
||||
|
||||
$errorPath = & $getErrorPath;
|
||||
& $taskSetter $Task;
|
||||
|
||||
& {
|
||||
$identifier = "EventLog$oneShotTrigger";
|
||||
$log = [System.Diagnostics.EventLog]::new($logName);
|
||||
$log.EnableRaisingEvents = $true;
|
||||
|
||||
$null = Register-ObjectEvent -InputObject $log -EventName EntryWritten -Action {
|
||||
$entry = $Event.SourceEventArgs.Entry;
|
||||
$trigger = $Event.MessageData.Trigger;
|
||||
$identifier = $Event.MessageData.Identifier;
|
||||
|
||||
if ($entry.EventID -eq $trigger) {
|
||||
$null = New-Event -SourceIdentifier $identifier;
|
||||
}
|
||||
} `
|
||||
-MessageData @{
|
||||
Trigger = $oneShotTrigger;
|
||||
Identifier = $identifier;
|
||||
};
|
||||
|
||||
Write-EventLog -LogName $logName -Source $logName -EventId $oneShotTrigger -Message "Starting OneShot task ``$(Get-OneShotTask)``…";
|
||||
|
||||
for ($i = 0; $i -lt 2; $i++) {
|
||||
Remove-Event -EventIdentifier (Wait-Event -SourceIdentifier $identifier).EventIdentifier;
|
||||
}
|
||||
};
|
||||
|
||||
if (Test-Path $errorPath) {
|
||||
$errorMessage = Get-Content $errorPath;
|
||||
Remove-Item $errorPath;
|
||||
|
||||
if ($errorMessage) {
|
||||
Write-Error $errorMessage;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# ToDo: Store Run-OneShot and Receive-OneShot somewhere else in Windows folder
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Executes the specified action and notifies the OneShot task executor.
|
||||
#>
|
||||
function Start-OneShot {
|
||||
try {
|
||||
Write-Host "Running OneShot task ``$(Get-OneShotTask)``";
|
||||
|
||||
switch (Get-OneShotTask) {
|
||||
([OneShotTask]::InitializeMSAccount) {
|
||||
Initialize-UserCreation;
|
||||
}
|
||||
([OneShotTask]::DisableUAC) {
|
||||
Disable-UAC;
|
||||
Register-Setup;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch {
|
||||
$errorPath = & $getErrorPath;
|
||||
Set-Content -Path $errorPath -Value $Error;
|
||||
Set-UserPermissions $errorPath;
|
||||
}
|
||||
finally {
|
||||
& $taskSetter $null;
|
||||
Write-EventLog -LogName $logName -Source $logName -EventId $oneShotTrigger -Message "The OneShot task ``$(Get-OneShotTask)`` finished.";
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Clears resources allocated during the operation.
|
||||
|
|
|
@ -1,297 +1,11 @@
|
|||
. "$PSScriptRoot/Config.ps1";
|
||||
. "$PSScriptRoot/Operations.ps1";
|
||||
. "$PSScriptRoot/System.ps1";
|
||||
. "$PSScriptRoot/../Types/InstallerAction.ps1";
|
||||
|
||||
$null = New-Module {
|
||||
. "$PSScriptRoot/BrowserAutomation.ps1";
|
||||
. "$PSScriptRoot/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../Types/InstallerAction.ps1";
|
||||
$userArgument = "name";
|
||||
|
||||
$chocoRunner = {
|
||||
param(
|
||||
[string] $Action = 'install',
|
||||
[string[]] $ArgumentList,
|
||||
[scriptblock] $Guard = { $true },
|
||||
[Parameter(Position = 0)]
|
||||
[string] $Name,
|
||||
[Parameter(ValueFromRemainingArguments = $true)]
|
||||
[string[]] $AdditionalNames = @()
|
||||
)
|
||||
|
||||
[System.Collections.ArrayList] $Names = @();
|
||||
$null = $Names.Add($Name);
|
||||
$Names.AddRange($AdditionalNames);
|
||||
|
||||
if (-not ($Force.IsPresent)) {
|
||||
for ($i = $Names.Count - 1; $i -ge 0; $i--) {
|
||||
$name = $Names[$i];
|
||||
|
||||
if (-not (& $Guard $name)) {
|
||||
$Names.RemoveAt($i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($Names.Count -ge 1) {
|
||||
choco $Action -y @ArgumentList @Names;
|
||||
}
|
||||
};
|
||||
|
||||
$wingetRunner = {
|
||||
param(
|
||||
[string] $Action = 'install',
|
||||
[string[]] $ArgumentList,
|
||||
[scriptblock] $Guard = { $true },
|
||||
[Parameter(Position = 0)]
|
||||
[string] $Name,
|
||||
[Parameter(ValueFromRemainingArguments = $true)]
|
||||
[string[]] $AdditionalNames = @()
|
||||
)
|
||||
|
||||
[System.Collections.ArrayList] $Names = @();
|
||||
$null = $Names.Add($Name);
|
||||
$Names.AddRange($AdditionalNames);
|
||||
|
||||
[string[]] $arguments = $ArgumentList + (& {
|
||||
if ($Action -eq 'install') {
|
||||
@("--accept-package-agreements")
|
||||
};
|
||||
});
|
||||
|
||||
foreach ($name in $Names) {
|
||||
if ($Force.IsPresent -or (& $Guard $name $PSBoundParameters)) {
|
||||
winget $Action `
|
||||
--accept-source-agreements `
|
||||
--source winget `
|
||||
@arguments `
|
||||
--exact --id $name ;
|
||||
} else {
|
||||
Write-Host "Package ``$name`` is already installed"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Installs the specified packages using chocolatey.
|
||||
|
||||
.PARAMETER Names
|
||||
The names of the packages to install.
|
||||
#>
|
||||
function Install-ChocoPackage {
|
||||
param(
|
||||
[switch] $Force,
|
||||
[string[]] $ArgumentList,
|
||||
[Parameter(Position=0)]
|
||||
[string] $Name,
|
||||
[Parameter(ValueFromRemainingArguments = $true)]
|
||||
[string[]] $AdditionalNames = @()
|
||||
)
|
||||
|
||||
& $chocoRunner @PSBoundParameters -Guard {
|
||||
param($Name)
|
||||
if (Test-ChocoPackage $Name) {
|
||||
Write-Host "Package ``$Name`` is already installed"
|
||||
$false;
|
||||
} else {
|
||||
$true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Uninstalls the specified packages using chocolatey.
|
||||
#>
|
||||
function Uninstall-ChocoPackage {
|
||||
param(
|
||||
[string[]] $ArgumentList,
|
||||
[Parameter(Position=0)]
|
||||
[string] $Name,
|
||||
[Parameter(ValueFromRemainingArguments = $true)]
|
||||
[string[]] $AdditionalNames = @()
|
||||
)
|
||||
|
||||
& $chocoRunner @PSBoundParameters -Action 'uninstall' -Guard {
|
||||
param($Name)
|
||||
if (Test-ChocoPackage $Name) {
|
||||
$true;
|
||||
} else {
|
||||
Write-Host "Package ``$Name`` is not installed";
|
||||
$false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Installs the specified packages using `winget`.
|
||||
|
||||
.PARAMETER Names
|
||||
The names of the packages to install.
|
||||
#>
|
||||
function Install-WingetPackage {
|
||||
param(
|
||||
[switch] $Force,
|
||||
[string[]] $ArgumentList,
|
||||
[Parameter(Position=0)]
|
||||
[string] $Name,
|
||||
[Parameter(ValueFromRemainingArguments = $true)]
|
||||
[string[]] $AdditionalNames = @()
|
||||
)
|
||||
|
||||
& $wingetRunner @PSBoundParameters `
|
||||
-Guard {
|
||||
param($Name, $Parameters)
|
||||
if (Test-WingetPackage -Name $Name @Parameters) {
|
||||
Write-Host "Package ``$Name`` is already installed"
|
||||
$false;
|
||||
} else {
|
||||
$true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Uninstalls the specified packages using `winget`.
|
||||
#>
|
||||
function Uninstall-WingetPackage {
|
||||
param(
|
||||
[string[]] $ArgumentList,
|
||||
[Parameter(Position=0)]
|
||||
[string] $Name,
|
||||
[Parameter(ValueFromRemainingArguments = $true)]
|
||||
[string[]] $AdditionalNames = @()
|
||||
)
|
||||
|
||||
& $wingetRunner @PSBoundParameters -Action 'uninstall' -Guard {
|
||||
param($Name, $Parameters)
|
||||
if (Test-WingetPackage -Name $Name @Parameters) {
|
||||
$true;
|
||||
} else {
|
||||
Write-Host "Package ``$Name`` is not installed"
|
||||
$false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Installs a setup package from the specified source.
|
||||
|
||||
.PARAMETER Source
|
||||
The location of the setup package.
|
||||
|
||||
.PARAMETER ArgumentList
|
||||
The arguments to pass to the setup package.
|
||||
|
||||
.PARAMETER Local
|
||||
A value indicating whether the setup package is stored locally.
|
||||
#>
|
||||
function Install-SetupPackage {
|
||||
param(
|
||||
[string] $Source,
|
||||
[string[]] $ArgumentList = @("/S"),
|
||||
[switch] $Local
|
||||
)
|
||||
|
||||
[string] $dir = $null;
|
||||
[string] $filePath = $null;
|
||||
|
||||
if (-not ($Local.IsPresent)) {
|
||||
$dir = New-TemporaryDirectory;
|
||||
Write-Host "Determining the file name of ``$Source``…";
|
||||
$fileName = ([uri]$Source).Segments[-1];
|
||||
Write-Host "Found name ``$fileName``";
|
||||
$filePath = Join-Path $dir $fileName;
|
||||
|
||||
Write-Host "Downloading setup file from ``$Source``";
|
||||
Invoke-WebRequest $Source -OutFile $filePath;
|
||||
} else {
|
||||
$filePath = $Source;
|
||||
}
|
||||
|
||||
Write-Host "Starting installation of ``$(Split-Path -Leaf $filePath)``";
|
||||
Start-Process -Wait -WorkingDirectory (Split-Path -Parent $filePath) -FilePath $filePath -ArgumentList $ArgumentList;
|
||||
|
||||
if ($dir) {
|
||||
Remove-Item -Recurse $dir;
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Installs a package downloaded from ASUS.
|
||||
|
||||
.PARAMETER URL
|
||||
The URL to download the package from.
|
||||
#>
|
||||
function Install-AsusPackage {
|
||||
param(
|
||||
[string] $URL
|
||||
)
|
||||
|
||||
$file = "AsusPackage.zip";
|
||||
$dir = New-TemporaryDirectory;
|
||||
$unpackDir = New-TemporaryDirectory;
|
||||
|
||||
$null = Push-Location $dir;
|
||||
Invoke-WebRequest $URL -OutFile $file;
|
||||
Expand-Archive $file $unpackDir;
|
||||
$null = Pop-Location;
|
||||
Remove-Item -Recurse $dir;
|
||||
|
||||
$null = Start-Process -Wait -WorkingDirectory $unpackDir -FilePath (Join-Path $unpackDir "AsusSetup.exe") -ArgumentList "/S";
|
||||
Remove-Item -Recurse $unpackDir;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Downloads and installs a package from the AMD website.
|
||||
|
||||
.PARAMETER URL
|
||||
The URL to download the package from.
|
||||
#>
|
||||
function Install-AmdPackage {
|
||||
param(
|
||||
[string] $URL
|
||||
)
|
||||
|
||||
$dir = New-TemporaryDirectory;
|
||||
$cookieBannerSelector = "#onetrust-consent-sdk";
|
||||
$osSelector = "div[id$='oscategory']>div[id$='-0']";
|
||||
$downloadSelector = "$osSelector div[id$='panel'] .button a";
|
||||
|
||||
$file = Start-CustomBrowserDownload @PSBoundParameters -OutDir $dir -Action {
|
||||
param(
|
||||
[OpenQA.Selenium.Firefox.FirefoxDriver] $Browser
|
||||
)
|
||||
|
||||
$osContainer = $Browser.FindElement([OpenQA.Selenium.By]::CssSelector($osSelector));
|
||||
|
||||
if (-not ([bool] $osContainer.GetAttribute("cmp-expanded"))) {
|
||||
$osContainer.Click();
|
||||
}
|
||||
|
||||
$download = {
|
||||
$browser.FindElement([OpenQA.Selenium.By]::CssSelector($downloadSelector)).Click();
|
||||
};
|
||||
|
||||
try {
|
||||
& $download;
|
||||
} catch {
|
||||
$null = $Browser.ExecuteScript("document.querySelector('$cookieBannerSelector').remove()");
|
||||
& $download;
|
||||
}
|
||||
};
|
||||
|
||||
Start-Process -Wait -WorkingDirectory (Split-Path -Parent "$file") -FilePath "$file" -ArgumentList "/S";
|
||||
Remove-Item -Recurse $dir;
|
||||
}
|
||||
|
||||
function Start-SoftwareInstaller {
|
||||
param(
|
||||
[string] $Name,
|
||||
|
|
|
@ -1,36 +1,3 @@
|
|||
<#
|
||||
.SYNOPSIS
|
||||
Checks whether the specified package has been installed using Chocolatey.
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the package to check.
|
||||
#>
|
||||
function Test-ChocoPackage {
|
||||
[OutputType([bool])]
|
||||
param(
|
||||
[string] $Name
|
||||
);
|
||||
|
||||
-not [string]::IsNullOrEmpty((choco list --limit-output --exact $name));
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks whether a `winget` package with the specified id is installed.
|
||||
|
||||
.PARAMETER ID
|
||||
The id of the package to check.
|
||||
#>
|
||||
function Test-WingetPackage {
|
||||
[OutputType([bool])]
|
||||
param(
|
||||
[string] $Name,
|
||||
[string[]] $ArgumentList
|
||||
)
|
||||
|
||||
& { $null = winget list --accept-source-agreements -e --id $Name @ArgumentList; $?; };
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks whether a command with the specified name exists.
|
||||
|
@ -46,21 +13,6 @@ function Test-Command {
|
|||
[bool] (Get-Command $Name -ErrorAction SilentlyContinue);
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks whether `winget` is working properly.
|
||||
#>
|
||||
function Test-Winget {
|
||||
(Test-Command winget) -and (
|
||||
& {
|
||||
$output = winget source update winget;
|
||||
|
||||
$? -and -not ([System.Linq.Enumerable]::Any(
|
||||
[string[]]($output),
|
||||
[System.Func[string,bool]]{ param($line) $line -eq "Cancelled"; }));
|
||||
});
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks whether a package with the specified name is installed.
|
||||
|
|
|
@ -9,60 +9,8 @@ function New-TemporaryDirectory {
|
|||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Removes desktop icons which apply to the specified pattern.
|
||||
|
||||
.PARAMETER Pattern
|
||||
The pattern to match the icons to delete.
|
||||
Checks whether the current user is the setup user.
|
||||
#>
|
||||
function Remove-DesktopIcon {
|
||||
param(
|
||||
[string] $Pattern
|
||||
)
|
||||
|
||||
$path = "Desktop/$Pattern";
|
||||
|
||||
foreach ($userDir in @("~", $env:PUBLIC, "$env:SystemDrive/Users/Default")) {
|
||||
$fullName = "$userDir/$path";
|
||||
|
||||
if (Test-Path -PathType Leaf $fullName) {
|
||||
Remove-Item $fullName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Adds a new shortcut to the start menu.
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the icon to create.
|
||||
|
||||
.PARAMETER Target
|
||||
The file to link to.
|
||||
#>
|
||||
function Add-StartMenuIcon {
|
||||
param(
|
||||
[string] $Name,
|
||||
[string] $Target
|
||||
)
|
||||
|
||||
Import-Module KnownFolders;
|
||||
Import-Module "$env:ChocolateyInstall/helpers/chocolateyInstaller.psm1";
|
||||
Install-ChocolateyShortcut -ShortcutFilePath "$((Get-KnownFolder "Common Programs").Path)/$Name.lnk" -TargetPath ((Get-Item $Target).FullName);
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Removes icons from the task bar.
|
||||
|
||||
.PARAMETER Pattern
|
||||
The pattern of the icon names to remove.
|
||||
#>
|
||||
function Remove-TaskbarItem {
|
||||
param(
|
||||
[string] $Pattern
|
||||
)
|
||||
|
||||
Import-Module -UseWindowsPowerShell PinnedItem;
|
||||
Get-PinnedItem -Type TaskBar | Where-Object { $_.Name -like "$Pattern" } | ForEach-Object { Remove-PinnedItem $_ };
|
||||
function Test-SetupUser {
|
||||
($IsWindows ? $env:UserName : $env:USER) -eq (Get-SetupUser);
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ param(
|
|||
& {
|
||||
param($parameters);
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
$softwarePath = "$PSScriptRoot/../../Software";
|
||||
|
||||
|
|
|
@ -10,13 +10,14 @@ $null = New-Module {
|
|||
. "$PSScriptRoot/../Scripts/PowerManagement.ps1";
|
||||
. "$PSScriptRoot/../Scripts/Registry.ps1";
|
||||
. "$PSScriptRoot/../Scripts/Security.ps1";
|
||||
. "$PSScriptRoot/../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../Scripts/System.ps1";
|
||||
. "$PSScriptRoot/../Scripts/Update.ps1";
|
||||
. "$PSScriptRoot/../Scripts/Users.ps1";
|
||||
. "$PSScriptRoot/../Types/WindowsInstallerAction.ps1";
|
||||
. "$PSScriptRoot/../../Common/Scripts/Config.ps1";
|
||||
. "$PSScriptRoot/../../Common/Scripts/Operations.ps1";
|
||||
. "$PSScriptRoot/../../Common/Scripts/Scripting.ps1";
|
||||
. "$PSScriptRoot/../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../Common/Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../Common/Types/InstallerAction.ps1";
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
. "$PSScriptRoot/PowerManagement.ps1";
|
||||
. "$PSScriptRoot/../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../Common/Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../Common/Types/InstallerAction.ps1";
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@ using namespace Microsoft.Win32;
|
|||
|
||||
$null = New-Module {
|
||||
. "$PSScriptRoot/../Scripts/Registry.ps1";
|
||||
. "$PSScriptRoot/../../Common/Scripts/Config.ps1";
|
||||
. "$PSScriptRoot/../../Common/Scripts/Scripting.ps1";
|
||||
[RegistryKey] $key = $null;
|
||||
$runOncePath = "Software\Microsoft\Windows\CurrentVersion\RunOnce";
|
||||
|
|
|
@ -1,6 +1,45 @@
|
|||
using namespace Microsoft.Win32;
|
||||
using namespace System.Security.AccessControl;
|
||||
using namespace System.Security.Principal;
|
||||
|
||||
enum WindowsInstallerStage {
|
||||
Initialize
|
||||
Run
|
||||
Cleanup
|
||||
Completed
|
||||
}
|
||||
|
||||
enum SetupStage {
|
||||
Initialize
|
||||
Configure
|
||||
Install
|
||||
CreateUser
|
||||
}
|
||||
|
||||
enum BackupStage {
|
||||
Initialize
|
||||
Backup
|
||||
BackupUsers
|
||||
}
|
||||
|
||||
enum UserStage {
|
||||
Create
|
||||
Configure
|
||||
Cleanup
|
||||
Completed
|
||||
}
|
||||
|
||||
$null = New-Module {
|
||||
[string] $configRoot = "HKLM:\Software\PortValhalla";
|
||||
[string] $stageOption = "Stage";
|
||||
[string] $setupStageOption = "SetupStage";
|
||||
[string] $backupStageOption = "BackupStage";
|
||||
[string] $userOption = "SetupUser";
|
||||
[string] $userStageOption = "UserStage";
|
||||
[string] $accountOption = "MSAccount";
|
||||
[string] $finishedOption = "Finished";
|
||||
[RegistryKey] $key = $null;
|
||||
|
||||
function Edit-DefaultUserKey {
|
||||
param(
|
||||
[scriptblock] $Action
|
||||
|
@ -17,6 +56,31 @@ $null = New-Module {
|
|||
& reg unload $regRootPath;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the registry key containing options related to the setup.
|
||||
#>
|
||||
function Get-SetupConfigKey {
|
||||
if (-not (Test-Path $configRoot)) {
|
||||
$key = New-Item $configRoot;
|
||||
$acl = Get-Acl $configRoot;
|
||||
|
||||
$acl.AddAccessRule(
|
||||
[RegistryAccessRule]::new(
|
||||
[SecurityIdentifier]::new([WellKnownSidType]::BuiltinUsersSid, $null),
|
||||
[RegistryRights]::FullControl,
|
||||
[InheritanceFlags]::ObjectInherit -bor [InheritanceFlags]::ContainerInherit,
|
||||
[PropagationFlags]::None,
|
||||
[AccessControlType]::Allow));
|
||||
|
||||
Set-Acl $configRoot $acl;
|
||||
} else {
|
||||
$key = Get-Item $configRoot;
|
||||
}
|
||||
|
||||
return $key;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets a message to show on the login screen.
|
||||
|
@ -53,4 +117,248 @@ $null = New-Module {
|
|||
function Disable-BootMessage {
|
||||
Set-BootMessage;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the value of an option related to the setup.
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the option value to get.
|
||||
#>
|
||||
function Get-SetupOption {
|
||||
param(
|
||||
[string] $Name
|
||||
)
|
||||
|
||||
$key = Get-SetupConfigKey;
|
||||
|
||||
if ($key.GetValueNames().Contains($Name)) {
|
||||
return $key.GetValue($Name);
|
||||
} else {
|
||||
return $null;
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the value of an option related to the setup.
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the option to set.
|
||||
|
||||
.PARAMETER Value
|
||||
The value to set the option to.
|
||||
#>
|
||||
function Set-SetupOption {
|
||||
param(
|
||||
[string] $Name,
|
||||
$Value
|
||||
)
|
||||
|
||||
$key = (Get-SetupConfigKey).PSPath;
|
||||
|
||||
if ($null -eq $Value) {
|
||||
Remove-ItemProperty $key -Name $Name;
|
||||
} else {
|
||||
$null = Set-ItemProperty $key -Name $Name -Value $Value;
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the name of the current stage of the Windows install script action.
|
||||
#>
|
||||
function Get-Stage {
|
||||
$stage = Get-SetupOption $stageOption;
|
||||
|
||||
if ($null -ne $stage) {
|
||||
$stage = [WindowsInstallerStage]$stage;
|
||||
}
|
||||
|
||||
return $stage;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the name of the current stage of the Windows install script action.
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the stage to set.
|
||||
#>
|
||||
function Set-Stage {
|
||||
param(
|
||||
$Name
|
||||
)
|
||||
|
||||
if (-not (($null -eq $Name) -or ($Name -is [string]))) {
|
||||
$Name = ([WindowsInstallerStage]$Name).ToString();
|
||||
}
|
||||
|
||||
$null = Set-SetupOption $stageOption $Name;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the name of the current setup stage.
|
||||
#>
|
||||
function Get-SetupStage {
|
||||
$stage = Get-SetupOption $setupStageOption;
|
||||
|
||||
if ($null -ne $stage) {
|
||||
$stage = [SetupStage]$stage;
|
||||
}
|
||||
|
||||
return $stage;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the current stage.
|
||||
|
||||
.PARAMETER Name
|
||||
The name to set the current stage to.
|
||||
#>
|
||||
function Set-SetupStage {
|
||||
param(
|
||||
$Name
|
||||
)
|
||||
|
||||
if (-not (($null -eq $Name) -or ($Name -is [string]))) {
|
||||
$Name = ([SetupStage]$Name).ToString();
|
||||
}
|
||||
|
||||
$null = Set-SetupOption $setupStageOption $Name;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the name of the current stage of the backup.
|
||||
#>
|
||||
function Get-BackupStage {
|
||||
$stage = Get-SetupOption $backupStageOption;
|
||||
|
||||
if ($null -ne $stage) {
|
||||
$stage = [BackupStage]$stage;
|
||||
}
|
||||
|
||||
return $stage;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the current stage of the backup.
|
||||
|
||||
.PARAMETER Name
|
||||
The name to set the current stage to.
|
||||
#>
|
||||
function Set-BackupStage {
|
||||
param(
|
||||
$Name
|
||||
)
|
||||
|
||||
if (-not (($null -eq $Name) -or ($Name -is [string]))) {
|
||||
$Name = ([BackupStage]$Name).ToString();
|
||||
}
|
||||
|
||||
$null = Set-SetupOption $backupStageOption $Name;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the current user to set up.
|
||||
#>
|
||||
function Get-CurrentUser {
|
||||
return (Get-SetupOption $userOption) ?? 0;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the index of the current user to set up.
|
||||
|
||||
.PARAMETER Value
|
||||
The index of the user to set up.
|
||||
#>
|
||||
function Set-CurrentUser {
|
||||
param(
|
||||
[int] $Value
|
||||
)
|
||||
|
||||
Set-SetupOption $userOption $value;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the name of the current stage of the user setup.
|
||||
#>
|
||||
function Get-UserStage {
|
||||
$stage = Get-SetupOption $userStageOption;
|
||||
|
||||
if ($null -ne $stage) {
|
||||
$stage = [UserStage]$stage;
|
||||
}
|
||||
|
||||
return $stage;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the current stage of the user setup.
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the stage to set.
|
||||
#>
|
||||
function Set-UserStage {
|
||||
param(
|
||||
$Name
|
||||
)
|
||||
|
||||
if (-not (($null -eq $Name) -or ($Name -is [string]))) {
|
||||
$Name = ([UserStage]$Name).ToString();
|
||||
}
|
||||
|
||||
$null = Set-SetupOption $userStageOption $Name;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the name of the microsoft account to create.
|
||||
#>
|
||||
function Get-MSAccountName {
|
||||
return Get-SetupOption $accountOption;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the name of the microsoft account to create.
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the microsoft account to create.
|
||||
#>
|
||||
function Set-MSAccountName {
|
||||
param(
|
||||
[string] $Name
|
||||
)
|
||||
|
||||
Set-SetupOption $accountOption $Name;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets a value indicating whether the setup has finished.
|
||||
#>
|
||||
function Get-IsFinished {
|
||||
return [bool](Get-SetupOption $finishedOption);
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets a value indicating whether the setup has finished.
|
||||
#>
|
||||
function Set-IsFinished {
|
||||
param(
|
||||
$Value
|
||||
)
|
||||
|
||||
Set-SetupOption $finishedOption $true;
|
||||
}
|
||||
}
|
||||
|
|
335
scripts/Windows/Scripts/SoftwareManagement.ps1
Normal file
335
scripts/Windows/Scripts/SoftwareManagement.ps1
Normal file
|
@ -0,0 +1,335 @@
|
|||
$null = New-Module {
|
||||
. "$PSScriptRoot/../../Common/Scripts/BrowserAutomation.ps1";
|
||||
. "$PSScriptRoot/../../Common/Scripts/SoftwareManagement.ps1";
|
||||
|
||||
$chocoRunner = {
|
||||
param(
|
||||
[string] $Action = 'install',
|
||||
[string[]] $ArgumentList,
|
||||
[scriptblock] $Guard = { $true },
|
||||
[Parameter(Position = 0)]
|
||||
[string] $Name,
|
||||
[Parameter(ValueFromRemainingArguments = $true)]
|
||||
[string[]] $AdditionalNames = @()
|
||||
)
|
||||
|
||||
[System.Collections.ArrayList] $Names = @();
|
||||
$null = $Names.Add($Name);
|
||||
$Names.AddRange($AdditionalNames);
|
||||
|
||||
if (-not ($Force.IsPresent)) {
|
||||
for ($i = $Names.Count - 1; $i -ge 0; $i--) {
|
||||
$name = $Names[$i];
|
||||
|
||||
if (-not (& $Guard $name)) {
|
||||
$Names.RemoveAt($i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($Names.Count -ge 1) {
|
||||
choco $Action -y @ArgumentList @Names;
|
||||
}
|
||||
};
|
||||
|
||||
$wingetRunner = {
|
||||
param(
|
||||
[string] $Action = 'install',
|
||||
[string[]] $ArgumentList,
|
||||
[scriptblock] $Guard = { $true },
|
||||
[Parameter(Position = 0)]
|
||||
[string] $Name,
|
||||
[Parameter(ValueFromRemainingArguments = $true)]
|
||||
[string[]] $AdditionalNames = @()
|
||||
)
|
||||
|
||||
[System.Collections.ArrayList] $Names = @();
|
||||
$null = $Names.Add($Name);
|
||||
$Names.AddRange($AdditionalNames);
|
||||
|
||||
[string[]] $arguments = $ArgumentList + (& {
|
||||
if ($Action -eq 'install') {
|
||||
@("--accept-package-agreements")
|
||||
};
|
||||
});
|
||||
|
||||
foreach ($name in $Names) {
|
||||
if ($Force.IsPresent -or (& $Guard $name $PSBoundParameters)) {
|
||||
winget $Action `
|
||||
--accept-source-agreements `
|
||||
--source winget `
|
||||
@arguments `
|
||||
--exact --id $name ;
|
||||
} else {
|
||||
Write-Host "Package ``$name`` is already installed"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks whether `winget` is working properly.
|
||||
#>
|
||||
function Test-Winget {
|
||||
(Test-Command winget) -and (
|
||||
& {
|
||||
$output = winget source update winget;
|
||||
|
||||
$? -and -not ([System.Linq.Enumerable]::Any(
|
||||
[string[]]($output),
|
||||
[System.Func[string,bool]]{ param($line) $line -eq "Cancelled"; }));
|
||||
});
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks whether the specified package has been installed using Chocolatey.
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the package to check.
|
||||
#>
|
||||
function Test-ChocoPackage {
|
||||
[OutputType([bool])]
|
||||
param(
|
||||
[string] $Name
|
||||
);
|
||||
|
||||
-not [string]::IsNullOrEmpty((choco list --limit-output --exact $name));
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks whether a `winget` package with the specified id is installed.
|
||||
|
||||
.PARAMETER ID
|
||||
The id of the package to check.
|
||||
#>
|
||||
function Test-WingetPackage {
|
||||
[OutputType([bool])]
|
||||
param(
|
||||
[string] $Name,
|
||||
[string[]] $ArgumentList
|
||||
)
|
||||
|
||||
& { $null = winget list --accept-source-agreements -e --id $Name @ArgumentList; $?; };
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Installs the specified packages using chocolatey.
|
||||
|
||||
.PARAMETER Names
|
||||
The names of the packages to install.
|
||||
#>
|
||||
function Install-ChocoPackage {
|
||||
param(
|
||||
[switch] $Force,
|
||||
[string[]] $ArgumentList,
|
||||
[Parameter(Position=0)]
|
||||
[string] $Name,
|
||||
[Parameter(ValueFromRemainingArguments = $true)]
|
||||
[string[]] $AdditionalNames = @()
|
||||
)
|
||||
|
||||
& $chocoRunner @PSBoundParameters -Guard {
|
||||
param($Name)
|
||||
if (Test-ChocoPackage $Name) {
|
||||
Write-Host "Package ``$Name`` is already installed"
|
||||
$false;
|
||||
} else {
|
||||
$true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Uninstalls the specified packages using chocolatey.
|
||||
#>
|
||||
function Uninstall-ChocoPackage {
|
||||
param(
|
||||
[string[]] $ArgumentList,
|
||||
[Parameter(Position=0)]
|
||||
[string] $Name,
|
||||
[Parameter(ValueFromRemainingArguments = $true)]
|
||||
[string[]] $AdditionalNames = @()
|
||||
)
|
||||
|
||||
& $chocoRunner @PSBoundParameters -Action 'uninstall' -Guard {
|
||||
param($Name)
|
||||
if (Test-ChocoPackage $Name) {
|
||||
$true;
|
||||
} else {
|
||||
Write-Host "Package ``$Name`` is not installed";
|
||||
$false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Installs the specified packages using `winget`.
|
||||
|
||||
.PARAMETER Names
|
||||
The names of the packages to install.
|
||||
#>
|
||||
function Install-WingetPackage {
|
||||
param(
|
||||
[switch] $Force,
|
||||
[string[]] $ArgumentList,
|
||||
[Parameter(Position=0)]
|
||||
[string] $Name,
|
||||
[Parameter(ValueFromRemainingArguments = $true)]
|
||||
[string[]] $AdditionalNames = @()
|
||||
)
|
||||
|
||||
& $wingetRunner @PSBoundParameters `
|
||||
-Guard {
|
||||
param($Name, $Parameters)
|
||||
if (Test-WingetPackage -Name $Name @Parameters) {
|
||||
Write-Host "Package ``$Name`` is already installed"
|
||||
$false;
|
||||
} else {
|
||||
$true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Uninstalls the specified packages using `winget`.
|
||||
#>
|
||||
function Uninstall-WingetPackage {
|
||||
param(
|
||||
[string[]] $ArgumentList,
|
||||
[Parameter(Position=0)]
|
||||
[string] $Name,
|
||||
[Parameter(ValueFromRemainingArguments = $true)]
|
||||
[string[]] $AdditionalNames = @()
|
||||
)
|
||||
|
||||
& $wingetRunner @PSBoundParameters -Action 'uninstall' -Guard {
|
||||
param($Name, $Parameters)
|
||||
if (Test-WingetPackage -Name $Name @Parameters) {
|
||||
$true;
|
||||
} else {
|
||||
Write-Host "Package ``$Name`` is not installed"
|
||||
$false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Installs a setup package from the specified source.
|
||||
|
||||
.PARAMETER Source
|
||||
The location of the setup package.
|
||||
|
||||
.PARAMETER ArgumentList
|
||||
The arguments to pass to the setup package.
|
||||
|
||||
.PARAMETER Local
|
||||
A value indicating whether the setup package is stored locally.
|
||||
#>
|
||||
function Install-SetupPackage {
|
||||
param(
|
||||
[string] $Source,
|
||||
[string[]] $ArgumentList = @("/S"),
|
||||
[switch] $Local
|
||||
)
|
||||
|
||||
[string] $dir = $null;
|
||||
[string] $filePath = $null;
|
||||
|
||||
if (-not ($Local.IsPresent)) {
|
||||
$dir = New-TemporaryDirectory;
|
||||
Write-Host "Determining the file name of ``$Source``…";
|
||||
$fileName = ([uri]$Source).Segments[-1];
|
||||
Write-Host "Found name ``$fileName``";
|
||||
$filePath = Join-Path $dir $fileName;
|
||||
|
||||
Write-Host "Downloading setup file from ``$Source``";
|
||||
Invoke-WebRequest $Source -OutFile $filePath;
|
||||
} else {
|
||||
$filePath = $Source;
|
||||
}
|
||||
|
||||
Write-Host "Starting installation of ``$(Split-Path -Leaf $filePath)``";
|
||||
Start-Process -Wait -WorkingDirectory (Split-Path -Parent $filePath) -FilePath $filePath -ArgumentList $ArgumentList;
|
||||
|
||||
if ($dir) {
|
||||
Remove-Item -Recurse $dir;
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Installs a package downloaded from ASUS.
|
||||
|
||||
.PARAMETER URL
|
||||
The URL to download the package from.
|
||||
#>
|
||||
function Install-AsusPackage {
|
||||
param(
|
||||
[string] $URL
|
||||
)
|
||||
|
||||
$file = "AsusPackage.zip";
|
||||
$dir = New-TemporaryDirectory;
|
||||
$unpackDir = New-TemporaryDirectory;
|
||||
|
||||
$null = Push-Location $dir;
|
||||
Invoke-WebRequest $URL -OutFile $file;
|
||||
Expand-Archive $file $unpackDir;
|
||||
$null = Pop-Location;
|
||||
Remove-Item -Recurse $dir;
|
||||
|
||||
$null = Start-Process -Wait -WorkingDirectory $unpackDir -FilePath (Join-Path $unpackDir "AsusSetup.exe") -ArgumentList "/S";
|
||||
Remove-Item -Recurse $unpackDir;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Downloads and installs a package from the AMD website.
|
||||
|
||||
.PARAMETER URL
|
||||
The URL to download the package from.
|
||||
#>
|
||||
function Install-AmdPackage {
|
||||
param(
|
||||
[string] $URL
|
||||
)
|
||||
|
||||
$dir = New-TemporaryDirectory;
|
||||
$cookieBannerSelector = "#onetrust-consent-sdk";
|
||||
$osSelector = "div[id$='oscategory']>div[id$='-0']";
|
||||
$downloadSelector = "$osSelector div[id$='panel'] .button a";
|
||||
|
||||
$file = Start-CustomBrowserDownload @PSBoundParameters -OutDir $dir -Action {
|
||||
param(
|
||||
[OpenQA.Selenium.Firefox.FirefoxDriver] $Browser
|
||||
)
|
||||
|
||||
$osContainer = $Browser.FindElement([OpenQA.Selenium.By]::CssSelector($osSelector));
|
||||
|
||||
if (-not ([bool] $osContainer.GetAttribute("cmp-expanded"))) {
|
||||
$osContainer.Click();
|
||||
}
|
||||
|
||||
$download = {
|
||||
$browser.FindElement([OpenQA.Selenium.By]::CssSelector($downloadSelector)).Click();
|
||||
};
|
||||
|
||||
try {
|
||||
& $download;
|
||||
} catch {
|
||||
$null = $Browser.ExecuteScript("document.querySelector('$cookieBannerSelector').remove()");
|
||||
& $download;
|
||||
}
|
||||
};
|
||||
|
||||
Start-Process -Wait -WorkingDirectory (Split-Path -Parent "$file") -FilePath "$file" -ArgumentList "/S";
|
||||
Remove-Item -Recurse $dir;
|
||||
}
|
||||
};
|
76
scripts/Windows/Scripts/System.ps1
Normal file
76
scripts/Windows/Scripts/System.ps1
Normal file
|
@ -0,0 +1,76 @@
|
|||
<#
|
||||
.SYNOPSIS
|
||||
Checks whether the running system is a QEMU virtual machine.
|
||||
#>
|
||||
function Test-Qemu {
|
||||
((Get-WmiObject win32_computersystem).Manufacturer) -eq "QEMU";
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks whether the active session is executed with admin rights.
|
||||
#>
|
||||
function Test-Admin {
|
||||
net session 2> $null | Out-Null;
|
||||
return $?;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Removes desktop icons which apply to the specified pattern.
|
||||
|
||||
.PARAMETER Pattern
|
||||
The pattern to match the icons to delete.
|
||||
#>
|
||||
function Remove-DesktopIcon {
|
||||
param(
|
||||
[string] $Pattern
|
||||
)
|
||||
|
||||
$path = "Desktop/$Pattern";
|
||||
|
||||
foreach ($userDir in @("~", $env:PUBLIC, "$env:SystemDrive/Users/Default")) {
|
||||
$fullName = "$userDir/$path";
|
||||
|
||||
if (Test-Path -PathType Leaf $fullName) {
|
||||
Remove-Item $fullName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Adds a new shortcut to the start menu.
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the icon to create.
|
||||
|
||||
.PARAMETER Target
|
||||
The file to link to.
|
||||
#>
|
||||
function Add-StartMenuIcon {
|
||||
param(
|
||||
[string] $Name,
|
||||
[string] $Target
|
||||
)
|
||||
|
||||
Import-Module KnownFolders;
|
||||
Import-Module "$env:ChocolateyInstall/helpers/chocolateyInstaller.psm1";
|
||||
Install-ChocolateyShortcut -ShortcutFilePath "$((Get-KnownFolder "Common Programs").Path)/$Name.lnk" -TargetPath ((Get-Item $Target).FullName);
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Removes icons from the task bar.
|
||||
|
||||
.PARAMETER Pattern
|
||||
The pattern of the icon names to remove.
|
||||
#>
|
||||
function Remove-TaskbarItem {
|
||||
param(
|
||||
[string] $Pattern
|
||||
)
|
||||
|
||||
Import-Module -UseWindowsPowerShell PinnedItem;
|
||||
Get-PinnedItem -Type TaskBar | Where-Object { $_.Name -like "$Pattern" } | ForEach-Object { Remove-PinnedItem $_ };
|
||||
}
|
156
scripts/Windows/Scripts/Tasks.ps1
Normal file
156
scripts/Windows/Scripts/Tasks.ps1
Normal file
|
@ -0,0 +1,156 @@
|
|||
$null = New-Module {
|
||||
. "$PSScriptRoot/Constants.ps1";
|
||||
. "$PSScriptRoot/Registry.ps1";
|
||||
. "$PSScriptRoot/../Types/OneShotTask.ps1";
|
||||
. "$PSScriptRoot/../../Common/Scripts/Config.ps1";
|
||||
$oneShotTaskName = "PortValhalla OneShot";
|
||||
$logName = "Application";
|
||||
$oneShotTrigger = 1337;
|
||||
$taskOption = "OneShotTask";
|
||||
|
||||
$getErrorPath = {
|
||||
Join-Path (Get-ArtifactRoot) "error.txt";
|
||||
};
|
||||
|
||||
$getUserName = {
|
||||
"$(Get-SetupUser)OneShot";
|
||||
};
|
||||
|
||||
$taskSetter = {
|
||||
param([Nullable[OneShotTask]] $Task)
|
||||
Set-SetupOption $taskOption ([string]$Task);
|
||||
};
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the current OneShot task.
|
||||
#>
|
||||
function Get-OneShotTask {
|
||||
$task = Get-SetupOption $taskOption;
|
||||
|
||||
if ($task) {
|
||||
return [OneShotTask]$task;
|
||||
} else {
|
||||
return $null;
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Registers a task for listening to OneShot invocations.
|
||||
#>
|
||||
function Enable-OneShotListener {
|
||||
$tempTask = "PortValhalla Temp";
|
||||
$user = & $getUserName;
|
||||
$password = [string]([guid]::NewGuid());
|
||||
|
||||
$adminGroup = @{
|
||||
SID = [SecurityIdentifier]::new([WellKnownSidType]::BuiltinAdministratorsSid, $null);
|
||||
};
|
||||
|
||||
$null = New-LocalUser -Name $user -Password (ConvertTo-SecureString -AsPlainText $password);
|
||||
Add-LocalGroupMember -Member $user @adminGroup;
|
||||
$logPath = Join-Path (Get-ArtifactRoot) "OneShotTask.log";
|
||||
$path = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList";
|
||||
$null = New-Item -Force -ErrorAction SilentlyContinue $path;
|
||||
Set-ItemProperty $path -Name $user -Value 0;
|
||||
|
||||
$action = New-ScheduledTaskAction -Execute "pwsh" -Argument "-Command & { $([string](Get-StartupCommand)) } 2>&1 | Tee-Object -FilePath $(ConvertTo-Injection $logPath)";
|
||||
schtasks /Create /SC ONEVENT /EC $logName /MO "*[System[Provider[@Name='$logName'] and EventID=$($oneShotTrigger)]]" /TR cmd.exe /TN $tempTask;
|
||||
$trigger = (Get-ScheduledTask $tempTask).Triggers;
|
||||
$null = Register-ScheduledTask -Force $oneShotTaskName -Action $action -Trigger $trigger -RunLevel Highest -User $user -Password $password;
|
||||
$null = Unregister-ScheduledTask -Confirm:$false $tempTask;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Removes the OneShot task.
|
||||
#>
|
||||
function Disable-OneShotListener {
|
||||
Unregister-ScheduledTask -Confirm:$false $oneShotTaskName;
|
||||
$user = Get-LocalUser (& $getUserName);
|
||||
[string] $sid = $user.SID;
|
||||
Remove-LocalUser $user;
|
||||
Get-CimInstance Win32_UserProfile | Where-Object { $_.SID -eq $sid } | Remove-CimInstance;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Invokes a one-shot task.
|
||||
|
||||
.PARAMETER Task
|
||||
The task to run.
|
||||
#>
|
||||
function Invoke-OneShot {
|
||||
param(
|
||||
[OneShotTask] $Task
|
||||
)
|
||||
|
||||
$errorPath = & $getErrorPath;
|
||||
& $taskSetter $Task;
|
||||
|
||||
& {
|
||||
$identifier = "EventLog$oneShotTrigger";
|
||||
$log = [System.Diagnostics.EventLog]::new($logName);
|
||||
$log.EnableRaisingEvents = $true;
|
||||
|
||||
$null = Register-ObjectEvent -InputObject $log -EventName EntryWritten -Action {
|
||||
$entry = $Event.SourceEventArgs.Entry;
|
||||
$trigger = $Event.MessageData.Trigger;
|
||||
$identifier = $Event.MessageData.Identifier;
|
||||
|
||||
if ($entry.EventID -eq $trigger) {
|
||||
$null = New-Event -SourceIdentifier $identifier;
|
||||
}
|
||||
} `
|
||||
-MessageData @{
|
||||
Trigger = $oneShotTrigger;
|
||||
Identifier = $identifier;
|
||||
};
|
||||
|
||||
Write-EventLog -LogName $logName -Source $logName -EventId $oneShotTrigger -Message "Starting OneShot task ``$(Get-OneShotTask)``…";
|
||||
|
||||
for ($i = 0; $i -lt 2; $i++) {
|
||||
Remove-Event -EventIdentifier (Wait-Event -SourceIdentifier $identifier).EventIdentifier;
|
||||
}
|
||||
};
|
||||
|
||||
if (Test-Path $errorPath) {
|
||||
$errorMessage = Get-Content $errorPath;
|
||||
Remove-Item $errorPath;
|
||||
|
||||
if ($errorMessage) {
|
||||
Write-Error $errorMessage;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Executes the specified action and notifies the OneShot task executor.
|
||||
#>
|
||||
function Start-OneShot {
|
||||
try {
|
||||
Write-Host "Running OneShot task ``$(Get-OneShotTask)``";
|
||||
|
||||
switch (Get-OneShotTask) {
|
||||
([OneShotTask]::InitializeMSAccount) {
|
||||
Initialize-UserCreation;
|
||||
}
|
||||
([OneShotTask]::DisableUAC) {
|
||||
Disable-UAC;
|
||||
Register-Setup;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch {
|
||||
$errorPath = & $getErrorPath;
|
||||
Set-Content -Path $errorPath -Value $Error;
|
||||
Set-UserPermissions $errorPath;
|
||||
}
|
||||
finally {
|
||||
& $taskSetter $null;
|
||||
Write-EventLog -LogName $logName -Source $logName -EventId $oneShotTrigger -Message "The OneShot task ``$(Get-OneShotTask)`` finished.";
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,9 +3,11 @@ using namespace System.Security.Principal;
|
|||
|
||||
$null = New-Module {
|
||||
. "$PSScriptRoot/Deployment.ps1";
|
||||
. "$PSScriptRoot/Registry.ps1";
|
||||
. "$PSScriptRoot/System.ps1";
|
||||
. "$PSScriptRoot/../Types/OneShotTask.ps1";
|
||||
. "$PSScriptRoot/../../Common/Scripts/Config.ps1";
|
||||
. "$PSScriptRoot/../../Common/Scripts/Operations.ps1";
|
||||
. "$PSScriptRoot/../../Common/Types/OneShotTask.ps1";
|
||||
$loggedInUserOption = "LoggedInUser";
|
||||
|
||||
<#
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
. "$PSScriptRoot/Constants.ps1";
|
||||
. "$PSScriptRoot/../Scripts/Security.ps1";
|
||||
. "$PSScriptRoot/../../Common/Scripts/SoftwareManagement.ps1";
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
|
@ -57,7 +58,6 @@ function Install-Wsl {
|
|||
wsl --install --no-launch;
|
||||
# Microsoft broke WSL - Quelle surprise!
|
||||
# ToDo: Remove this workaround once it's unbroken
|
||||
. "$PSScriptRoot/../../Common/Scripts/Software.ps1";
|
||||
Install-SetupPackage "https://github.com/microsoft/WSL/releases/download/2.3.17/wsl.2.3.17.0.x64.msi" -ArgumentList "/Quiet";
|
||||
}
|
||||
|
||||
|
@ -125,3 +125,47 @@ function Unregister-WslDistribution {
|
|||
Uninstall-WslDistribution;
|
||||
Move-Item $tempDisk $wslDisk;
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Converts the specified path to linux and escapes it for the use in a script.
|
||||
|
||||
.PARAMETER Path
|
||||
The path to convert.
|
||||
#>
|
||||
function ConvertTo-LinuxPath {
|
||||
param(
|
||||
[string] $Path
|
||||
)
|
||||
|
||||
& {
|
||||
$ErrorActionPreference = 'Continue';
|
||||
$completed = $false;
|
||||
|
||||
while (-not $completed) {
|
||||
$job = Start-Job {
|
||||
$env:Value = Resolve-Path $Using:Path;
|
||||
$env:WSLENV = "Value/p";
|
||||
$result = wsl -- bash -c 'echo "$Value"';
|
||||
wsl -e printf "%q" "$result";
|
||||
};
|
||||
|
||||
$result = Receive-Job -Wait $job;
|
||||
|
||||
|
||||
if ((Split-Path -Leaf $Path) -ne (Split-Path -Leaf $result)) {
|
||||
Write-Error "The result of the path conversion of ``$Path`` was unexpected: ``$result``";
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($job.State -ne ([System.Management.Automation.JobState]::Completed)) {
|
||||
Write-Error "An error occurred while converting ``$Path`` to a Linux path.`nOutput: ``$result``";
|
||||
continue;
|
||||
}
|
||||
|
||||
$completed = $true;
|
||||
}
|
||||
|
||||
$result;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ param (
|
|||
[hashtable] $Arguments
|
||||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Types/InstallerAction.ps1";
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@ param(
|
|||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/AppAssociations.ps1";
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
|
||||
Start-SoftwareInstaller @PSBoundParameters `
|
||||
|
|
|
@ -6,6 +6,7 @@ param(
|
|||
& {
|
||||
param ($Parameters)
|
||||
. "$PSScriptRoot/../../Scripts/Restoration.ps1";
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
$configPath = "$env:LocalAppData/LGHUB";
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ param(
|
|||
[hashtable] $Arguments
|
||||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
|
||||
Start-SoftwareInstaller @PSBoundParameters `
|
||||
|
|
|
@ -6,6 +6,7 @@ param(
|
|||
& {
|
||||
param($Parameters)
|
||||
. "$PSScriptRoot/../../Scripts/Restoration.ps1";
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/System.ps1";
|
||||
$path = "$HOME/Documents/ManiaPlanet";
|
||||
|
|
|
@ -3,6 +3,7 @@ param (
|
|||
[hashtable] $Arguments
|
||||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Types/InstallerAction.ps1";
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ param(
|
|||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/Restoration.ps1";
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/System.ps1";
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ param(
|
|||
& {
|
||||
param($Parameters)
|
||||
. "$PSScriptRoot/../../Scripts/Restoration.ps1";
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/System.ps1";
|
||||
$path = "C:/tools/RetroArch-Win64";
|
||||
|
|
|
@ -6,6 +6,7 @@ param(
|
|||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/AppAssociations.ps1";
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
|
||||
Start-SoftwareInstaller @PSBoundParameters `
|
||||
|
|
|
@ -5,6 +5,7 @@ param(
|
|||
[hashtable] $Arguments
|
||||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/System.ps1";
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ param(
|
|||
[hashtable] $Arguments
|
||||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/System.ps1";
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ param(
|
|||
& {
|
||||
param($Parameters)
|
||||
. "$PSScriptRoot/../../Scripts/Restoration.ps1";
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
$path = "$HOME/Documents/TmForever";
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ param(
|
|||
[hashtable] $Arguments
|
||||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/System.ps1";
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ param(
|
|||
param($parameters)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/Restoration.ps1";
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/BrowserAutomation.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/SoftwareManagement.ps1";
|
||||
|
|
|
@ -6,6 +6,7 @@ param(
|
|||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/AppAssociations.ps1";
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/System.ps1";
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ param (
|
|||
[hashtable] $Arguments
|
||||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Types/InstallerAction.ps1";
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ param (
|
|||
[hashtable] $Arguments
|
||||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Config.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Types/InstallerAction.ps1";
|
||||
|
|
|
@ -3,6 +3,7 @@ param(
|
|||
[hashtable] $Arguments
|
||||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
|
||||
& {
|
||||
|
|
|
@ -6,6 +6,7 @@ param(
|
|||
& {
|
||||
param($Parameters)
|
||||
. "$PSScriptRoot/../../Scripts/Restoration.ps1";
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/System.ps1";
|
||||
$path = "$env:AppData/osu";
|
||||
|
|
|
@ -8,6 +8,7 @@ param(
|
|||
[hashtable] $Parameters
|
||||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Types/InstallerAction.ps1";
|
||||
$base = "$PSScriptRoot/../../../Common/Software/vscode/Main.ps1";
|
||||
|
|
|
@ -8,6 +8,7 @@ param(
|
|||
[hashtable] $Parameters
|
||||
)
|
||||
|
||||
. "$PSScriptRoot/../../Scripts/SoftwareManagement.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Software/PowerShell/Profile.ps1";
|
||||
. "$PSScriptRoot/../../../Common/Types/InstallerAction.ps1";
|
||||
|
|
Loading…
Reference in a new issue