Dmitry Nefedov
4 weeks ago
10 changed files with 353 additions and 8 deletions
@ -0,0 +1,326 @@ |
|||
<# |
|||
.SYNOPSIS |
|||
Download the latest Sophia Script version, depending on what Windows or PowerShell versions are used to |
|||
|
|||
.SYNOPSIS |
|||
Download the latest Sophia Script version, depending on what Windows or PowerShell versions are used to |
|||
E.g., if you start script on Windows 11 via PowerShell 5.1 you will start downloading Sophia Script for Windows 11 PowerShell 5.1 |
|||
|
|||
.EXAMPLE Download and expand Sophia Script archive |
|||
iwr sl.sophia.team -useb | iex |
|||
#> |
|||
|
|||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 |
|||
|
|||
Remove-Variable * -ErrorAction Ignore |
|||
|
|||
if ($Host.Version.Major -eq 5) |
|||
{ |
|||
# Progress bar can significantly impact cmdlet performance |
|||
# https://github.com/PowerShell/PowerShell/issues/2138 |
|||
$Script:ProgressPreference = "SilentlyContinue" |
|||
} |
|||
|
|||
$DownloadsFolder = Get-ItemPropertyValue -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" -Name "{374DE290-123F-4565-9164-39C4925E467B}" |
|||
$Parameters = @{ |
|||
Uri = "https://github.com/farag2/Sophia-Script-for-Windows/archive/refs/heads/master.zip" |
|||
OutFile = "$DownloadsFolder\master.zip" |
|||
UseBasicParsing = $true |
|||
Verbose = $true |
|||
} |
|||
Invoke-RestMethod @Parameters |
|||
|
|||
switch ((Get-CimInstance -ClassName Win32_OperatingSystem).BuildNumber) |
|||
{ |
|||
"17763" |
|||
{ |
|||
# Check for Windows 10 LTSC 2019 |
|||
if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ProductName) -match "LTSC 2019") |
|||
{ |
|||
$Version = "Sophia_Script_for_Windows_10_LTSC_2019" |
|||
} |
|||
else |
|||
{ |
|||
Write-Verbose -Message "Windows version is not supported. Update your Windows" -Verbose |
|||
|
|||
# Receive updates for other Microsoft products when you update Windows |
|||
(New-Object -ComObject Microsoft.Update.ServiceManager).AddService2("7971f918-a847-4430-9279-4a52d1efe18d", 7, "") |
|||
|
|||
# Check for updates |
|||
Start-Process -FilePath "$env:SystemRoot\System32\UsoClient.exe" -ArgumentList StartInteractiveScan |
|||
|
|||
# Open the "Windows Update" page |
|||
Start-Process -FilePath "ms-settings:windowsupdate" |
|||
|
|||
pause |
|||
exit |
|||
} |
|||
} |
|||
"19044" |
|||
{ |
|||
# Check for Windows 10 LTSC 2021 |
|||
if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ProductName) -match "LTSC 2021") |
|||
{ |
|||
$Version = "Sophia_Script_for_Windows_10_LTSC_2021" |
|||
} |
|||
else |
|||
{ |
|||
Write-Verbose -Message "Windows version is not supported. Update your Windows" -Verbose |
|||
|
|||
# Receive updates for other Microsoft products when you update Windows |
|||
(New-Object -ComObject Microsoft.Update.ServiceManager).AddService2("7971f918-a847-4430-9279-4a52d1efe18d", 7, "") |
|||
|
|||
# Check for updates |
|||
Start-Process -FilePath "$env:SystemRoot\System32\UsoClient.exe" -ArgumentList StartInteractiveScan |
|||
|
|||
# Open the "Windows Update" page |
|||
Start-Process -FilePath "ms-settings:windowsupdate" |
|||
|
|||
pause |
|||
exit |
|||
} |
|||
} |
|||
"19045" |
|||
{ |
|||
if ($Host.Version.Major -eq 5) |
|||
{ |
|||
$Version = "Sophia_Script_for_Windows_10" |
|||
} |
|||
else |
|||
{ |
|||
$Version = "Sophia_Script_for_Windows_10_PowerShell_7" |
|||
} |
|||
} |
|||
{$_ -ge 22631} |
|||
{ |
|||
# Check for Windows 11 LTSC 2024 |
|||
if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ProductName) -notmatch "LTSC 2024") |
|||
{ |
|||
if ($Host.Version.Major -eq 5) |
|||
{ |
|||
$Version = "Sophia_Script_for_Windows_11" |
|||
} |
|||
else |
|||
{ |
|||
$Version = "Sophia_Script_for_Windows_11_PowerShell_7" |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
$Version = "Sophia_Script_for_Windows_11_LTSC_2024" |
|||
} |
|||
} |
|||
} |
|||
Invoke-WebRequest @Parameters |
|||
|
|||
if (-not (Test-Path -Path "$DownloadsFolder\SophiaScriptTemp")) |
|||
{ |
|||
New-Item -Path "$DownloadsFolder\SophiaScriptTemp" -ItemType Directory -Force |
|||
} |
|||
else |
|||
{ |
|||
Remove-Item -Path "$DownloadsFolder\SophiaScriptTemp" -Force -Recurse |
|||
|
|||
if ((Get-ChildItem -Path "$DownloadsFolder\SophiaScriptTemp" -ErrorAction Ignore | Measure-Object).Count -ne 0) |
|||
{ |
|||
Write-Verbose -Message "Some files in `"$DownloadsFolder\SophiaScriptTemp`" folder are in use. Please remove them manually and try to use script again." -Verbose |
|||
|
|||
pause |
|||
exit |
|||
} |
|||
} |
|||
|
|||
if (Test-Path -Path "$DownloadsFolder\$($Version)_Latest") |
|||
{ |
|||
Remove-Item -Path "$DownloadsFolder\$($Version)_Latest" -Recurse -Force -ErrorAction Ignore |
|||
|
|||
if ((Get-ChildItem -Path "$DownloadsFolder\$($Version)_Latest" -ErrorAction Ignore | Measure-Object).Count -ne 0) |
|||
{ |
|||
Write-Verbose -Message "Some files in `"$DownloadsFolder\$($Version)_Latest`" folder are in use. Please remove `"$DownloadsFolder\$($Version)_Latest`" manually and try to use script again." -Verbose |
|||
|
|||
pause |
|||
exit |
|||
} |
|||
} |
|||
|
|||
& "$env:SystemRoot\System32\tar.exe" -C "$DownloadsFolder\SophiaScriptTemp" -xf "$DownloadsFolder\master.zip" "Sophia-Script-for-Windows-master/src/$Version" |
|||
|
|||
New-Item -Path "$DownloadsFolder\SophiaScriptTemp\Sophia-Script-for-Windows-master\src\$Version\bin" -ItemType Directory -Force |
|||
|
|||
# Download LGPO |
|||
# https://techcommunity.microsoft.com/t5/microsoft-security-baselines/lgpo-exe-local-group-policy-object-utility-v1-0/ba-p/701045 |
|||
$Parameters = @{ |
|||
Uri = "https://download.microsoft.com/download/8/5/C/85C25433-A1B0-4FFA-9429-7E023E7DA8D8/LGPO.zip" |
|||
OutFile = "$DownloadsFolder\SophiaScriptTemp\Sophia-Script-for-Windows-master\src\$Version\bin\LGPO.zip" |
|||
UseBasicParsing = $true |
|||
Verbose = $true |
|||
} |
|||
Invoke-WebRequest @Parameters |
|||
|
|||
$Parameters = @{ |
|||
Path = "$DownloadsFolder\SophiaScriptTemp\Sophia-Script-for-Windows-master\src\$Version\bin\LGPO.zip" |
|||
DestinationPath = "$DownloadsFolder\SophiaScriptTemp\Sophia-Script-for-Windows-master\src\$Version\bin" |
|||
Force = $true |
|||
Verbose = $true |
|||
} |
|||
Expand-Archive @Parameters |
|||
|
|||
$Parameters = @{ |
|||
Path = "$DownloadsFolder\SophiaScriptTemp\Sophia-Script-for-Windows-master\src\$Version\bin\LGPO_30\LGPO.exe" |
|||
Destination = "$DownloadsFolder\SophiaScriptTemp\Sophia-Script-for-Windows-master\src\$Version\bin\LGPO.exe" |
|||
Force = $true |
|||
} |
|||
Move-Item @Parameters |
|||
|
|||
if ($Version -match "PowerShell_7") |
|||
{ |
|||
# Download Microsoft.Windows.SDK.NET.dll & WinRT.Runtime.dll |
|||
# https://www.nuget.org/packages/Microsoft.Windows.SDK.NET.Ref |
|||
$Parameters = @{ |
|||
Uri = "https://www.nuget.org/api/v2/package/Microsoft.Windows.SDK.NET.Ref" |
|||
OutFile = "$DownloadsFolder\SophiaScriptTemp\Sophia-Script-for-Windows-master\src\$Version\bin\microsoft.windows.sdk.net.ref.zip" |
|||
UseBasicParsing = $true |
|||
} |
|||
Invoke-RestMethod @Parameters |
|||
|
|||
# Extract Microsoft.Windows.SDK.NET.dll & WinRT.Runtime.dll from archive |
|||
Add-Type -Assembly System.IO.Compression.FileSystem |
|||
$ZIP = [IO.Compression.ZipFile]::OpenRead("$DownloadsFolder\SophiaScriptTemp\Sophia-Script-for-Windows-master\src\$Version\bin\microsoft.windows.sdk.net.ref.zip") |
|||
$Entries = $ZIP.Entries | Where-Object -FilterScript {($_.FullName -eq "lib/net8.0/Microsoft.Windows.SDK.NET.dll") -or ($_.FullName -eq "lib/net8.0/WinRT.Runtime.dll")} |
|||
$Entries | ForEach-Object -Process {[IO.Compression.ZipFileExtensions]::ExtractToFile($_, "$DownloadsFolder\SophiaScriptTemp\Sophia-Script-for-Windows-master\src\$Version\bin\$($_.Name)", $true)} |
|||
$ZIP.Dispose() |
|||
|
|||
Remove-Item -Path "$DownloadsFolder\SophiaScriptTemp\Sophia-Script-for-Windows-master\src\$Version\bin\microsoft.windows.sdk.net.ref.zip" -Recurse -Force |
|||
} |
|||
|
|||
$Parameters = @{ |
|||
Path = "$DownloadsFolder\SophiaScriptTemp\Sophia-Script-for-Windows-master\src\$Version" |
|||
NewName = "$($Version)_Latest" |
|||
Force = $true |
|||
} |
|||
Rename-Item @Parameters |
|||
|
|||
$Parameters = @{ |
|||
Path = "$DownloadsFolder\SophiaScriptTemp\Sophia-Script-for-Windows-master\src\$($Version)_Latest" |
|||
Destination = "$DownloadsFolder" |
|||
Force = $true |
|||
} |
|||
Move-Item @Parameters |
|||
|
|||
$Path = @( |
|||
"$DownloadsFolder\SophiaScriptTemp", |
|||
"$DownloadsFolder\$($Version)_Latest\bin\LGPO_30", |
|||
"$DownloadsFolder\$($Version)_Latest\bin\LGPO.zip", |
|||
"$DownloadsFolder\master.zip" |
|||
) |
|||
Remove-Item -Path $Path -Recurse -Force |
|||
|
|||
switch ($Version) |
|||
{ |
|||
"Sophia_Script_for_Windows_10_LTSC_2019" |
|||
{ |
|||
Invoke-Item -Path "$DownloadsFolder\Sophia_Script_for_Windows_10_LTSC_2019" |
|||
|
|||
if ((([System.Security.Principal.WindowsIdentity]::GetCurrent()).Owner -eq "S-1-5-32-544")) |
|||
{ |
|||
Set-Location -Path "$DownloadsFolder\Sophia_Script_for_Windows_10_LTSC_2019_Latest" |
|||
} |
|||
} |
|||
"Sophia_Script_for_Windows_10_LTSC_2021" |
|||
{ |
|||
Invoke-Item -Path "$DownloadsFolder\Sophia_Script_for_Windows_10_LTSC_2021_Latest" |
|||
|
|||
if ((([System.Security.Principal.WindowsIdentity]::GetCurrent()).Owner -eq "S-1-5-32-544")) |
|||
{ |
|||
Set-Location -Path "$DownloadsFolder\Sophia_Script_for_Windows_10_LTSC_2021_Latest" |
|||
} |
|||
} |
|||
"Sophia_Script_for_Windows_11_LTSC_2024" |
|||
{ |
|||
Invoke-Item -Path "$DownloadsFolder\Sophia_Script_for_Windows_11_LTSC_2024_Latest" |
|||
|
|||
if ((([System.Security.Principal.WindowsIdentity]::GetCurrent()).Owner -eq "S-1-5-32-544")) |
|||
{ |
|||
Set-Location -Path "$DownloadsFolder\Sophia_Script_for_Windows_11_LTSC_2024_Latest" |
|||
} |
|||
} |
|||
"Sophia_Script_for_Windows_10" |
|||
{ |
|||
Invoke-Item -Path "$DownloadsFolder\Sophia_Script_for_Windows_10_Latest" |
|||
|
|||
if ((([System.Security.Principal.WindowsIdentity]::GetCurrent()).Owner -eq "S-1-5-32-544")) |
|||
{ |
|||
Set-Location -Path "$DownloadsFolder\Sophia_Script_for_Windows_10_Latest" |
|||
} |
|||
} |
|||
"Sophia_Script_for_Windows_10_PowerShell_7" |
|||
{ |
|||
Invoke-Item -Path "$DownloadsFolder\Sophia_Script_for_Windows_10_PowerShell_7_Latest" |
|||
|
|||
if ((([System.Security.Principal.WindowsIdentity]::GetCurrent()).Owner -eq "S-1-5-32-544")) |
|||
{ |
|||
Set-Location -Path "$DownloadsFolder\Sophia_Script_for_Windows_10_PowerShell_7_Latest" |
|||
} |
|||
} |
|||
"Sophia_Script_for_Windows_11" |
|||
{ |
|||
Invoke-Item -Path "$DownloadsFolder\Sophia_Script_for_Windows_11_Latest" |
|||
|
|||
if ((([System.Security.Principal.WindowsIdentity]::GetCurrent()).Owner -eq "S-1-5-32-544")) |
|||
{ |
|||
Set-Location -Path "$DownloadsFolder\Sophia_Script_for_Windows_11_Latest" |
|||
} |
|||
|
|||
return |
|||
} |
|||
"Sophia_Script_for_Windows_11_PowerShell_7" |
|||
{ |
|||
Invoke-Item -Path "$DownloadsFolder\Sophia_Script_for_Windows_11_PowerShell_7_Latest" |
|||
|
|||
if ((([System.Security.Principal.WindowsIdentity]::GetCurrent()).Owner -eq "S-1-5-32-544")) |
|||
{ |
|||
Set-Location -Path "$DownloadsFolder\Sophia_Script_for_Windows_11_PowerShell_7_Latest" |
|||
} |
|||
} |
|||
} |
|||
|
|||
# https://github.com/PowerShell/PowerShell/issues/21070 |
|||
$CompilerParameters = [System.CodeDom.Compiler.CompilerParameters]::new("System.dll") |
|||
$CompilerParameters.TempFiles = [System.CodeDom.Compiler.TempFileCollection]::new($env:TEMP, $false) |
|||
$CompilerParameters.GenerateInMemory = $true |
|||
$Signature = @{ |
|||
Namespace = "WinAPI" |
|||
Name = "ForegroundWindow" |
|||
Language = "CSharp" |
|||
CompilerParameters = $CompilerParameters |
|||
MemberDefinition = @" |
|||
[DllImport("user32.dll")] |
|||
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); |
|||
[DllImport("user32.dll")] |
|||
[return: MarshalAs(UnmanagedType.Bool)] |
|||
public static extern bool SetForegroundWindow(IntPtr hWnd); |
|||
"@ |
|||
} |
|||
|
|||
# PowerShell 7 has CompilerOptions argument instead of CompilerParameters as PowerShell 5 has |
|||
# https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/add-type#-compileroptions |
|||
if ($Host.Version.Major -eq 7) |
|||
{ |
|||
$Signature.Remove("CompilerParameters") |
|||
$Signature.Add("CompilerOptions", $CompilerParameters) |
|||
} |
|||
|
|||
if (-not ("WinAPI.ForegroundWindow" -as [type])) |
|||
{ |
|||
Add-Type @Signature |
|||
} |
|||
|
|||
Start-Sleep -Seconds 1 |
|||
|
|||
Get-Process -Name explorer | Where-Object -FilterScript {$_.MainWindowTitle -match "Sophia_Script_for_Windows"} | ForEach-Object -Process { |
|||
# Show window, if minimized |
|||
[WinAPI.ForegroundWindow]::ShowWindowAsync($_.MainWindowHandle, 5) |
|||
|
|||
# Force move the console window to the foreground |
|||
[WinAPI.ForegroundWindow]::SetForegroundWindow($_.MainWindowHandle) |
|||
} | Out-Null |
Loading…
Reference in new issue