Files
2026-03-10 19:07:03 +01:00

1028 lines
37 KiB
PowerShell

<#
.SYNOPSIS
Initial checks before proceeding to module execution
.VERSION
7.1.4
.DATE
24.02.2026
.COPYRIGHT
(c) 2014—2026 Team Sophia
.LINK
https://github.com/farag2/Sophia-Script-for-Windows
#>
function InitialActions
{
param
(
[Parameter(Mandatory = $false)]
[switch]
$Warning
)
Clear-Host
$Global:Error.Clear()
Set-StrictMode -Version Latest
$Host.UI.RawUI.WindowTitle = "Sophia Script for Windows 11 v7.1.4 (PowerShell 7) | Made with $([System.Char]::ConvertFromUtf32(0x1F497)) of Windows | $([System.Char]0x00A9) Team Sophia, 2014$([System.Char]0x2013)2026"
# Unblock all files in the script folder by removing the Zone.Identifier alternate data stream with a value of "3"
Get-ChildItem -Path $PSScriptRoot\..\..\ -File -Recurse -Force | Unblock-File
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# Progress bar can significantly impact cmdlet performance
# https://github.com/PowerShell/PowerShell/issues/2138
$Global:ProgressPreference = "SilentlyContinue"
# Checking whether all files were expanded before running
$ScriptFiles = [Array]::TrueForAll(@(
"$PSScriptRoot\..\..\Localizations\de-DE\Sophia.psd1",
"$PSScriptRoot\..\..\Localizations\en-US\Sophia.psd1",
"$PSScriptRoot\..\..\Localizations\es-ES\Sophia.psd1",
"$PSScriptRoot\..\..\Localizations\fr-FR\Sophia.psd1",
"$PSScriptRoot\..\..\Localizations\hu-HU\Sophia.psd1",
"$PSScriptRoot\..\..\Localizations\it-IT\Sophia.psd1",
"$PSScriptRoot\..\..\Localizations\pl-PL\Sophia.psd1",
"$PSScriptRoot\..\..\Localizations\pt-BR\Sophia.psd1",
"$PSScriptRoot\..\..\Localizations\ru-RU\Sophia.psd1",
"$PSScriptRoot\..\..\Localizations\tr-TR\Sophia.psd1",
"$PSScriptRoot\..\..\Localizations\uk-UA\Sophia.psd1",
"$PSScriptRoot\..\..\Localizations\zh-CN\Sophia.psd1",
"$PSScriptRoot\..\..\Module\Private\Get-Hash.ps1",
"$PSScriptRoot\..\..\Module\Private\InitialActions.ps1",
"$PSScriptRoot\..\..\Module\Private\PostActions.ps1",
"$PSScriptRoot\..\..\Module\Private\Set-KnownFolderPath.ps1",
"$PSScriptRoot\..\..\Module\Private\Set-Policy.ps1",
"$PSScriptRoot\..\..\Module\Private\Set-UserShellFolder.ps1",
"$PSScriptRoot\..\..\Module\Private\Show-Menu.ps1",
"$PSScriptRoot\..\..\Module\Private\Write-AdditionalKeys.ps1",
"$PSScriptRoot\..\..\Module\Private\Write-ExtensionKeys.ps1",
"$PSScriptRoot\..\..\Module\Sophia.psm1",
"$PSScriptRoot\..\..\Manifest\SophiaScript.psd1",
"$PSScriptRoot\..\..\Import-TabCompletion.ps1",
"$PSScriptRoot\..\..\Binaries\LGPO.exe",
"$PSScriptRoot\..\..\Binaries\Microsoft.Windows.SDK.NET.dll",
"$PSScriptRoot\..\..\Binaries\WinRT.Runtime.dll"
),
[Predicate[string]]{
param($File)
Test-Path -Path $File
})
if (-not $ScriptFiles)
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message "Required files are missing. Please, do not download the whole code from the repository, but download archive from release page for you system."
Write-Information -MessageData "" -InformationAction Continue
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Try to import localizations
try
{
Import-LocalizedData -BindingVariable Global:Localization -UICulture $PSUICulture -BaseDirectory $PSScriptRoot\..\..\Localizations -FileName Sophia -ErrorAction Stop
}
catch
{
# If there's no folder with current localization ID ($PSUICulture), then import en-US localization
Import-LocalizedData -BindingVariable Global:Localization -UICulture en-US -BaseDirectory $PSScriptRoot\..\..\Localizations -FileName Sophia
}
# Check CPU architecture
$Caption = (Get-CimInstance -ClassName CIM_Processor).Caption
if (($Caption -notmatch "AMD64") -and ($Caption -notmatch "Intel64"))
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message ($Localization.UnsupportedArchitecture -f $Caption)
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Checking whether the current module version is the latest one
try
{
# https://github.com/farag2/Sophia-Script-for-Windows/blob/master/sophia_script_versions.json
$Parameters = @{
Uri = "https://raw.githubusercontent.com/farag2/Sophia-Script-for-Windows/master/sophia_script_versions.json"
Verbose = $true
UseBasicParsing = $true
}
$LatestRelease = (Invoke-RestMethod @Parameters).Sophia_Script_Windows_11_PowerShell_5_1
$CurrentRelease = (Get-Module -Name SophiaScript).Version.ToString()
if ([System.Version]$LatestRelease -gt [System.Version]$CurrentRelease)
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message ($Localization.UnsupportedRelease -f $LatestRelease)
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest" -Verbose
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
}
catch [System.Net.WebException]
{
Write-Warning -Message ($Localization.NoResponse -f "https://github.com")
Write-Error -Message ($Localization.NoResponse -f "https://github.com") -ErrorAction SilentlyContinue
}
# Checking whether the script was run via PowerShell 7
if ($PSVersionTable.PSVersion.Major -ne 7)
{
Write-Information -MessageData "" -InformationAction Continue
$MandatoryPSVersion = (Import-PowershellDataFile -Path "$PSScriptRoot\..\..\Manifest\SophiaScript.psd1").PowerShellVersion
Write-Warning -Message ($Localization.UnsupportedPowerShell -f $PSVersionTable.PSVersion.Major, $PSVersionTable.PSVersion.Minor, $MandatoryPSVersion)
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Checking whether PowerShell 7 was installed from the Microsoft Store
# https://github.com/PowerShell/PowerShell/issues/21295
if ((Get-Process -Id $PID).Path -match "C:\\Program Files\\WindowsApps")
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message $Localization.MicroSoftStorePowerShellWarning
Write-Verbose -Message "https://github.com/powershell/powershell/releases/latest" -Verbose
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Import PowerShell 5.1 modules
try
{
Import-Module -Name Microsoft.PowerShell.Management, PackageManagement, Appx, DISM -UseWindowsPowerShell -Force -ErrorAction Stop
}
catch
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message $Localization.PowerShellImportFailed
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# https://github.com/PowerShell/PowerShell/issues/21070
$Global:CompilerOptions = [System.CodeDom.Compiler.CompilerParameters]::new("System.dll")
$Global:CompilerOptions.TempFiles = [System.CodeDom.Compiler.TempFileCollection]::new($env:TEMP, $false)
$Global:CompilerOptions.GenerateInMemory = $true
$Signature = @{
Namespace = "WinAPI"
Name = "GetStrings"
Language = "CSharp"
UsingNamespace = "System.Text"
CompilerOptions = $CompilerOptions
MemberDefinition = @"
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
internal static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax);
public static string GetString(uint strId)
{
IntPtr intPtr = GetModuleHandle("shell32.dll");
StringBuilder sb = new StringBuilder(255);
LoadString(intPtr, strId, sb, sb.Capacity);
return sb.ToString();
}
// Get string from other DLLs
[DllImport("shlwapi.dll", CharSet=CharSet.Unicode)]
private static extern int SHLoadIndirectString(string pszSource, StringBuilder pszOutBuf, int cchOutBuf, string ppvReserved);
public static string GetIndirectString(string indirectString)
{
try
{
int returnValue;
StringBuilder lptStr = new StringBuilder(1024);
returnValue = SHLoadIndirectString(indirectString, lptStr, 1024, null);
if (returnValue == 0)
{
return lptStr.ToString();
}
else
{
return null;
// return "SHLoadIndirectString Failure: " + returnValue;
}
}
catch // (Exception ex)
{
return null;
// return "Exception Message: " + ex.Message;
}
}
"@
}
if (-not ("WinAPI.GetStrings" -as [type]))
{
try
{
Add-Type @Signature -ErrorAction Stop
}
catch
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message $Localization.CodeCompilationFailedWarning
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
}
$Signature = @{
Namespace = "WinAPI"
Name = "ForegroundWindow"
Language = "CSharp"
CompilerOptions = $CompilerOptions
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);
"@
}
if (-not ("WinAPI.ForegroundWindow" -as [type]))
{
try
{
Add-Type @Signature -ErrorAction Stop
}
catch
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message $Localization.CodeCompilationFailedWarning
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
}
# Extract the localized "Browse" string from %SystemRoot%\System32\shell32.dll
$Global:Browse = [WinAPI.GetStrings]::GetString(9015)
# Extract the localized "&No" string from %SystemRoot%\System32\shell32.dll
$Global:No = [WinAPI.GetStrings]::GetString(33232).Replace("&", "")
# Extract the localized "&Yes" string from %SystemRoot%\System32\shell32.dll
$Global:Yes = [WinAPI.GetStrings]::GetString(33224).Replace("&", "")
$Global:KeyboardArrows = $Localization.KeyboardArrows -f [System.Char]::ConvertFromUtf32(0x2191), [System.Char]::ConvertFromUtf32(0x2193)
# Extract the localized "Skip" string from %SystemRoot%\System32\shell32.dll
$Global:Skip = [WinAPI.GetStrings]::GetString(16956)
# Check the language mode
if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage")
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message $Localization.UnsupportedLanguageMode
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_language_modes" -Verbose
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Checking whether the logged-in user is an admin
$CurrentUserName = (Get-Process -Id $PID -IncludeUserName).UserName | Split-Path -Leaf
$LoginUserName = (Get-CimInstance -ClassName Win32_Process -Filter "name='explorer.exe'" | Invoke-CimMethod -MethodName GetOwner | Select-Object -First 1).User
if ($CurrentUserName -ne $LoginUserName)
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message ($Localization.LoggedInUserNotAdmin -f $CurrentUserName, $LoginUserName)
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Checking whether the script was run in PowerShell ISE or VS Code
if (($Host.Name -match "ISE") -or ($env:TERM_PROGRAM -eq "vscode"))
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message ($Localization.UnsupportedHost -f $Host.Name.Replace("Host", ""))
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Checking whether Windows was broken by 3rd party harmful tweakers, trojans, or custom Windows images
$Tweakers = @{
# https://www.youtube.com/GHOSTSPECTRE
"Ghost Toolbox" = "$env:SystemRoot\System32\migwiz\dlmanifests\run.ghost.cmd"
# https://win10tweaker.ru
"Win 10 Tweaker" = "HKCU:\Software\Win 10 Tweaker"
# https://revi.cc
"Revision Tool" = "${env:ProgramFiles(x86)}\Revision Tool"
# https://github.com/Atlas-OS/Atlas
AtlasOS = "$env:SystemRoot\AtlasModules"
# https://boosterx.ru
BoosterX = "$env:ProgramFiles\GameModeX\GameModeX.exe"
# https://www.youtube.com/watch?v=5NBqbUUB1Pk
WinClean = "$env:ProgramFiles\WinClean Plus Apps"
# https://pc-np.com
PCNP = "HKCU:\Software\PCNP"
# https://www.reddit.com/r/TronScript/
Tron = "$env:SystemDrive\logs\tron"
# https://crystalcry.ru
CrystalCry = "HKLM:\SOFTWARE\CrystalCry"
# https://github.com/es3n1n/defendnot
defendnot = "$env:SystemRoot\System32\Tasks\defendnot"
# https://github.com/zoicware/RemoveWindowsAI
RemoveWindowsAI = "$env:SystemRoot\System32\CatRoot\*\ZoicwareRemoveWindowsAI*"
}
foreach ($Tweaker in $Tweakers.Keys)
{
if (Test-Path -Path $Tweakers[$Tweaker])
{
if ($Tweakers[$Tweaker] -eq "HKCU:\Software\Win 10 Tweaker")
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message $Localization.Win10TweakerWarning
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://youtu.be/na93MS-1EkM" -Verbose
Write-Verbose -Message "https://pikabu.ru/story/byekdor_v_win_10_tweaker_ili_sovremennyie_metodyi_borbyi_s_piratstvom_8227558" -Verbose
Write-Verbose -Message "https://massgrave.dev/genuine-installation-media" -Verbose
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message ($Localization.TweakerWarning -f $Tweaker)
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://massgrave.dev/genuine-installation-media" -Verbose
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
}
# Checking whether Windows was broken by 3rd party harmful tweakers, trojans, or custom Windows images
$Tweakers = @{
# https://forum.ru-board.com/topic.cgi?forum=62&topic=30617&start=1600#14
AutoSettingsPS = "$(Get-ItemProperty -Path `"HKLM:\SOFTWARE\Microsoft\Windows Defender\Exclusions\Paths`" -Name *AutoSettingsPS*)"
# https://forum.ru-board.com/topic.cgi?forum=5&topic=50519
"Modern Tweaker" = "$(Get-ItemProperty -Path `"HKCU:\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache`" -Name *ModernTweaker*)"
}
foreach ($Tweaker in $Tweakers.Keys)
{
if ($Tweakers[$Tweaker])
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message ($Localization.TweakerWarning -f $Tweaker)
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://massgrave.dev/genuine-installation-media" -Verbose
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
}
Write-Information -MessageData "" -InformationAction Continue
# Extract the localized "Please wait..." string from %SystemRoot%\System32\shell32.dll
Write-Verbose -Message ([WinAPI.GetStrings]::GetString(12612)) -Verbose
Write-Information -MessageData "" -InformationAction Continue
# Check whether third-party enries added to hosts file
foreach ($Item in @(Get-Content -Path "$env:SystemRoot\System32\drivers\etc\hosts" -Force))
{
if (-not ([string]::IsNullOrEmpty($Item) -or $Item.StartsWith("#")))
{
Write-Verbose -Message $Localization.HostsWarning -Verbose
do
{
$Choice = Show-Menu -Menu @($Yes, $No) -Default 2
switch ($Choice)
{
$Yes
{
continue
}
$No
{
Invoke-Item -Path "$env:SystemRoot\System32\drivers\etc"
Write-Verbose -Message "https://github.com/farag2/Sophia-Script-for-Windows" -Verbose
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
$KeyboardArrows {}
}
}
until ($Choice -ne $KeyboardArrows)
break
}
}
# Checking whether EventLog service is running in order to be sire that Event Logger is enabled
if ((Get-Service -Name EventLog).Status -eq "Stopped")
{
Write-Information -MessageData "" -InformationAction Continue
# Extract the localized "Event Viewer" string from %SystemRoot%\System32\shell32.dll
Write-Warning -Message ($Localization.WindowsComponentBroken -f $([WinAPI.GetStrings]::GetString(22029)))
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://massgrave.dev/genuine-installation-media" -Verbose
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Checking whether the Microsoft Store and Windows Feature Experience Pack was removed
$UWPComponents = [Array]::TrueForAll(@(
"Microsoft.WindowsStore",
"MicrosoftWindows.Client.CBS"
),
[Predicate[string]]{
param($UWPComponent)
(Get-AppxPackage -Name $UWPComponent).Status -eq "OK"
})
if (-not $UWPComponents)
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message ($Localization.WindowsComponentBroken -f "UWP")
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://massgrave.dev/genuine-installation-media" -Verbose
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
#region Defender checks
# Checking whether necessary Microsoft Defender components exists
$Files = [Array]::TrueForAll(@(
"$env:SystemRoot\System32\smartscreen.exe",
"$env:SystemRoot\System32\SecurityHealthSystray.exe",
"$env:SystemRoot\System32\CompatTelRunner.exe"
),
[Predicate[string]]{
param($File)
Test-Path -Path $File
})
if (-not $Files)
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Microsoft Defender")
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://massgrave.dev/genuine-installation-media" -Verbose
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Checking whether Windows Security Settings page was hidden from UI
if ((Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer -Name SettingsPageVisibility -ErrorAction Ignore) -match "hide:windowsdefender")
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Microsoft Defender")
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://massgrave.dev/genuine-installation-media" -Verbose
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Checking Microsoft Defender properties
try
{
$AntiVirusProduct = @(
Get-Service -Name Windefend, SecurityHealthService, wscsvc, wdFilter -ErrorAction Stop
Get-CimInstance -ClassName MSFT_MpComputerStatus -Namespace root/Microsoft/Windows/Defender -ErrorAction Stop
Get-CimInstance -ClassName AntiVirusProduct -Namespace root/SecurityCenter2 -ErrorAction Stop
Get-MpPreference -ErrorAction Stop
)
}
catch
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Microsoft Defender")
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://massgrave.dev/genuine-installation-media" -Verbose
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Check SecurityHealthService service
try
{
Get-Service -Name SecurityHealthService -ErrorAction Stop | Start-Service -ErrorAction Stop
}
catch
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Microsoft Defender")
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://massgrave.dev/genuine-installation-media" -Verbose
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Check whether Microsoft Defender is a default AV
$Global:DefenderDefaultAV = $false
$productState = (Get-CimInstance -ClassName AntiVirusProduct -Namespace root/SecurityCenter2 -ErrorAction Stop | Where-Object -FilterScript {$_.instanceGuid -eq "{D68DDC3A-831F-4fae-9E44-DA132C1ACF46}"}).productState
$DefenderState = ('0x{0:x}' -f $productState).Substring(3, 2)
if ($DefenderState -notmatch "00|01")
{
# Defender is a default AV
$Global:DefenderDefaultAV = $true
}
# Check whether Controlled Folder Access is enabled
if ((Get-MpPreference).EnableControlledFolderAccess -eq 1)
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message $Localization.ControlledFolderAccessEnabledWarning
Write-Information -MessageData "" -InformationAction Continue
Start-Process -FilePath "windowsdefender://RansomwareProtection"
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
#endregion Defender checks
# Check for a pending reboot
$PendingActions = [Array]::TrueForAll(@(
# CBS pending
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending",
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootInProgress",
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\PackagesPending",
# Windows Update pending
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\PostRebootReporting",
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired"
),
[Predicate[string]]{
param($PendingAction)
Test-Path -Path $PendingAction
})
if ($PendingActions)
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message $Localization.RebootPending
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Checking whether BitLocker encryption or decryption in process
$BitLocker = Get-BitLockerVolume -MountPoint $env:SystemDrive | Where-Object -FilterScript {$_.VolumeStatus -notin @("FullyEncrypted", "FullyDecrypted")}
if ($BitLocker)
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message ($Localization.BitLockerInOperation -f $BitLocker.EncryptionPercentage)
Write-Verbose -Message "https://www.neowin.net/guides/how-to-remove-bitlocker-drive-encryption-in-windows-11/" -Verbose
$BitLocker
# Open if Windows edition is not Home
if ((Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").EditionID -ne "Core")
{
# Open BitLocker settings
& "$env:SystemRoot\System32\control.exe" /name Microsoft.BitLockerDriveEncryption
}
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Checking whether BitLocker drive encryption is off, despite drive is encrypted
if (Get-BitLockerVolume -MountPoint $env:SystemDrive | Where-Object -FilterScript {($_.ProtectionStatus -eq "Off") -and ($_.VolumeStatus -eq "FullyEncrypted")})
{
Write-Warning -Message $Localization.BitLockerAutomaticEncryption
Write-Verbose -Message "https://www.neowin.net/guides/how-to-remove-bitlocker-drive-encryption-in-windows-11/" -Verbose
do
{
$Choice = Show-Menu -Menu @($Yes, $No) -Default 2
switch ($Choice)
{
$Yes
{
try
{
Disable-BitLocker -MountPoint $env:SystemDrive -ErrorAction Stop
}
catch
{
Write-Warning -Message $Localization.RebootPending
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
}
$No
{
continue
}
$KeyboardArrows {}
}
}
until ($Choice -ne $KeyboardArrows)
}
# Get the real Windows version like %SystemRoot%\system32\winver.exe relies on
$Signature = @{
Namespace = "WinAPI"
Name = "Winbrand"
Language = "CSharp"
CompilerOptions = $CompilerOptions
MemberDefinition = @"
[DllImport("Winbrand.dll", CharSet = CharSet.Unicode)]
public extern static string BrandingFormatString(string sFormat);
"@
}
if (-not ("WinAPI.Winbrand" -as [type]))
{
try
{
Add-Type @Signature -ErrorAction Stop
}
catch
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message $Localization.CodeCompilationFailedWarning
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
}
if ([WinAPI.Winbrand]::BrandingFormatString("%WINDOWS_LONG%") -notmatch "Windows 11")
{
Write-Information -MessageData "" -InformationAction Continue
# Windows 11 Pro
$Windows_Long = [WinAPI.Winbrand]::BrandingFormatString("%WINDOWS_LONG%")
# e.g. 25H2
$DisplayVersion = Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name DisplayVersion
Write-Warning -Message ($Localization.UnsupportedOSBuild -f $Windows_Long, $DisplayVersion)
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
Write-Verbose -Message "https://github.com/farag2/Sophia-Script-for-Windows#system-requirements" -Verbose
# Receive updates for other Microsoft products when you update Windows
New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings -Name AllowMUUpdateService -PropertyType DWord -Value 1 -Force
# Check for updates
& "$env:SystemRoot\System32\UsoClient.exe" StartInteractiveScan
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
# Checking whether current terminal is Windows Terminal
if ($env:WT_SESSION)
{
# Checking whether Windows Terminal version is higher than 1.23
# Get Windows Terminal process PID
$ParentProcessID = (Get-CimInstance -ClassName Win32_Process -Filter ProcessID=$PID).ParentProcessID
$WindowsTerminalVersion = (Get-Process -Id $ParentProcessID).FileVersion
# FileVersion has four properties while $WindowsTerminalVersion has only three, unless the [System.Version] accelerator fails
$WindowsTerminalVersion = "{0}.{1}.{2}" -f $WindowsTerminalVersion.Split(".")
if ([System.Version]$WindowsTerminalVersion -lt [System.Version]"1.23.0")
{
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message $Localization.UnsupportedWindowsTerminal
Write-Information -MessageData "" -InformationAction Continue
Start-Process -FilePath "ms-windows-store://pdp/?productid=9N0DX20HK701"
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
Write-Verbose -Message "https://github.com/farag2/Sophia-Script-for-Windows#system-requirements" -Verbose
# Check for UWP apps updates
Get-CimInstance -ClassName MDM_EnterpriseModernAppManagement_AppManagement01 -Namespace root/CIMV2/mdm/dmmap | Invoke-CimMethod -MethodName UpdateScanMethod
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
}
# Detect Windows build version
switch ((Get-CimInstance -ClassName CIM_OperatingSystem).BuildNumber)
{
{$_ -lt 26100}
{
Write-Information -MessageData "" -InformationAction Continue
# Windows 11 Pro
$Windows_Long = [WinAPI.Winbrand]::BrandingFormatString("%WINDOWS_LONG%")
# e.g. 24H2
$DisplayVersion = Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name DisplayVersion
Write-Warning -Message ($Localization.UnsupportedOSBuild -f $Windows_Long, $DisplayVersion)
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
Write-Verbose -Message "https://github.com/farag2/Sophia-Script-for-Windows#system-requirements" -Verbose
# Receive updates for other Microsoft products when you update Windows
New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings -Name AllowMUUpdateService -PropertyType DWord -Value 1 -Force
# Check for UWP apps updates
Get-CimInstance -ClassName MDM_EnterpriseModernAppManagement_AppManagement01 -Namespace root/CIMV2/mdm/dmmap | Invoke-CimMethod -MethodName UpdateScanMethod
# Check for updates
& "$env:SystemRoot\System32\UsoClient.exe" StartInteractiveScan
# Open the "Windows Update" page
Start-Process -FilePath "ms-settings:windowsupdate"
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
"26100"
{
# Checking whether the current module version is the latest one
try
{
# https://github.com/farag2/Sophia-Script-for-Windows/blob/master/supported_windows_builds.json
$Parameters = @{
Uri = "https://raw.githubusercontent.com/farag2/Sophia-Script-for-Windows/master/supported_windows_builds.json"
Verbose = $true
UseBasicParsing = $true
}
$LatestSupportedBuild = (Invoke-RestMethod @Parameters).Windows_11
}
catch [System.Net.WebException]
{
$LatestSupportedBuild = 0
Write-Warning -Message ($Localization.NoResponse -f "https://raw.githubusercontent.com")
Write-Error -Message ($Localization.NoResponse -f "https://raw.githubusercontent.com") -ErrorAction SilentlyContinue
}
# We may use Test-Path -Path variable:LatestSupportedBuild
if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR) -lt $LatestSupportedBuild)
{
# Check Windows minor build version
# https://support.microsoft.com/en-us/topic/windows-11-version-24h2-update-history-0929c747-1815-4543-8461-0160d16f15e5
$CurrentBuild = Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name CurrentBuild
$UBR = Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR
Write-Information -MessageData "" -InformationAction Continue
Write-Warning -Message ($Localization.UpdateWarning -f $CurrentBuild, $UBR, $LatestSupportedBuild)
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
Write-Verbose -Message "https://github.com/farag2/Sophia-Script-for-Windows#system-requirements" -Verbose
# Receive updates for other Microsoft products when you update Windows
New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings -Name AllowMUUpdateService -PropertyType DWord -Value 1 -Force
# Check for UWP apps updates
Get-CimInstance -ClassName MDM_EnterpriseModernAppManagement_AppManagement01 -Namespace root/CIMV2/mdm/dmmap | Invoke-CimMethod -MethodName UpdateScanMethod
# Check for updates
& "$env:SystemRoot\System32\UsoClient.exe" StartInteractiveScan
# Open the "Windows Update" page
Start-Process -FilePath "ms-settings:windowsupdate"
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
}
}
# Enable back the SysMain service if it was disabled by harmful tweakers
if ((Get-Service -Name SysMain).Status -eq "Stopped")
{
Get-Service -Name SysMain | Set-Service -StartupType Automatic
Get-Service -Name SysMain | Start-Service
Start-Process -FilePath "https://www.outsidethebox.ms/19318"
}
# Automatically manage paging file size for all drives
if (-not (Get-CimInstance -ClassName CIM_ComputerSystem).AutomaticManagedPageFile)
{
Get-CimInstance -ClassName CIM_ComputerSystem | Set-CimInstance -Property @{AutomaticManagedPageFile = $true}
}
# If you do not use old applications, there's no need to force old applications based on legacy .NET Framework 2.0, 3.0, or 3.5 to use .NET Framework 4.8.1
Remove-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\.NETFramework, HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework -Name OnlyUseLatestCLR -Force -ErrorAction Ignore
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\LGPO.txt" -Force -ErrorAction Ignore | Remove-Item -Force -ErrorAction Ignore
# Save all opened folders in order to restore them after File Explorer restart
$Global:OpenedFolders = {(New-Object -ComObject Shell.Application).Windows() | ForEach-Object -Process {$_.Document.Folder.Self.Path}}.Invoke()
Clear-Host
# https://patorjk.com/software/taag/#p=display&f=Tmplr
Write-Information -MessageData "┏┓ ┓ • ┏┓ • ┏ ┓ ┏• ┓ " -InformationAction Continue
Write-Information -MessageData "┗┓┏┓┏┓┣┓┓┏┓ ┗┓┏┏┓┓┏┓╋ ╋┏┓┏┓ ┃┃┃┓┏┓┏┫┏┓┓┏┏┏" -InformationAction Continue
Write-Information -MessageData "┗┛┗┛┣┛┛┗┗┗┻ ┗┛┗┛ ┗┣┛┗ ┛┗┛┛ ┗┻┛┗┛┗┗┻┗┛┗┻┛┛" -InformationAction Continue
Write-Information -MessageData " ┛ ┛ " -InformationAction Continue
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://t.me/sophianews" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
Write-Information -MessageData "" -InformationAction Continue
Write-Verbose -Message "https://ko-fi.com/farag" -Verbose
Write-Verbose -Message "https://boosty.to/teamsophia" -Verbose
Write-Information -MessageData "" -InformationAction Continue
# Display a warning message about whether a user has customized the preset file
if ($Warning)
{
# Get the name of a preset (e.g Sophia.ps1) regardless it was named
[string]$PresetName = ((Get-PSCallStack).Position | Where-Object -FilterScript {($_.Text -match "InitialActions") -and ($_.Text -notmatch "Get-PSCallStack")}).File
Write-Verbose -Message ($Localization.CustomizationWarning -f $PresetName) -Verbose
do
{
$Choice = Show-Menu -Menu @($Yes, $No) -Default 2
switch ($Choice)
{
$Yes
{
continue
}
$No
{
Invoke-Item -Path $PresetName
Write-Verbose -Message "https://github.com/farag2/Sophia-Script-for-Windows#how-to-use" -Verbose
Write-Verbose -Message "https://t.me/sophia_chat" -Verbose
Write-Verbose -Message "https://discord.gg/sSryhaEv79" -Verbose
$Global:Failed = $true
exit
}
$KeyboardArrows {}
}
}
until ($Choice -ne $KeyboardArrows)
}
}