<#
. SYNOPSIS
Download the latest Sophia Script version from the last commit available , depending on which Windows or PowerShell versions are used to
. SYNOPSIS
For example , if you start script on Windows 11 via PowerShell 5 . 1 you will start downloading Sophia Script for Windows 11 PowerShell 5 . 1
. EXAMPLE
iwr sl . sophia . team -useb | iex
#>
Clear-Host
[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 "
$Host . UI . RawUI . WindowTitle = " Sophia Script for Windows 10 LTSC 2019 | Latest | Made with $( [System.Char] :: ConvertFromUtf32 ( 0x1F497 ) ) of Windows | $( [System.Char] 0x00A9 ) farag, Inestic & lowl1f3, 2014 $( [System.Char] 0x2013 ) 2024 "
}
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 "
$Host . UI . RawUI . WindowTitle = " Sophia Script for Windows 10 LTSC 2021 | Latest | Made with $( [System.Char] :: ConvertFromUtf32 ( 0x1F497 ) ) of Windows | $( [System.Char] 0x00A9 ) farag, Inestic & lowl1f3, 2014 $( [System.Char] 0x2013 ) 2024 "
}
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 "
$Host . UI . RawUI . WindowTitle = " Sophia Script for Windows 10 | Latest | Made with $( [System.Char] :: ConvertFromUtf32 ( 0x1F497 ) ) of Windows | $( [System.Char] 0x00A9 ) farag, Inestic & lowl1f3, 2014 $( [System.Char] 0x2013 ) 2024 "
}
else
{
$Version = " Sophia_Script_for_Windows_10_PowerShell_7 "
$Host . UI . RawUI . WindowTitle = " Sophia Script for Windows 10 PowerShell 7 | Latest | Made with $( [System.Char] :: ConvertFromUtf32 ( 0x1F497 ) ) of Windows | $( [System.Char] 0x00A9 ) farag, Inestic & lowl1f3, 2014 $( [System.Char] 0x2013 ) 2024 "
}
}
{ $_ -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 "
$Host . UI . RawUI . WindowTitle = " Sophia Script for Windows 11 | Latest | Made with $( [System.Char] :: ConvertFromUtf32 ( 0x1F497 ) ) of Windows | $( [System.Char] 0x00A9 ) farag, Inestic & lowl1f3, 2014 $( [System.Char] 0x2013 ) 2024 "
}
else
{
$Version = " Sophia_Script_for_Windows_11_PowerShell_7 "
$Host . UI . RawUI . WindowTitle = " Sophia Script for Windows 11 PowerShell 7 | Latest | Made with $( [System.Char] :: ConvertFromUtf32 ( 0x1F497 ) ) of Windows | $( [System.Char] 0x00A9 ) farag, Inestic & lowl1f3, 2014 $( [System.Char] 0x2013 ) 2024 "
}
}
else
{
$Version = " Sophia_Script_for_Windows_11_LTSC_2024 "
$Host . UI . RawUI . WindowTitle = " Sophia Script for Windows 11 LTSC 2024 | Latest | Made with $( [System.Char] :: ConvertFromUtf32 ( 0x1F497 ) ) of Windows | $( [System.Char] 0x00A9 ) farag, Inestic & lowl1f3, 2014 $( [System.Char] 0x2013 ) 2024 "
}
}
}
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