Browse Source

Re-arranged startup checks

master
Dmitry Nefedov 12 months ago
parent
commit
316ddfd8dc
  1. 2
      src/Sophia_Script_for_Windows_10/Localizations/en-US/Sophia.psd1
  2. 218
      src/Sophia_Script_for_Windows_10/Module/Sophia.psm1
  3. 6
      src/Sophia_Script_for_Windows_10/Sophia.ps1
  4. 2
      src/Sophia_Script_for_Windows_10_LTSC_2019/Localizations/en-US/Sophia.psd1
  5. 190
      src/Sophia_Script_for_Windows_10_LTSC_2019/Module/Sophia.psm1
  6. 2
      src/Sophia_Script_for_Windows_10_LTSC_2021/Localizations/en-US/Sophia.psd1
  7. 168
      src/Sophia_Script_for_Windows_10_LTSC_2021/Module/Sophia.psm1
  8. 4
      src/Sophia_Script_for_Windows_10_LTSC_2021/Sophia.ps1
  9. 2
      src/Sophia_Script_for_Windows_10_PowerShell_7/Localizations/en-US/Sophia.psd1
  10. 228
      src/Sophia_Script_for_Windows_10_PowerShell_7/Module/Sophia.psm1
  11. 6
      src/Sophia_Script_for_Windows_10_PowerShell_7/Sophia.ps1
  12. 2
      src/Sophia_Script_for_Windows_11/Localizations/en-US/Sophia.psd1
  13. 218
      src/Sophia_Script_for_Windows_11/Module/Sophia.psm1
  14. 4
      src/Sophia_Script_for_Windows_11/Sophia.ps1
  15. 2
      src/Sophia_Script_for_Windows_11_PowerShell_7/Localizations/en-US/Sophia.psd1
  16. 228
      src/Sophia_Script_for_Windows_11_PowerShell_7/Module/Sophia.psm1
  17. 4
      src/Sophia_Script_for_Windows_11_PowerShell_7/Sophia.ps1

2
src/Sophia_Script_for_Windows_10/Localizations/en-US/Sophia.psd1

@ -13,7 +13,7 @@ RebootPending = The PC is waiting to be restarted.
UnsupportedRelease = A new version found. UnsupportedRelease = A new version found.
KeyboardArrows = Please use the arrow keys {0} and {1} on your keyboard to select your answer KeyboardArrows = Please use the arrow keys {0} and {1} on your keyboard to select your answer
CustomizationWarning = Have you customized every function in the {0} preset file before running Sophia Script? CustomizationWarning = Have you customized every function in the {0} preset file before running Sophia Script?
WindowsComponentBroken = {0} broken or removed from the OS. WindowsComponentBroken = {0} broken or removed from Windows.
UpdateDefender = Microsoft Defender definitions are out-of-date. Run Windows Update and try again. UpdateDefender = Microsoft Defender definitions are out-of-date. Run Windows Update and try again.
ControlledFolderAccessDisabled = Controlled folder access disabled. ControlledFolderAccessDisabled = Controlled folder access disabled.
InitialActionsCheckFailed = "InitialActions" function cannot be loaded from the {0} preset file. InitialActionsCheckFailed = "InitialActions" function cannot be loaded from the {0} preset file.

218
src/Sophia_Script_for_Windows_10/Module/Sophia.psm1

@ -89,7 +89,7 @@ public static string GetString(uint strId)
Add-Type @Signature Add-Type @Signature
} }
# Check if Microsoft Edge as being a system component was removed by harmful tweakers # Check whether Microsoft Edge as being a system component was removed by harmful tweakers
if (-not (Test-Path -Path "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe")) if (-not (Test-Path -Path "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe"))
{ {
Write-Information -MessageData "" -InformationAction Continue Write-Information -MessageData "" -InformationAction Continue
@ -178,7 +178,7 @@ public static string GetString(uint strId)
} }
} }
# Detect the OS bitness # Detect Windows bitness
if (-not [System.Environment]::Is64BitOperatingSystem) if (-not [System.Environment]::Is64BitOperatingSystem)
{ {
Write-Warning -Message $Localization.UnsupportedOSBitness Write-Warning -Message $Localization.UnsupportedOSBitness
@ -189,17 +189,6 @@ public static string GetString(uint strId)
exit exit
} }
# Check if Get-WindowsEdition cmdlet is working
try
{
[void](Get-WindowsEdition -Online)
}
catch [System.Runtime.InteropServices.COMException]
{
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Get-WindowsEdition")
exit
}
# Check the language mode # Check the language mode
if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage") if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage")
{ {
@ -305,7 +294,7 @@ public static string GetString(uint strId)
} }
} }
# Flibustier custom Windows image # Check whether this is a Flibustier custom Windows image
if (Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\.NETFramework\Performance -Name *flibustier) if (Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\.NETFramework\Performance -Name *flibustier)
{ {
Write-Warning -Message ($Localization.TweakerWarning -f "flblauncher") Write-Warning -Message ($Localization.TweakerWarning -f "flblauncher")
@ -316,42 +305,21 @@ public static string GetString(uint strId)
exit exit
} }
# Check whether Windows Feature Experience Pack was removed by harmful tweakers # Check whether Get-WindowsEdition cmdlet is working
if (-not (Get-AppxPackage -Name MicrosoftWindows.Client.CBS)) try
{ {
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Windows Feature Experience Pack") [void](Get-WindowsEdition -Online)
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
} }
catch [System.Runtime.InteropServices.COMException]
# Check whether LGPO.exe exists in the bin folder
if (-not (Test-Path -Path "$PSScriptRoot\..\bin\LGPO.exe"))
{ {
Write-Warning -Message $Localization.Bin Write-Warning -Message ($Localization.WindowsComponentBroken -f "Get-WindowsEdition")
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit exit
} }
# Check for a pending reboot # Check whether Windows Feature Experience Pack was removed by harmful tweakers
$PendingActions = @( if (-not (Get-AppxPackage -Name MicrosoftWindows.Client.CBS))
# 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"
)
if (($PendingActions | Test-Path) -contains $true)
{ {
Write-Warning -Message $Localization.RebootPending Write-Warning -Message ($Localization.WindowsComponentBroken -f "Windows Feature Experience Pack")
Start-Process -FilePath "https://t.me/sophia_chat" Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79" Start-Process -FilePath "https://discord.gg/sSryhaEv79"
@ -359,10 +327,11 @@ public static string GetString(uint strId)
exit exit
} }
# Check if Microsoft Store being an important system component was removed # Check whether EventLog service is running in order to be sire that Event Logger is enabled
if (-not (Get-AppxPackage -Name Microsoft.WindowsStore)) if ((Get-Service -Name EventLog).Status -eq "Stopped")
{ {
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Microsoft Store") # Extract the localized "Event Viewer" string from shell32.dll
Write-Warning -Message ($Localization.WindowsComponentBroken -f $([WinAPI.GetStr]::GetString(22029))
Start-Process -FilePath "https://t.me/sophia_chat" Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79" Start-Process -FilePath "https://discord.gg/sSryhaEv79"
@ -370,54 +339,16 @@ public static string GetString(uint strId)
exit exit
} }
# Check if the current module version is the latest one # Check whether Microsoft Store being an important system component was removed
try if (-not (Get-AppxPackage -Name Microsoft.WindowsStore))
{
# Check the internet connection
$Parameters = @{
Name = "dns.msftncsi.com"
Server = "1.1.1.1"
DnsOnly = $true
ErrorAction = "Stop"
}
if ((Resolve-DnsName @Parameters).IPAddress -notcontains "131.107.255.255")
{
return
}
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_10_PowerShell_5_1
$CurrentRelease = (Get-Module -Name Sophia).Version.ToString()
if ([System.Version]$LatestRelease -gt [System.Version]$CurrentRelease)
{ {
Write-Warning -Message $Localization.UnsupportedRelease Write-Warning -Message ($Localization.WindowsComponentBroken -f "Microsoft Store")
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat" Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79" Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit 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
}
}
catch [System.ComponentModel.Win32Exception]
{
Write-Warning -Message $Localization.NoInternetConnection
Write-Error -Message $Localization.NoInternetConnection -ErrorAction SilentlyContinue
}
#region Defender checks #region Defender checks
# Check whether necessary Microsoft Defender components exists # Check whether necessary Microsoft Defender components exists
@ -503,7 +434,7 @@ public static string GetString(uint strId)
# Defender is a currently used AV. Continue... # Defender is a currently used AV. Continue...
$Script:DefenderProductState = $true $Script:DefenderProductState = $true
# Check if Windows is Enterprise for Chineese Goverment which doesn't have Defender # Check whether Windows is Enterprise for Chineese Goverment which doesn't have Defender
if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name EditionID) -ne "EnterpriseG") if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name EditionID) -ne "EnterpriseG")
{ {
# Defender is a currently used AV. Continue... # Defender is a currently used AV. Continue...
@ -579,7 +510,88 @@ public static string GetString(uint strId)
} }
#endregion Defender checks #endregion Defender checks
# Detect the OS build version # Check for a pending reboot
$PendingActions = @(
# 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"
)
if (($PendingActions | Test-Path) -contains $true)
{
Write-Warning -Message $Localization.RebootPending
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Check whether the current module version is the latest one
try
{
# Check the internet connection
$Parameters = @{
Name = "dns.msftncsi.com"
Server = "1.1.1.1"
DnsOnly = $true
ErrorAction = "Stop"
}
if ((Resolve-DnsName @Parameters).IPAddress -notcontains "131.107.255.255")
{
return
}
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_10_PowerShell_5_1
$CurrentRelease = (Get-Module -Name Sophia).Version.ToString()
if ([System.Version]$LatestRelease -gt [System.Version]$CurrentRelease)
{
Write-Warning -Message $Localization.UnsupportedRelease
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
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
}
}
catch [System.ComponentModel.Win32Exception]
{
Write-Warning -Message $Localization.NoInternetConnection
Write-Error -Message $Localization.NoInternetConnection -ErrorAction SilentlyContinue
}
# Check whether LGPO.exe exists in the bin folder
if (-not (Test-Path -Path "$PSScriptRoot\..\bin\LGPO.exe"))
{
Write-Warning -Message $Localization.Bin
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Detect Windows build version
switch ((Get-CimInstance -ClassName CIM_OperatingSystem).BuildNumber) switch ((Get-CimInstance -ClassName CIM_OperatingSystem).BuildNumber)
{ {
{($_ -lt 19045) -or ($_ -gt 19045)} {($_ -lt 19045) -or ($_ -gt 19045)}
@ -596,7 +608,7 @@ public static string GetString(uint strId)
{ {
if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR) -lt 3803) if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR) -lt 3803)
{ {
# Check whether the OS minor build version is 3803 minimum # Check whether Windows minor build version is 3803 minimum
# https://learn.microsoft.com/en-us/windows/release-health/release-information#windows-10-current-versions-by-servicing-option # https://learn.microsoft.com/en-us/windows/release-health/release-information#windows-10-current-versions-by-servicing-option
$CurrentBuild = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name CurrentBuild $CurrentBuild = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name CurrentBuild
$UBR = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR $UBR = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR
@ -729,7 +741,7 @@ public static string GetString(uint strId)
# Extract the localized "Please wait..." string from shell32.dll # Extract the localized "Please wait..." string from shell32.dll
Write-Verbose -Message ([WinAPI.GetStr]::GetString(12612)) -Verbose Write-Verbose -Message ([WinAPI.GetStr]::GetString(12612)) -Verbose
# Check if hosts contains any of string from $IPArray array # Check whether hosts contains any of string from $IPArray array
if ((Get-Content -Path "$env:SystemRoot\System32\drivers\etc\hosts" -Encoding Default -Force | ForEach-Object -Process {$_.Trim()} | ForEach-Object -Process { if ((Get-Content -Path "$env:SystemRoot\System32\drivers\etc\hosts" -Encoding Default -Force | ForEach-Object -Process {$_.Trim()} | ForEach-Object -Process {
($_ -ne "") -and ($_ -ne " ") -and (-not $_.StartsWith("#")) -and ($IPArray -split "`r?`n" | Select-String -Pattern $_) ($_ -ne "") -and ($_ -ne " ") -and (-not $_.StartsWith("#")) -and ($IPArray -split "`r?`n" | Select-String -Pattern $_)
}) -contains $true) }) -contains $true)
@ -5167,7 +5179,7 @@ function OneDrive
return return
} }
# Check if user is logged into OneDrive (Microsoft account) # Check whether user is logged into OneDrive (Microsoft account)
$UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore $UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore
if ($UserEmail) if ($UserEmail)
{ {
@ -8211,7 +8223,7 @@ function WinPrtScrFolder
$Default $Default
) )
# Check if user is logged into OneDrive (Microsoft account) # Check whether user is logged into OneDrive (Microsoft account)
$UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore $UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore
if ($UserEmail) if ($UserEmail)
{ {
@ -8293,7 +8305,7 @@ function WinPrtScrFolder
RecommendedTroubleshooting -Default RecommendedTroubleshooting -Default
.NOTES .NOTES
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data" and the error reporting feature will be turned on In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data" and the error reporting feature will be turned on
.NOTES .NOTES
Machine-wide Machine-wide
@ -8337,7 +8349,7 @@ function RecommendedTroubleshooting
} }
} }
# Set the OS level of diagnostic data gathering to "Optional diagnostic data" # Set Windows level of diagnostic data gathering to "Optional diagnostic data"
if (-not (Test-Path -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack)) if (-not (Test-Path -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack))
{ {
New-Item -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack -Force New-Item -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack -Force
@ -10213,7 +10225,7 @@ function Import-Associations
https://support.microsoft.com/en-us/windows/how-to-use-the-pc-health-check-app-9c8abd9b-03ba-4e67-81ef-36f37caa7844 https://support.microsoft.com/en-us/windows/how-to-use-the-pc-health-check-app-9c8abd9b-03ba-4e67-81ef-36f37caa7844
.NOTES .NOTES
This application is installed with the KB5005463 update to check if PC meets the system requirements of Windows 11 This application is installed with the KB5005463 update to Check whether PC meets the system requirements of Windows 11
.NOTES .NOTES
Machine-wide Machine-wide
@ -11048,7 +11060,7 @@ function PinToStart
# Extract the localized "Devices and Printers" string from shell32.dll # Extract the localized "Devices and Printers" string from shell32.dll
$DevicesPrinters = [WinAPI.GetStr]::GetString(30493) $DevicesPrinters = [WinAPI.GetStr]::GetString(30493)
# Check if an argument is "DevicesPrinters". The Devices and Printers's AppID attribute can be retrieved only if the shortcut was created # Check whether an argument is "DevicesPrinters". The Devices and Printers's AppID attribute can be retrieved only if the shortcut was created
if (((Get-Command -Name PinToStart).Parametersets.Parameters | Where-Object -FilterScript {$null -eq $_.Attributes.AliasNames}).Attributes.ValidValues | Where-Object -FilterScript {$_ -match "DevicesPrinters"}) if (((Get-Command -Name PinToStart).Parametersets.Parameters | Where-Object -FilterScript {$null -eq $_.Attributes.AliasNames}).Attributes.ValidValues | Where-Object -FilterScript {$_ -match "DevicesPrinters"})
{ {
# Create the old-style "Devices and Printers" shortcut in the Start menu # Create the old-style "Devices and Printers" shortcut in the Start menu
@ -12635,7 +12647,7 @@ function CleanupTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName "Windows Cleanup" -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName "Windows Cleanup" -ErrorAction Ignore)
{ {
# Also we can parse "$env:SystemRoot\System32\Tasks\Sophia\Windows Cleanup" to check if the task was created # Also we can parse "$env:SystemRoot\System32\Tasks\Sophia\Windows Cleanup" to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Windows Cleanup"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Windows Cleanup"} | Foreach-Object {
@ -13060,7 +13072,7 @@ function SoftwareDistributionTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName SoftwareDistribution -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName SoftwareDistribution -ErrorAction Ignore)
{ {
# Also we can parse $env:SystemRoot\System32\Tasks\Sophia\SoftwareDistribution to check if the task was created # Also we can parse $env:SystemRoot\System32\Tasks\Sophia\SoftwareDistribution to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "SoftwareDistribution"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "SoftwareDistribution"} | Foreach-Object {
@ -13364,7 +13376,7 @@ function TempTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName Temp -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName Temp -ErrorAction Ignore)
{ {
# Also we can parse $env:SystemRoot\System32\Tasks\Sophia\Temp to check if the task was created # Also we can parse $env:SystemRoot\System32\Tasks\Sophia\Temp to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Temp"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Temp"} | Foreach-Object {
@ -15434,7 +15446,7 @@ function UpdateLGPEPolicies
{ {
foreach ($Item in $Path.Property) foreach ($Item in $Path.Property)
{ {
# Check if property isn't equal to "(default)" and exists # Check whether property isn't equal to "(default)" and exists
if (($null -ne $Item) -and ($Item -ne "(default)")) if (($null -ne $Item) -and ($Item -ne "(default)"))
{ {
# Where all ADMX templates are located to compare with # Where all ADMX templates are located to compare with
@ -15492,7 +15504,7 @@ function UpdateLGPEPolicies
{ {
foreach ($Item in $Path.Property) foreach ($Item in $Path.Property)
{ {
# Check if property isn't equal to "(default)" and exists # Check whether property isn't equal to "(default)" and exists
if (($null -ne $Item) -and ($Item -ne "(default)")) if (($null -ne $Item) -and ($Item -ne "(default)"))
{ {
# Where all ADMX templates are located to compare with # Where all ADMX templates are located to compare with
@ -15662,7 +15674,7 @@ public static void PostMessage()
} }
} }
# Check if any of scheduled tasks were created. Unless open Task Scheduler # Check whether any of scheduled tasks were created. Unless open Task Scheduler
if ($Script:ScheduledTasks) if ($Script:ScheduledTasks)
{ {
# Find and close taskschd.msc by its' argument # Find and close taskschd.msc by its' argument

6
src/Sophia_Script_for_Windows_10/Sophia.ps1

@ -823,7 +823,7 @@ WinPrtScrFolder -Desktop
<# <#
Run troubleshooter automatically, then notify me Run troubleshooter automatically, then notify me
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data", and the error reporting feature will be turned on In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data", and the error reporting feature will be turned on
Автоматически запускать средства устранения неполадок, а затем уведомлять Автоматически запускать средства устранения неполадок, а затем уведомлять
Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows
@ -832,7 +832,7 @@ RecommendedTroubleshooting -Automatically
<# <#
Ask me before running troubleshooter (default value) Ask me before running troubleshooter (default value)
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data" In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data"
Спрашивать перед запуском средств устранения неполадок (значение по умолчанию) Спрашивать перед запуском средств устранения неполадок (значение по умолчанию)
Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows
@ -976,7 +976,7 @@ WindowsLatestUpdate -Disable
<# <#
Uninstall the "PC Health Check" app and prevent it from installing in the future Uninstall the "PC Health Check" app and prevent it from installing in the future
This application is installed with the KB5005463 update to check if PC meets the system requirements of Windows 11 This application is installed with the KB5005463 update to Check whether PC meets the system requirements of Windows 11
Удалить приложение "Проверка работоспособности ПК Windows" и заблокировать его установку в будущем Удалить приложение "Проверка работоспособности ПК Windows" и заблокировать его установку в будущем
Данное приложение устанавливается обновлением KB5005463 для проверки соответствия компьютера системным требованиям Windows 11 Данное приложение устанавливается обновлением KB5005463 для проверки соответствия компьютера системным требованиям Windows 11

2
src/Sophia_Script_for_Windows_10_LTSC_2019/Localizations/en-US/Sophia.psd1

@ -13,7 +13,7 @@ RebootPending = The PC is waiting to be restarted.
UnsupportedRelease = A new version found. UnsupportedRelease = A new version found.
KeyboardArrows = Please use the arrow keys {0} and {1} on your keyboard to select your answer KeyboardArrows = Please use the arrow keys {0} and {1} on your keyboard to select your answer
CustomizationWarning = Have you customized every function in the {0} preset file before running Sophia Script? CustomizationWarning = Have you customized every function in the {0} preset file before running Sophia Script?
WindowsComponentBroken = {0} broken or removed from the OS. WindowsComponentBroken = {0} broken or removed from Windows.
UpdateDefender = Microsoft Defender definitions are out-of-date. Run Windows Update and try again. UpdateDefender = Microsoft Defender definitions are out-of-date. Run Windows Update and try again.
ControlledFolderAccessDisabled = Controlled folder access disabled. ControlledFolderAccessDisabled = Controlled folder access disabled.
InitialActionsCheckFailed = "InitialActions" function cannot be loaded from the {0} preset file. InitialActionsCheckFailed = "InitialActions" function cannot be loaded from the {0} preset file.

190
src/Sophia_Script_for_Windows_10_LTSC_2019/Module/Sophia.psm1

@ -89,7 +89,7 @@ public static string GetString(uint strId)
Add-Type @Signature Add-Type @Signature
} }
# Detect the OS bitness # Detect Windows bitness
if (-not [System.Environment]::Is64BitOperatingSystem) if (-not [System.Environment]::Is64BitOperatingSystem)
{ {
Write-Warning -Message $Localization.UnsupportedOSBitness Write-Warning -Message $Localization.UnsupportedOSBitness
@ -100,17 +100,6 @@ public static string GetString(uint strId)
exit exit
} }
# Check if Get-WindowsEdition cmdlet is working
try
{
[void](Get-WindowsEdition -Online)
}
catch [System.Runtime.InteropServices.COMException]
{
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Get-WindowsEdition")
exit
}
# Check the language mode # Check the language mode
if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage") if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage")
{ {
@ -216,7 +205,7 @@ public static string GetString(uint strId)
} }
} }
# Flibustier custom Windows image # Check whether this is a Flibustier custom Windows image
if (Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\.NETFramework\Performance -Name *flibustier) if (Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\.NETFramework\Performance -Name *flibustier)
{ {
Write-Warning -Message ($Localization.TweakerWarning -f "flblauncher") Write-Warning -Message ($Localization.TweakerWarning -f "flblauncher")
@ -227,86 +216,28 @@ public static string GetString(uint strId)
exit exit
} }
# Check whether LGPO.exe exists in the bin folder # Check whether Get-WindowsEdition cmdlet is working
if (-not (Test-Path -Path "$PSScriptRoot\..\bin\LGPO.exe"))
{
Write-Warning -Message $Localization.Bin
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Check for a pending reboot
$PendingActions = @(
# 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"
)
if (($PendingActions | Test-Path) -contains $true)
{
Write-Warning -Message $Localization.RebootPending
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Check if the current module version is the latest one
try try
{ {
# Check the internet connection [void](Get-WindowsEdition -Online)
$Parameters = @{
Name = "dns.msftncsi.com"
Server = "1.1.1.1"
DnsOnly = $true
ErrorAction = "Stop"
}
if ((Resolve-DnsName @Parameters).IPAddress -notcontains "131.107.255.255")
{
return
} }
catch [System.Runtime.InteropServices.COMException]
try
{ {
# https://github.com/farag2/Sophia-Script-for-Windows/blob/master/sophia_script_versions.json Write-Warning -Message ($Localization.WindowsComponentBroken -f "Get-WindowsEdition")
$Parameters = @{ exit
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_10_LTSC2019
$CurrentRelease = (Get-Module -Name Sophia).Version.ToString()
if ([System.Version]$LatestRelease -gt [System.Version]$CurrentRelease) # Check whether EventLog service is running in order to be sire that Event Logger is enabled
if ((Get-Service -Name EventLog).Status -eq "Stopped")
{ {
Write-Warning -Message $Localization.UnsupportedRelease # Extract the localized "Event Viewer" string from shell32.dll
Write-Warning -Message ($Localization.WindowsComponentBroken -f $([WinAPI.GetStr]::GetString(22029))
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat" Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79" Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit 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
}
}
catch [System.ComponentModel.Win32Exception]
{
Write-Warning -Message $Localization.NoInternetConnection
Write-Error -Message $Localization.NoInternetConnection -ErrorAction SilentlyContinue
}
#region Defender checks #region Defender checks
# Check whether necessary Microsoft Defender components exists # Check whether necessary Microsoft Defender components exists
@ -456,7 +387,88 @@ public static string GetString(uint strId)
} }
#endregion Defender checks #endregion Defender checks
# Detect the OS build version # Check for a pending reboot
$PendingActions = @(
# 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"
)
if (($PendingActions | Test-Path) -contains $true)
{
Write-Warning -Message $Localization.RebootPending
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Check whether the current module version is the latest one
try
{
# Check the internet connection
$Parameters = @{
Name = "dns.msftncsi.com"
Server = "1.1.1.1"
DnsOnly = $true
ErrorAction = "Stop"
}
if ((Resolve-DnsName @Parameters).IPAddress -notcontains "131.107.255.255")
{
return
}
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_10_LTSC2019
$CurrentRelease = (Get-Module -Name Sophia).Version.ToString()
if ([System.Version]$LatestRelease -gt [System.Version]$CurrentRelease)
{
Write-Warning -Message $Localization.UnsupportedRelease
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
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
}
}
catch [System.ComponentModel.Win32Exception]
{
Write-Warning -Message $Localization.NoInternetConnection
Write-Error -Message $Localization.NoInternetConnection -ErrorAction SilentlyContinue
}
# Check whether LGPO.exe exists in the bin folder
if (-not (Test-Path -Path "$PSScriptRoot\..\bin\LGPO.exe"))
{
Write-Warning -Message $Localization.Bin
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Detect Windows build version
if ((Get-WindowsEdition -Online).Edition -notmatch "EnterpriseS") if ((Get-WindowsEdition -Online).Edition -notmatch "EnterpriseS")
{ {
Write-Warning -Message $Localization.UnsupportedOSBuild Write-Warning -Message $Localization.UnsupportedOSBuild
@ -484,7 +496,7 @@ public static string GetString(uint strId)
{ {
if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR) -lt 5206) if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR) -lt 5206)
{ {
# Check whether the OS minor build version is 5206 minimum # Check whether Windows minor build version is 5206 minimum
# https://learn.microsoft.com/en-us/windows/release-health/release-information#windows-10-current-versions-by-servicing-option # https://learn.microsoft.com/en-us/windows/release-health/release-information#windows-10-current-versions-by-servicing-option
$CurrentBuild = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name CurrentBuild $CurrentBuild = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name CurrentBuild
$UBR = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR $UBR = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR
@ -614,7 +626,7 @@ public static string GetString(uint strId)
# Extract the localized "Please wait..." string from shell32.dll # Extract the localized "Please wait..." string from shell32.dll
Write-Verbose -Message ([WinAPI.GetStr]::GetString(12612)) -Verbose Write-Verbose -Message ([WinAPI.GetStr]::GetString(12612)) -Verbose
# Check if hosts contains any of string from $IPArray array # Check whether hosts contains any of string from $IPArray array
if ((Get-Content -Path "$env:SystemRoot\System32\drivers\etc\hosts" -Encoding Default -Force | ForEach-Object -Process {$_.Trim()} | ForEach-Object -Process { if ((Get-Content -Path "$env:SystemRoot\System32\drivers\etc\hosts" -Encoding Default -Force | ForEach-Object -Process {$_.Trim()} | ForEach-Object -Process {
($_ -ne "") -and ($_ -ne " ") -and (-not $_.StartsWith("#")) -and ($IPArray -split "`r?`n" | Select-String -Pattern $_) ($_ -ne "") -and ($_ -ne " ") -and (-not $_.StartsWith("#")) -and ($IPArray -split "`r?`n" | Select-String -Pattern $_)
}) -contains $true) }) -contains $true)
@ -9163,7 +9175,7 @@ function CleanupTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName "Windows Cleanup" -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName "Windows Cleanup" -ErrorAction Ignore)
{ {
# Also we can parse "$env:SystemRoot\System32\Tasks\Sophia\Windows Cleanup" to check if the task was created # Also we can parse "$env:SystemRoot\System32\Tasks\Sophia\Windows Cleanup" to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Windows Cleanup"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Windows Cleanup"} | Foreach-Object {
@ -9588,7 +9600,7 @@ function SoftwareDistributionTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName SoftwareDistribution -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName SoftwareDistribution -ErrorAction Ignore)
{ {
# Also we can parse $env:SystemRoot\System32\Tasks\Sophia\SoftwareDistribution to check if the task was created # Also we can parse $env:SystemRoot\System32\Tasks\Sophia\SoftwareDistribution to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "SoftwareDistribution"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "SoftwareDistribution"} | Foreach-Object {
@ -9892,7 +9904,7 @@ function TempTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName Temp -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName Temp -ErrorAction Ignore)
{ {
# Also we can parse $env:SystemRoot\System32\Tasks\Sophia\Temp to check if the task was created # Also we can parse $env:SystemRoot\System32\Tasks\Sophia\Temp to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Temp"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Temp"} | Foreach-Object {
@ -11739,7 +11751,7 @@ function UpdateLGPEPolicies
{ {
foreach ($Item in $Path.Property) foreach ($Item in $Path.Property)
{ {
# Check if property isn't equal to "(default)" and exists # Check whether property isn't equal to "(default)" and exists
if (($null -ne $Item) -and ($Item -ne "(default)")) if (($null -ne $Item) -and ($Item -ne "(default)"))
{ {
# Where all ADMX templates are located to compare with # Where all ADMX templates are located to compare with
@ -11797,7 +11809,7 @@ function UpdateLGPEPolicies
{ {
foreach ($Item in $Path.Property) foreach ($Item in $Path.Property)
{ {
# Check if property isn't equal to "(default)" and exists # Check whether property isn't equal to "(default)" and exists
if (($null -ne $Item) -and ($Item -ne "(default)")) if (($null -ne $Item) -and ($Item -ne "(default)"))
{ {
# Where all ADMX templates are located to compare with # Where all ADMX templates are located to compare with
@ -11957,7 +11969,7 @@ public static void PostMessage()
} }
} }
# Check if any of scheduled tasks were created. Unless open Task Scheduler # Check whether any of scheduled tasks were created. Unless open Task Scheduler
if ($Script:ScheduledTasks) if ($Script:ScheduledTasks)
{ {
# Find and close taskschd.msc by its' argument # Find and close taskschd.msc by its' argument

2
src/Sophia_Script_for_Windows_10_LTSC_2021/Localizations/en-US/Sophia.psd1

@ -13,7 +13,7 @@ RebootPending = The PC is waiting to be restarted.
UnsupportedRelease = A new version found. UnsupportedRelease = A new version found.
KeyboardArrows = Please use the arrow keys {0} and {1} on your keyboard to select your answer KeyboardArrows = Please use the arrow keys {0} and {1} on your keyboard to select your answer
CustomizationWarning = Have you customized every function in the {0} preset file before running Sophia Script? CustomizationWarning = Have you customized every function in the {0} preset file before running Sophia Script?
WindowsComponentBroken = {0} broken or removed from the OS. WindowsComponentBroken = {0} broken or removed from Windows.
UpdateDefender = Microsoft Defender definitions are out-of-date. Run Windows Update and try again. UpdateDefender = Microsoft Defender definitions are out-of-date. Run Windows Update and try again.
ControlledFolderAccessDisabled = Controlled folder access disabled. ControlledFolderAccessDisabled = Controlled folder access disabled.
InitialActionsCheckFailed = "InitialActions" function cannot be loaded from the {0} preset file. InitialActionsCheckFailed = "InitialActions" function cannot be loaded from the {0} preset file.

168
src/Sophia_Script_for_Windows_10_LTSC_2021/Module/Sophia.psm1

@ -89,7 +89,7 @@ public static string GetString(uint strId)
Add-Type @Signature Add-Type @Signature
} }
# Detect the OS bitness # Detect Windows bitness
if (-not [System.Environment]::Is64BitOperatingSystem) if (-not [System.Environment]::Is64BitOperatingSystem)
{ {
Write-Warning -Message $Localization.UnsupportedOSBitness Write-Warning -Message $Localization.UnsupportedOSBitness
@ -100,17 +100,6 @@ public static string GetString(uint strId)
exit exit
} }
# Check if Get-WindowsEdition cmdlet is working
try
{
[void](Get-WindowsEdition -Online)
}
catch [System.Runtime.InteropServices.COMException]
{
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Get-WindowsEdition")
exit
}
# Check the language mode # Check the language mode
if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage") if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage")
{ {
@ -216,7 +205,7 @@ public static string GetString(uint strId)
} }
} }
# Flibustier custom Windows image # Check whether this is a Flibustier custom Windows image
if (Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\.NETFramework\Performance -Name *flibustier) if (Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\.NETFramework\Performance -Name *flibustier)
{ {
Write-Warning -Message ($Localization.TweakerWarning -f "flblauncher") Write-Warning -Message ($Localization.TweakerWarning -f "flblauncher")
@ -227,12 +216,23 @@ public static string GetString(uint strId)
exit exit
} }
# Check whether LGPO.exe exists in the bin folder # Check whether Get-WindowsEdition cmdlet is working
if (-not (Test-Path -Path "$PSScriptRoot\..\bin\LGPO.exe")) try
{ {
Write-Warning -Message $Localization.Bin [void](Get-WindowsEdition -Online)
}
catch [System.Runtime.InteropServices.COMException]
{
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Get-WindowsEdition")
exit
}
# Check whether EventLog service is running in order to be sire that Event Logger is enabled
if ((Get-Service -Name EventLog).Status -eq "Stopped")
{
# Extract the localized "Event Viewer" string from shell32.dll
Write-Warning -Message ($Localization.WindowsComponentBroken -f $([WinAPI.GetStr]::GetString(22029))
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat" Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79" Start-Process -FilePath "https://discord.gg/sSryhaEv79"
@ -259,55 +259,6 @@ public static string GetString(uint strId)
exit exit
} }
# Check if the current module version is the latest one
try
{
# Check the internet connection
$Parameters = @{
Name = "dns.msftncsi.com"
Server = "1.1.1.1"
DnsOnly = $true
ErrorAction = "Stop"
}
if ((Resolve-DnsName @Parameters).IPAddress -notcontains "131.107.255.255")
{
return
}
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_10_LTSC2021
$CurrentRelease = (Get-Module -Name Sophia).Version.ToString()
if ([System.Version]$LatestRelease -gt [System.Version]$CurrentRelease)
{
Write-Warning -Message $Localization.UnsupportedRelease
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
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
}
}
catch [System.ComponentModel.Win32Exception]
{
Write-Warning -Message $Localization.NoInternetConnection
Write-Error -Message $Localization.NoInternetConnection -ErrorAction SilentlyContinue
}
#region Defender checks #region Defender checks
# Check whether necessary Microsoft Defender components exists # Check whether necessary Microsoft Defender components exists
$Files = @( $Files = @(
@ -456,7 +407,68 @@ public static string GetString(uint strId)
} }
#endregion Defender checks #endregion Defender checks
# Detect the OS build version # Check whether the current module version is the latest one
try
{
# Check the internet connection
$Parameters = @{
Name = "dns.msftncsi.com"
Server = "1.1.1.1"
DnsOnly = $true
ErrorAction = "Stop"
}
if ((Resolve-DnsName @Parameters).IPAddress -notcontains "131.107.255.255")
{
return
}
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_10_LTSC2021
$CurrentRelease = (Get-Module -Name Sophia).Version.ToString()
if ([System.Version]$LatestRelease -gt [System.Version]$CurrentRelease)
{
Write-Warning -Message $Localization.UnsupportedRelease
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
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
}
}
catch [System.ComponentModel.Win32Exception]
{
Write-Warning -Message $Localization.NoInternetConnection
Write-Error -Message $Localization.NoInternetConnection -ErrorAction SilentlyContinue
}
# Check whether LGPO.exe exists in the bin folder
if (-not (Test-Path -Path "$PSScriptRoot\..\bin\LGPO.exe"))
{
Write-Warning -Message $Localization.Bin
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Detect Windows build version
if ((Get-WindowsEdition -Online).Edition -notmatch "EnterpriseS") if ((Get-WindowsEdition -Online).Edition -notmatch "EnterpriseS")
{ {
Write-Warning -Message $Localization.UnsupportedOSBuild Write-Warning -Message $Localization.UnsupportedOSBuild
@ -484,7 +496,7 @@ public static string GetString(uint strId)
{ {
if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR) -lt 3803) if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR) -lt 3803)
{ {
# Check whether the OS minor build version is 3803 minimum # Check whether Windows minor build version is 3803 minimum
# https://learn.microsoft.com/en-us/windows/release-health/release-information#windows-10-current-versions-by-servicing-option # https://learn.microsoft.com/en-us/windows/release-health/release-information#windows-10-current-versions-by-servicing-option
$CurrentBuild = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name CurrentBuild $CurrentBuild = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name CurrentBuild
$UBR = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR $UBR = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR
@ -614,7 +626,7 @@ public static string GetString(uint strId)
# Extract the localized "Please wait..." string from shell32.dll # Extract the localized "Please wait..." string from shell32.dll
Write-Verbose -Message ([WinAPI.GetStr]::GetString(12612)) -Verbose Write-Verbose -Message ([WinAPI.GetStr]::GetString(12612)) -Verbose
# Check if hosts contains any of string from $IPArray array # Check whether hosts contains any of string from $IPArray array
if ((Get-Content -Path "$env:SystemRoot\System32\drivers\etc\hosts" -Encoding Default -Force | ForEach-Object -Process {$_.Trim()} | ForEach-Object -Process { if ((Get-Content -Path "$env:SystemRoot\System32\drivers\etc\hosts" -Encoding Default -Force | ForEach-Object -Process {$_.Trim()} | ForEach-Object -Process {
($_ -ne "") -and ($_ -ne " ") -and (-not $_.StartsWith("#")) -and ($IPArray -split "`r?`n" | Select-String -Pattern $_) ($_ -ne "") -and ($_ -ne " ") -and (-not $_.StartsWith("#")) -and ($IPArray -split "`r?`n" | Select-String -Pattern $_)
}) -contains $true) }) -contains $true)
@ -7252,7 +7264,7 @@ function WinPrtScrFolder
RecommendedTroubleshooting -Default RecommendedTroubleshooting -Default
.NOTES .NOTES
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data" and the error reporting feature will be turned on In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data" and the error reporting feature will be turned on
.NOTES .NOTES
Machine-wide Machine-wide
@ -7296,7 +7308,7 @@ function RecommendedTroubleshooting
} }
} }
# Set the OS level of diagnostic data gathering to "Optional diagnostic data" # Set Windows level of diagnostic data gathering to "Optional diagnostic data"
if (-not (Test-Path -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack)) if (-not (Test-Path -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack))
{ {
New-Item -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack -Force New-Item -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack -Force
@ -9908,7 +9920,7 @@ function PinToStart
# Extract the localized "Devices and Printers" string from shell32.dll # Extract the localized "Devices and Printers" string from shell32.dll
$DevicesPrinters = [WinAPI.GetStr]::GetString(30493) $DevicesPrinters = [WinAPI.GetStr]::GetString(30493)
# Check if an argument is "DevicesPrinters". The Devices and Printers's AppID attribute can be retrieved only if the shortcut was created # Check whether an argument is "DevicesPrinters". The Devices and Printers's AppID attribute can be retrieved only if the shortcut was created
if (((Get-Command -Name PinToStart).Parametersets.Parameters | Where-Object -FilterScript {$null -eq $_.Attributes.AliasNames}).Attributes.ValidValues | Where-Object -FilterScript {$_ -match "DevicesPrinters"}) if (((Get-Command -Name PinToStart).Parametersets.Parameters | Where-Object -FilterScript {$null -eq $_.Attributes.AliasNames}).Attributes.ValidValues | Where-Object -FilterScript {$_ -match "DevicesPrinters"})
{ {
# Create the old-style "Devices and Printers" shortcut in the Start menu # Create the old-style "Devices and Printers" shortcut in the Start menu
@ -10281,7 +10293,7 @@ function CleanupTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName "Windows Cleanup" -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName "Windows Cleanup" -ErrorAction Ignore)
{ {
# Also we can parse "$env:SystemRoot\System32\Tasks\Sophia\Windows Cleanup" to check if the task was created # Also we can parse "$env:SystemRoot\System32\Tasks\Sophia\Windows Cleanup" to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Windows Cleanup"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Windows Cleanup"} | Foreach-Object {
@ -10706,7 +10718,7 @@ function SoftwareDistributionTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName SoftwareDistribution -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName SoftwareDistribution -ErrorAction Ignore)
{ {
# Also we can parse $env:SystemRoot\System32\Tasks\Sophia\SoftwareDistribution to check if the task was created # Also we can parse $env:SystemRoot\System32\Tasks\Sophia\SoftwareDistribution to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "SoftwareDistribution"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "SoftwareDistribution"} | Foreach-Object {
@ -11010,7 +11022,7 @@ function TempTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName Temp -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName Temp -ErrorAction Ignore)
{ {
# Also we can parse $env:SystemRoot\System32\Tasks\Sophia\Temp to check if the task was created # Also we can parse $env:SystemRoot\System32\Tasks\Sophia\Temp to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Temp"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Temp"} | Foreach-Object {
@ -12911,7 +12923,7 @@ function UpdateLGPEPolicies
{ {
foreach ($Item in $Path.Property) foreach ($Item in $Path.Property)
{ {
# Check if property isn't equal to "(default)" and exists # Check whether property isn't equal to "(default)" and exists
if (($null -ne $Item) -and ($Item -ne "(default)")) if (($null -ne $Item) -and ($Item -ne "(default)"))
{ {
# Where all ADMX templates are located to compare with # Where all ADMX templates are located to compare with
@ -12969,7 +12981,7 @@ function UpdateLGPEPolicies
{ {
foreach ($Item in $Path.Property) foreach ($Item in $Path.Property)
{ {
# Check if property isn't equal to "(default)" and exists # Check whether property isn't equal to "(default)" and exists
if (($null -ne $Item) -and ($Item -ne "(default)")) if (($null -ne $Item) -and ($Item -ne "(default)"))
{ {
# Where all ADMX templates are located to compare with # Where all ADMX templates are located to compare with
@ -13129,7 +13141,7 @@ public static void PostMessage()
} }
} }
# Check if any of scheduled tasks were created. Unless open Task Scheduler # Check whether any of scheduled tasks were created. Unless open Task Scheduler
if ($Script:ScheduledTasks) if ($Script:ScheduledTasks)
{ {
# Find and close taskschd.msc by its' argument # Find and close taskschd.msc by its' argument

4
src/Sophia_Script_for_Windows_10_LTSC_2021/Sophia.ps1

@ -721,7 +721,7 @@ WinPrtScrFolder -Desktop
<# <#
Run troubleshooter automatically, then notify me Run troubleshooter automatically, then notify me
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data", and the error reporting feature will be turned on In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data", and the error reporting feature will be turned on
Автоматически запускать средства устранения неполадок, а затем уведомлять Автоматически запускать средства устранения неполадок, а затем уведомлять
Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows
@ -730,7 +730,7 @@ RecommendedTroubleshooting -Automatically
<# <#
Ask me before running troubleshooter (default value) Ask me before running troubleshooter (default value)
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data" In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data"
Спрашивать перед запуском средств устранения неполадок (значение по умолчанию) Спрашивать перед запуском средств устранения неполадок (значение по умолчанию)
Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows

2
src/Sophia_Script_for_Windows_10_PowerShell_7/Localizations/en-US/Sophia.psd1

@ -13,7 +13,7 @@ RebootPending = The PC is waiting to be restarted.
UnsupportedRelease = A new version found. UnsupportedRelease = A new version found.
KeyboardArrows = Please use the arrow keys {0} and {1} on your keyboard to select your answer KeyboardArrows = Please use the arrow keys {0} and {1} on your keyboard to select your answer
CustomizationWarning = Have you customized every function in the {0} preset file before running Sophia Script? CustomizationWarning = Have you customized every function in the {0} preset file before running Sophia Script?
WindowsComponentBroken = {0} broken or removed from the OS. WindowsComponentBroken = {0} broken or removed from Windows.
UpdateDefender = Microsoft Defender definitions are out-of-date. Run Windows Update and try again. UpdateDefender = Microsoft Defender definitions are out-of-date. Run Windows Update and try again.
ControlledFolderAccessDisabled = Controlled folder access disabled. ControlledFolderAccessDisabled = Controlled folder access disabled.
InitialActionsCheckFailed = "InitialActions" function cannot be loaded from the {0} preset file. InitialActionsCheckFailed = "InitialActions" function cannot be loaded from the {0} preset file.

228
src/Sophia_Script_for_Windows_10_PowerShell_7/Module/Sophia.psm1

@ -85,7 +85,7 @@ public static string GetString(uint strId)
Add-Type @Signature Add-Type @Signature
} }
# Check if Microsoft Edge as being a system component was removed by harmful tweakers # Check whether Microsoft Edge as being a system component was removed by harmful tweakers
if (-not (Test-Path -Path "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe")) if (-not (Test-Path -Path "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe"))
{ {
Write-Information -MessageData "" -InformationAction Continue Write-Information -MessageData "" -InformationAction Continue
@ -174,7 +174,7 @@ public static string GetString(uint strId)
} }
} }
# Detect the OS bitness # Detect Windows bitness
if (-not [System.Environment]::Is64BitOperatingSystem) if (-not [System.Environment]::Is64BitOperatingSystem)
{ {
Write-Warning -Message $Localization.UnsupportedOSBitness Write-Warning -Message $Localization.UnsupportedOSBitness
@ -185,17 +185,6 @@ public static string GetString(uint strId)
exit exit
} }
# Check if Get-WindowsEdition cmdlet is working
try
{
[void](Get-WindowsEdition -Online)
}
catch [System.Runtime.InteropServices.COMException]
{
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Get-WindowsEdition")
exit
}
# Check the language mode # Check the language mode
if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage") if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage")
{ {
@ -301,7 +290,7 @@ public static string GetString(uint strId)
} }
} }
# Flibustier custom Windows image # Check whether this is a Flibustier custom Windows image
if (Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\.NETFramework\Performance -Name *flibustier) if (Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\.NETFramework\Performance -Name *flibustier)
{ {
Write-Warning -Message ($Localization.TweakerWarning -f "flblauncher") Write-Warning -Message ($Localization.TweakerWarning -f "flblauncher")
@ -312,47 +301,21 @@ public static string GetString(uint strId)
exit exit
} }
# Check whether Windows Feature Experience Pack was removed by harmful tweakers # Check whether Get-WindowsEdition cmdlet is working
if (-not (Get-AppxPackage -Name MicrosoftWindows.Client.CBS)) try
{ {
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Windows Feature Experience Pack") [void](Get-WindowsEdition -Online)
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
} }
catch [System.Runtime.InteropServices.COMException]
# Check whether all necessary files exist in the bin folder
$Files = @(
"$PSScriptRoot\..\bin\LGPO.exe",
"$PSScriptRoot\..\bin\Microsoft.Windows.SDK.NET.dll",
"$PSScriptRoot\..\bin\WinRT.Runtime.dll"
)
if (($Files | Test-Path) -contains $false)
{ {
Write-Warning -Message $Localization.Bin Write-Warning -Message ($Localization.WindowsComponentBroken -f "Get-WindowsEdition")
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit exit
} }
# Check for a pending reboot # Check whether Windows Feature Experience Pack was removed by harmful tweakers
$PendingActions = @( if (-not (Get-AppxPackage -Name MicrosoftWindows.Client.CBS))
# 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"
)
if (($PendingActions | Test-Path) -contains $true)
{ {
Write-Warning -Message $Localization.RebootPending Write-Warning -Message ($Localization.WindowsComponentBroken -f "Windows Feature Experience Pack")
Start-Process -FilePath "https://t.me/sophia_chat" Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79" Start-Process -FilePath "https://discord.gg/sSryhaEv79"
@ -360,10 +323,11 @@ public static string GetString(uint strId)
exit exit
} }
# Check if Microsoft Store being an important system component was removed # Check whether EventLog service is running in order to be sire that Event Logger is enabled
if (-not (Get-AppxPackage -Name Microsoft.WindowsStore)) if ((Get-Service -Name EventLog).Status -eq "Stopped")
{ {
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Microsoft Store") # Extract the localized "Event Viewer" string from shell32.dll
Write-Warning -Message ($Localization.WindowsComponentBroken -f $([WinAPI.GetStr]::GetString(22029))
Start-Process -FilePath "https://t.me/sophia_chat" Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79" Start-Process -FilePath "https://discord.gg/sSryhaEv79"
@ -371,54 +335,16 @@ public static string GetString(uint strId)
exit exit
} }
# Check if the current module version is the latest one # Check whether Microsoft Store being an important system component was removed
try if (-not (Get-AppxPackage -Name Microsoft.WindowsStore))
{
# Check the internet connection
$Parameters = @{
Name = "dns.msftncsi.com"
Server = "1.1.1.1"
DnsOnly = $true
ErrorAction = "Stop"
}
if ((Resolve-DnsName @Parameters).IPAddress -notcontains "131.107.255.255")
{
return
}
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_10_PowerShell_7
$CurrentRelease = (Get-Module -Name Sophia).Version.ToString()
if ([System.Version]$LatestRelease -gt [System.Version]$CurrentRelease)
{ {
Write-Warning -Message $Localization.UnsupportedRelease Write-Warning -Message ($Localization.WindowsComponentBroken -f "Microsoft Store")
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat" Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79" Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit 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
}
}
catch [System.ComponentModel.Win32Exception]
{
Write-Warning -Message $Localization.NoInternetConnection
Write-Error -Message $Localization.NoInternetConnection -ErrorAction SilentlyContinue
}
#region Defender checks #region Defender checks
# Check whether necessary Microsoft Defender components exists # Check whether necessary Microsoft Defender components exists
@ -504,7 +430,7 @@ public static string GetString(uint strId)
# Defender is a currently used AV. Continue... # Defender is a currently used AV. Continue...
$Script:DefenderProductState = $true $Script:DefenderProductState = $true
# Check if Windows is Enterprise for Chineese Goverment which doesn't have Defender # Check whether Windows is Enterprise for Chineese Goverment which doesn't have Defender
if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name EditionID) -ne "EnterpriseG") if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name EditionID) -ne "EnterpriseG")
{ {
# Defender is a currently used AV. Continue... # Defender is a currently used AV. Continue...
@ -580,7 +506,93 @@ public static string GetString(uint strId)
} }
#endregion Defender checks #endregion Defender checks
# Detect the OS build version # Check for a pending reboot
$PendingActions = @(
# 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"
)
if (($PendingActions | Test-Path) -contains $true)
{
Write-Warning -Message $Localization.RebootPending
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Check whether the current module version is the latest one
try
{
# Check the internet connection
$Parameters = @{
Name = "dns.msftncsi.com"
Server = "1.1.1.1"
DnsOnly = $true
ErrorAction = "Stop"
}
if ((Resolve-DnsName @Parameters).IPAddress -notcontains "131.107.255.255")
{
return
}
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_10_PowerShell_5_1
$CurrentRelease = (Get-Module -Name Sophia).Version.ToString()
if ([System.Version]$LatestRelease -gt [System.Version]$CurrentRelease)
{
Write-Warning -Message $Localization.UnsupportedRelease
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
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
}
}
catch [System.ComponentModel.Win32Exception]
{
Write-Warning -Message $Localization.NoInternetConnection
Write-Error -Message $Localization.NoInternetConnection -ErrorAction SilentlyContinue
}
# Check whether all necessary files exist in the bin folder
$Files = @(
"$PSScriptRoot\..\bin\LGPO.exe",
"$PSScriptRoot\..\bin\Microsoft.Windows.SDK.NET.dll",
"$PSScriptRoot\..\bin\WinRT.Runtime.dll"
)
if (($Files | Test-Path) -contains $false)
{
Write-Warning -Message $Localization.Bin
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Detect Windows build version
switch ((Get-CimInstance -ClassName CIM_OperatingSystem).BuildNumber) switch ((Get-CimInstance -ClassName CIM_OperatingSystem).BuildNumber)
{ {
{($_ -lt 19045) -or ($_ -gt 19045)} {($_ -lt 19045) -or ($_ -gt 19045)}
@ -597,7 +609,7 @@ public static string GetString(uint strId)
{ {
if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR) -lt 3803) if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR) -lt 3803)
{ {
# Check whether the OS minor build version is 3803 minimum # Check whether Windows minor build version is 3803 minimum
# https://learn.microsoft.com/en-us/windows/release-health/release-information#windows-10-current-versions-by-servicing-option # https://learn.microsoft.com/en-us/windows/release-health/release-information#windows-10-current-versions-by-servicing-option
$CurrentBuild = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name CurrentBuild $CurrentBuild = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name CurrentBuild
$UBR = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR $UBR = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR
@ -730,7 +742,7 @@ public static string GetString(uint strId)
# Extract the localized "Please wait..." string from shell32.dll # Extract the localized "Please wait..." string from shell32.dll
Write-Verbose -Message ([WinAPI.GetStr]::GetString(12612)) -Verbose Write-Verbose -Message ([WinAPI.GetStr]::GetString(12612)) -Verbose
# Check if hosts contains any of string from $IPArray array # Check whether hosts contains any of string from $IPArray array
if ((Get-Content -Path "$env:SystemRoot\System32\drivers\etc\hosts" -Encoding Default -Force | ForEach-Object -Process {$_.Trim()} | ForEach-Object -Process { if ((Get-Content -Path "$env:SystemRoot\System32\drivers\etc\hosts" -Encoding Default -Force | ForEach-Object -Process {$_.Trim()} | ForEach-Object -Process {
($_ -ne "") -and ($_ -ne " ") -and (-not $_.StartsWith("#")) -and ($IPArray -split "`r?`n" | Select-String -Pattern $_) ($_ -ne "") -and ($_ -ne " ") -and (-not $_.StartsWith("#")) -and ($IPArray -split "`r?`n" | Select-String -Pattern $_)
}) -contains $true) }) -contains $true)
@ -5171,7 +5183,7 @@ function OneDrive
return return
} }
# Check if user is logged into OneDrive (Microsoft account) # Check whether user is logged into OneDrive (Microsoft account)
$UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore $UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore
if ($UserEmail) if ($UserEmail)
{ {
@ -8215,7 +8227,7 @@ function WinPrtScrFolder
$Default $Default
) )
# Check if user is logged into OneDrive (Microsoft account) # Check whether user is logged into OneDrive (Microsoft account)
$UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore $UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore
if ($UserEmail) if ($UserEmail)
{ {
@ -8297,7 +8309,7 @@ function WinPrtScrFolder
RecommendedTroubleshooting -Default RecommendedTroubleshooting -Default
.NOTES .NOTES
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data" and the error reporting feature will be turned on In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data" and the error reporting feature will be turned on
.NOTES .NOTES
Machine-wide Machine-wide
@ -8341,7 +8353,7 @@ function RecommendedTroubleshooting
} }
} }
# Set the OS level of diagnostic data gathering to "Optional diagnostic data" # Set Windows level of diagnostic data gathering to "Optional diagnostic data"
if (-not (Test-Path -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack)) if (-not (Test-Path -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack))
{ {
New-Item -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack -Force New-Item -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack -Force
@ -10217,7 +10229,7 @@ function Import-Associations
https://support.microsoft.com/en-us/windows/how-to-use-the-pc-health-check-app-9c8abd9b-03ba-4e67-81ef-36f37caa7844 https://support.microsoft.com/en-us/windows/how-to-use-the-pc-health-check-app-9c8abd9b-03ba-4e67-81ef-36f37caa7844
.NOTES .NOTES
This application is installed with the KB5005463 update to check if PC meets the system requirements of Windows 11 This application is installed with the KB5005463 update to Check whether PC meets the system requirements of Windows 11
.NOTES .NOTES
Machine-wide Machine-wide
@ -11052,7 +11064,7 @@ function PinToStart
# Extract the localized "Devices and Printers" string from shell32.dll # Extract the localized "Devices and Printers" string from shell32.dll
$DevicesPrinters = [WinAPI.GetStr]::GetString(30493) $DevicesPrinters = [WinAPI.GetStr]::GetString(30493)
# Check if an argument is "DevicesPrinters". The Devices and Printers's AppID attribute can be retrieved only if the shortcut was created # Check whether an argument is "DevicesPrinters". The Devices and Printers's AppID attribute can be retrieved only if the shortcut was created
if (((Get-Command -Name PinToStart).Parametersets.Parameters | Where-Object -FilterScript {$null -eq $_.Attributes.AliasNames}).Attributes.ValidValues | Where-Object -FilterScript {$_ -match "DevicesPrinters"}) if (((Get-Command -Name PinToStart).Parametersets.Parameters | Where-Object -FilterScript {$null -eq $_.Attributes.AliasNames}).Attributes.ValidValues | Where-Object -FilterScript {$_ -match "DevicesPrinters"})
{ {
# Create the old-style "Devices and Printers" shortcut in the Start menu # Create the old-style "Devices and Printers" shortcut in the Start menu
@ -12659,7 +12671,7 @@ function CleanupTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName "Windows Cleanup" -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName "Windows Cleanup" -ErrorAction Ignore)
{ {
# Also we can parse "$env:SystemRoot\System32\Tasks\Sophia\Windows Cleanup" to check if the task was created # Also we can parse "$env:SystemRoot\System32\Tasks\Sophia\Windows Cleanup" to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Windows Cleanup"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Windows Cleanup"} | Foreach-Object {
@ -13084,7 +13096,7 @@ function SoftwareDistributionTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName SoftwareDistribution -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName SoftwareDistribution -ErrorAction Ignore)
{ {
# Also we can parse $env:SystemRoot\System32\Tasks\Sophia\SoftwareDistribution to check if the task was created # Also we can parse $env:SystemRoot\System32\Tasks\Sophia\SoftwareDistribution to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "SoftwareDistribution"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "SoftwareDistribution"} | Foreach-Object {
@ -13388,7 +13400,7 @@ function TempTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName Temp -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName Temp -ErrorAction Ignore)
{ {
# Also we can parse $env:SystemRoot\System32\Tasks\Sophia\Temp to check if the task was created # Also we can parse $env:SystemRoot\System32\Tasks\Sophia\Temp to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Temp"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Temp"} | Foreach-Object {
@ -15458,7 +15470,7 @@ function UpdateLGPEPolicies
{ {
foreach ($Item in $Path.Property) foreach ($Item in $Path.Property)
{ {
# Check if property isn't equal to "(default)" and exists # Check whether property isn't equal to "(default)" and exists
if (($null -ne $Item) -and ($Item -ne "(default)")) if (($null -ne $Item) -and ($Item -ne "(default)"))
{ {
# Where all ADMX templates are located to compare with # Where all ADMX templates are located to compare with
@ -15516,7 +15528,7 @@ function UpdateLGPEPolicies
{ {
foreach ($Item in $Path.Property) foreach ($Item in $Path.Property)
{ {
# Check if property isn't equal to "(default)" and exists # Check whether property isn't equal to "(default)" and exists
if (($null -ne $Item) -and ($Item -ne "(default)")) if (($null -ne $Item) -and ($Item -ne "(default)"))
{ {
# Where all ADMX templates are located to compare with # Where all ADMX templates are located to compare with
@ -15686,7 +15698,7 @@ public static void PostMessage()
} }
} }
# Check if any of scheduled tasks were created. Unless open Task Scheduler # Check whether any of scheduled tasks were created. Unless open Task Scheduler
if ($Script:ScheduledTasks) if ($Script:ScheduledTasks)
{ {
# Find and close taskschd.msc by its' argument # Find and close taskschd.msc by its' argument

6
src/Sophia_Script_for_Windows_10_PowerShell_7/Sophia.ps1

@ -832,7 +832,7 @@ WinPrtScrFolder -Desktop
<# <#
Run troubleshooter automatically, then notify me Run troubleshooter automatically, then notify me
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data", and the error reporting feature will be turned on In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data", and the error reporting feature will be turned on
Автоматически запускать средства устранения неполадок, а затем уведомлять Автоматически запускать средства устранения неполадок, а затем уведомлять
Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows
@ -841,7 +841,7 @@ RecommendedTroubleshooting -Automatically
<# <#
Ask me before running troubleshooter (default value) Ask me before running troubleshooter (default value)
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data" In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data"
Спрашивать перед запуском средств устранения неполадок (значение по умолчанию) Спрашивать перед запуском средств устранения неполадок (значение по умолчанию)
Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows
@ -985,7 +985,7 @@ WindowsLatestUpdate -Disable
<# <#
Uninstall the "PC Health Check" app and prevent it from installing in the future Uninstall the "PC Health Check" app and prevent it from installing in the future
This application is installed with the KB5005463 update to check if PC meets the system requirements of Windows 11 This application is installed with the KB5005463 update to Check whether PC meets the system requirements of Windows 11
Удалить приложение "Проверка работоспособности ПК Windows" и заблокировать его установку в будущем Удалить приложение "Проверка работоспособности ПК Windows" и заблокировать его установку в будущем
Данное приложение устанавливается обновлением KB5005463 для проверки соответствия компьютера системным требованиям Windows 11 Данное приложение устанавливается обновлением KB5005463 для проверки соответствия компьютера системным требованиям Windows 11

2
src/Sophia_Script_for_Windows_11/Localizations/en-US/Sophia.psd1

@ -12,7 +12,7 @@ RebootPending = The PC is waiting to be restarted.
UnsupportedRelease = A new version found. UnsupportedRelease = A new version found.
KeyboardArrows = Please use the arrow keys {0} and {1} on your keyboard to select your answer KeyboardArrows = Please use the arrow keys {0} and {1} on your keyboard to select your answer
CustomizationWarning = Have you customized every function in the {0} preset file before running Sophia Script? CustomizationWarning = Have you customized every function in the {0} preset file before running Sophia Script?
WindowsComponentBroken = {0} broken or removed from the OS. WindowsComponentBroken = {0} broken or removed from Windows.
UpdateDefender = Microsoft Defender definitions are out-of-date. Run Windows Update and try again. UpdateDefender = Microsoft Defender definitions are out-of-date. Run Windows Update and try again.
ControlledFolderAccessDisabled = Controlled folder access disabled. ControlledFolderAccessDisabled = Controlled folder access disabled.
InitialActionsCheckFailed = "InitialActions" function cannot be loaded from the {0} preset file. InitialActionsCheckFailed = "InitialActions" function cannot be loaded from the {0} preset file.

218
src/Sophia_Script_for_Windows_11/Module/Sophia.psm1

@ -88,7 +88,7 @@ public static string GetString(uint strId)
Add-Type @Signature Add-Type @Signature
} }
# Check if Microsoft Edge as being a system component was removed by harmful tweakers # Check whether Microsoft Edge as being a system component was removed by harmful tweakers
if (-not (Test-Path -Path "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe")) if (-not (Test-Path -Path "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe"))
{ {
Write-Information -MessageData "" -InformationAction Continue Write-Information -MessageData "" -InformationAction Continue
@ -177,17 +177,6 @@ public static string GetString(uint strId)
} }
} }
# Check if Get-WindowsEdition cmdlet is working
try
{
[void](Get-WindowsEdition -Online)
}
catch [System.Runtime.InteropServices.COMException]
{
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Get-WindowsEdition")
exit
}
# Check the language mode # Check the language mode
if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage") if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage")
{ {
@ -293,7 +282,7 @@ public static string GetString(uint strId)
} }
} }
# Flibustier custom Windows image # Check whether this is a Flibustier custom Windows image
if (Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\.NETFramework\Performance -Name *flibustier) if (Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\.NETFramework\Performance -Name *flibustier)
{ {
Write-Warning -Message ($Localization.TweakerWarning -f "flblauncher") Write-Warning -Message ($Localization.TweakerWarning -f "flblauncher")
@ -304,42 +293,21 @@ public static string GetString(uint strId)
exit exit
} }
# Check whether Windows Feature Experience Pack was removed by harmful tweakers # Check whether Get-WindowsEdition cmdlet is working
if (-not (Get-AppxPackage -Name MicrosoftWindows.Client.CBS)) try
{ {
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Windows Feature Experience Pack") [void](Get-WindowsEdition -Online)
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
} }
catch [System.Runtime.InteropServices.COMException]
# Check whether LGPO.exe exists in the bin folder
if (-not (Test-Path -Path "$PSScriptRoot\..\bin\LGPO.exe"))
{ {
Write-Warning -Message $Localization.Bin Write-Warning -Message ($Localization.WindowsComponentBroken -f "Get-WindowsEdition")
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit exit
} }
# Check for a pending reboot # Check whether Windows Feature Experience Pack was removed by harmful tweakers
$PendingActions = @( if (-not (Get-AppxPackage -Name MicrosoftWindows.Client.CBS))
# 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"
)
if (($PendingActions | Test-Path) -contains $true)
{ {
Write-Warning -Message $Localization.RebootPending Write-Warning -Message ($Localization.WindowsComponentBroken -f "Windows Feature Experience Pack")
Start-Process -FilePath "https://t.me/sophia_chat" Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79" Start-Process -FilePath "https://discord.gg/sSryhaEv79"
@ -347,10 +315,11 @@ public static string GetString(uint strId)
exit exit
} }
# Check if Microsoft Store being an important system component was removed # Check whether EventLog service is running in order to be sire that Event Logger is enabled
if (-not (Get-AppxPackage -Name Microsoft.WindowsStore)) if ((Get-Service -Name EventLog).Status -eq "Stopped")
{ {
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Microsoft Store") # Extract the localized "Event Viewer" string from shell32.dll
Write-Warning -Message ($Localization.WindowsComponentBroken -f $([WinAPI.GetStr]::GetString(22029))
Start-Process -FilePath "https://t.me/sophia_chat" Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79" Start-Process -FilePath "https://discord.gg/sSryhaEv79"
@ -358,54 +327,16 @@ public static string GetString(uint strId)
exit exit
} }
# Check if the current module version is the latest one # Check whether Microsoft Store being an important system component was removed
try if (-not (Get-AppxPackage -Name Microsoft.WindowsStore))
{
# Check the internet connection
$Parameters = @{
Name = "dns.msftncsi.com"
Server = "1.1.1.1"
DnsOnly = $true
ErrorAction = "Stop"
}
if ((Resolve-DnsName @Parameters).IPAddress -notcontains "131.107.255.255")
{
return
}
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 Sophia).Version.ToString()
if ([System.Version]$LatestRelease -gt [System.Version]$CurrentRelease)
{ {
Write-Warning -Message $Localization.UnsupportedRelease Write-Warning -Message ($Localization.WindowsComponentBroken -f "Microsoft Store")
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat" Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79" Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit 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
}
}
catch [System.ComponentModel.Win32Exception]
{
Write-Warning -Message $Localization.NoInternetConnection
Write-Error -Message $Localization.NoInternetConnection -ErrorAction SilentlyContinue
}
#region Defender checks #region Defender checks
# Check whether necessary Microsoft Defender components exists # Check whether necessary Microsoft Defender components exists
@ -555,7 +486,88 @@ public static string GetString(uint strId)
} }
#endregion Defender checks #endregion Defender checks
# Detect the OS build version # Check for a pending reboot
$PendingActions = @(
# 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"
)
if (($PendingActions | Test-Path) -contains $true)
{
Write-Warning -Message $Localization.RebootPending
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Check whether the current module version is the latest one
try
{
# Check the internet connection
$Parameters = @{
Name = "dns.msftncsi.com"
Server = "1.1.1.1"
DnsOnly = $true
ErrorAction = "Stop"
}
if ((Resolve-DnsName @Parameters).IPAddress -notcontains "131.107.255.255")
{
return
}
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 Sophia).Version.ToString()
if ([System.Version]$LatestRelease -gt [System.Version]$CurrentRelease)
{
Write-Warning -Message $Localization.UnsupportedRelease
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
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
}
}
catch [System.ComponentModel.Win32Exception]
{
Write-Warning -Message $Localization.NoInternetConnection
Write-Error -Message $Localization.NoInternetConnection -ErrorAction SilentlyContinue
}
# Check whether LGPO.exe exists in the bin folder
if (-not (Test-Path -Path "$PSScriptRoot\..\bin\LGPO.exe"))
{
Write-Warning -Message $Localization.Bin
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Detect Windows build version
switch ((Get-CimInstance -ClassName CIM_OperatingSystem).BuildNumber) switch ((Get-CimInstance -ClassName CIM_OperatingSystem).BuildNumber)
{ {
{$_ -lt 22631} {$_ -lt 22631}
@ -586,7 +598,7 @@ public static string GetString(uint strId)
{ {
if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR) -lt 2861) if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR) -lt 2861)
{ {
# Check whether the OS minor build version is 2861 minimum # Check whether Windows minor build version is 2861 minimum
# https://learn.microsoft.com/en-us/windows/release-health/windows11-release-information#windows-11-current-versions # https://learn.microsoft.com/en-us/windows/release-health/windows11-release-information#windows-11-current-versions
$CurrentBuild = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name CurrentBuild $CurrentBuild = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name CurrentBuild
$UBR = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR $UBR = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR
@ -719,7 +731,7 @@ public static string GetString(uint strId)
# Extract the localized "Please wait..." string from shell32.dll # Extract the localized "Please wait..." string from shell32.dll
Write-Verbose -Message ([WinAPI.GetStr]::GetString(12612)) -Verbose Write-Verbose -Message ([WinAPI.GetStr]::GetString(12612)) -Verbose
# Check if hosts contains any of string from $IPArray array # Check whether hosts contains any of string from $IPArray array
if ((Get-Content -Path "$env:SystemRoot\System32\drivers\etc\hosts" -Encoding Default -Force | ForEach-Object -Process {$_.Trim()} | ForEach-Object -Process { if ((Get-Content -Path "$env:SystemRoot\System32\drivers\etc\hosts" -Encoding Default -Force | ForEach-Object -Process {$_.Trim()} | ForEach-Object -Process {
($_ -ne "") -and ($_ -ne " ") -and (-not $_.StartsWith("#")) -and ($IPArray -split "`r?`n" | Select-String -Pattern $_) ($_ -ne "") -and ($_ -ne " ") -and (-not $_.StartsWith("#")) -and ($IPArray -split "`r?`n" | Select-String -Pattern $_)
}) -contains $true) }) -contains $true)
@ -4504,7 +4516,7 @@ function OneDrive
return return
} }
# Check if user is logged into OneDrive (Microsoft account) # Check whether user is logged into OneDrive (Microsoft account)
$UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore $UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore
if ($UserEmail) if ($UserEmail)
{ {
@ -7749,7 +7761,7 @@ function WinPrtScrFolder
$Default $Default
) )
# Check if user is logged into OneDrive (Microsoft account) # Check whether user is logged into OneDrive (Microsoft account)
$UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore $UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore
if ($UserEmail) if ($UserEmail)
{ {
@ -7831,7 +7843,7 @@ function WinPrtScrFolder
RecommendedTroubleshooting -Default RecommendedTroubleshooting -Default
.NOTES .NOTES
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data" and the error reporting feature will be turned on In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data" and the error reporting feature will be turned on
.NOTES .NOTES
Machine-wide Machine-wide
@ -7875,7 +7887,7 @@ function RecommendedTroubleshooting
} }
} }
# Set the OS level of diagnostic data gathering to "Optional diagnostic data" # Set Windows level of diagnostic data gathering to "Optional diagnostic data"
if (-not (Test-Path -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack)) if (-not (Test-Path -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack))
{ {
New-Item -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack -Force New-Item -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack -Force
@ -9920,7 +9932,7 @@ function Install-WSA
return return
} }
# Check if Windows 11 is installed on an SSD # Check whether Windows 11 is installed on an SSD
$DiskNumber = (Get-Disk | Where-Object -FilterScript {$_.Isboot -and $_.IsSystem -and ($_.OperationalStatus -eq "Online")}).Number $DiskNumber = (Get-Disk | Where-Object -FilterScript {$_.Isboot -and $_.IsSystem -and ($_.OperationalStatus -eq "Online")}).Number
if (Get-PhysicalDisk -DeviceNumber $DiskNumber | Where-Object -FilterScript {$_.MediaType -ne "SSD"}) if (Get-PhysicalDisk -DeviceNumber $DiskNumber | Where-Object -FilterScript {$_.MediaType -ne "SSD"})
{ {
@ -11745,7 +11757,7 @@ function CleanupTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName "Windows Cleanup" -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName "Windows Cleanup" -ErrorAction Ignore)
{ {
# Also we can parse "$env:SystemRoot\System32\Tasks\Sophia\Windows Cleanup" to check if the task was created # Also we can parse "$env:SystemRoot\System32\Tasks\Sophia\Windows Cleanup" to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Windows Cleanup"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Windows Cleanup"} | Foreach-Object {
@ -12170,7 +12182,7 @@ function SoftwareDistributionTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName SoftwareDistribution -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName SoftwareDistribution -ErrorAction Ignore)
{ {
# Also we can parse $env:SystemRoot\System32\Tasks\Sophia\SoftwareDistribution to check if the task was created # Also we can parse $env:SystemRoot\System32\Tasks\Sophia\SoftwareDistribution to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "SoftwareDistribution"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "SoftwareDistribution"} | Foreach-Object {
@ -12474,7 +12486,7 @@ function TempTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName Temp -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName Temp -ErrorAction Ignore)
{ {
# Also we can parse $env:SystemRoot\System32\Tasks\Sophia\Temp to check if the task was created # Also we can parse $env:SystemRoot\System32\Tasks\Sophia\Temp to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Temp"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Temp"} | Foreach-Object {
@ -14444,11 +14456,11 @@ function OpenWindowsTerminalAdminContext
if if
( (
# Check if it is not blocked by policy # Check whether it is not blocked by policy
(-not (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" -Name "{9F156763-7844-4DC4-B2B1-901F640F5155}" -ErrorAction Ignore)) -and (-not (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" -Name "{9F156763-7844-4DC4-B2B1-901F640F5155}" -ErrorAction Ignore)) -and
# Check if the package installed # Check whether the package installed
(Get-AppxPackage -Name Microsoft.WindowsTerminal) -and (Get-AppxPackage -Name Microsoft.WindowsTerminal) -and
# Check if Windows Terminal version is greater or equal than 1.11 # Check whether Windows Terminal version is greater or equal than 1.11
([System.Version](Get-AppxPackage -Name Microsoft.WindowsTerminal).Version -ge [System.Version]"1.11") ([System.Version](Get-AppxPackage -Name Microsoft.WindowsTerminal).Version -ge [System.Version]"1.11")
) )
{ {
@ -14605,7 +14617,7 @@ function UpdateLGPEPolicies
{ {
foreach ($Item in $Path.Property) foreach ($Item in $Path.Property)
{ {
# Check if property isn't equal to "(default)" and exists # Check whether property isn't equal to "(default)" and exists
if (($null -ne $Item) -and ($Item -ne "(default)")) if (($null -ne $Item) -and ($Item -ne "(default)"))
{ {
# Where all ADMX templates are located to compare with # Where all ADMX templates are located to compare with
@ -14663,7 +14675,7 @@ function UpdateLGPEPolicies
{ {
foreach ($Item in $Path.Property) foreach ($Item in $Path.Property)
{ {
# Check if property isn't equal to "(default)" and exists # Check whether property isn't equal to "(default)" and exists
if (($null -ne $Item) -and ($Item -ne "(default)")) if (($null -ne $Item) -and ($Item -ne "(default)"))
{ {
# Where all ADMX templates are located to compare with # Where all ADMX templates are located to compare with
@ -14823,7 +14835,7 @@ public static void PostMessage()
} }
} }
# Check if any of scheduled tasks were created. Unless open Task Scheduler # Check whether any of scheduled tasks were created. Unless open Task Scheduler
if ($Script:ScheduledTasks) if ($Script:ScheduledTasks)
{ {
# Find and close taskschd.msc by its' argument # Find and close taskschd.msc by its' argument

4
src/Sophia_Script_for_Windows_11/Sophia.ps1

@ -790,7 +790,7 @@ WinPrtScrFolder -Desktop
<# <#
Run troubleshooter automatically, then notify me Run troubleshooter automatically, then notify me
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data", and the error reporting feature will be turned on In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data", and the error reporting feature will be turned on
Автоматически запускать средства устранения неполадок, а затем уведомлять Автоматически запускать средства устранения неполадок, а затем уведомлять
Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows
@ -799,7 +799,7 @@ RecommendedTroubleshooting -Automatically
<# <#
Ask me before running troubleshooter (default value) Ask me before running troubleshooter (default value)
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data" In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data"
Спрашивать перед запуском средств устранения неполадок (значение по умолчанию) Спрашивать перед запуском средств устранения неполадок (значение по умолчанию)
Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows

2
src/Sophia_Script_for_Windows_11_PowerShell_7/Localizations/en-US/Sophia.psd1

@ -12,7 +12,7 @@ RebootPending = The PC is waiting to be restarted.
UnsupportedRelease = A new version found. UnsupportedRelease = A new version found.
KeyboardArrows = Please use the arrow keys {0} and {1} on your keyboard to select your answer KeyboardArrows = Please use the arrow keys {0} and {1} on your keyboard to select your answer
CustomizationWarning = Have you customized every function in the {0} preset file before running Sophia Script? CustomizationWarning = Have you customized every function in the {0} preset file before running Sophia Script?
WindowsComponentBroken = {0} broken or removed from the OS. WindowsComponentBroken = {0} broken or removed from Windows.
UpdateDefender = Microsoft Defender definitions are out-of-date. Run Windows Update and try again. UpdateDefender = Microsoft Defender definitions are out-of-date. Run Windows Update and try again.
ControlledFolderAccessDisabled = Controlled folder access disabled. ControlledFolderAccessDisabled = Controlled folder access disabled.
InitialActionsCheckFailed = "InitialActions" function cannot be loaded from the {0} preset file. InitialActionsCheckFailed = "InitialActions" function cannot be loaded from the {0} preset file.

228
src/Sophia_Script_for_Windows_11_PowerShell_7/Module/Sophia.psm1

@ -84,7 +84,7 @@ public static string GetString(uint strId)
Add-Type @Signature Add-Type @Signature
} }
# Check if Microsoft Edge as being a system component was removed by harmful tweakers # Check whether Microsoft Edge as being a system component was removed by harmful tweakers
if (-not (Test-Path -Path "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe")) if (-not (Test-Path -Path "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe"))
{ {
Write-Information -MessageData "" -InformationAction Continue Write-Information -MessageData "" -InformationAction Continue
@ -173,17 +173,6 @@ public static string GetString(uint strId)
} }
} }
# Check if Get-WindowsEdition cmdlet is working
try
{
[void](Get-WindowsEdition -Online)
}
catch [System.Runtime.InteropServices.COMException]
{
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Get-WindowsEdition")
exit
}
# Check the language mode # Check the language mode
if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage") if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage")
{ {
@ -289,7 +278,7 @@ public static string GetString(uint strId)
} }
} }
# Flibustier custom Windows image # Check whether this is a Flibustier custom Windows image
if (Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\.NETFramework\Performance -Name *flibustier) if (Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\.NETFramework\Performance -Name *flibustier)
{ {
Write-Warning -Message ($Localization.TweakerWarning -f "flblauncher") Write-Warning -Message ($Localization.TweakerWarning -f "flblauncher")
@ -300,47 +289,21 @@ public static string GetString(uint strId)
exit exit
} }
# Check whether Windows Feature Experience Pack was removed by harmful tweakers # Check whether Get-WindowsEdition cmdlet is working
if (-not (Get-AppxPackage -Name MicrosoftWindows.Client.CBS)) try
{ {
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Windows Feature Experience Pack") [void](Get-WindowsEdition -Online)
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
} }
catch [System.Runtime.InteropServices.COMException]
# Check whether all necessary files exist in the bin folder
$Files = @(
"$PSScriptRoot\..\bin\LGPO.exe",
"$PSScriptRoot\..\bin\Microsoft.Windows.SDK.NET.dll",
"$PSScriptRoot\..\bin\WinRT.Runtime.dll"
)
if (($Files | Test-Path) -contains $false)
{ {
Write-Warning -Message $Localization.Bin Write-Warning -Message ($Localization.WindowsComponentBroken -f "Get-WindowsEdition")
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit exit
} }
# Check for a pending reboot # Check whether Windows Feature Experience Pack was removed by harmful tweakers
$PendingActions = @( if (-not (Get-AppxPackage -Name MicrosoftWindows.Client.CBS))
# 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"
)
if (($PendingActions | Test-Path) -contains $true)
{ {
Write-Warning -Message $Localization.RebootPending Write-Warning -Message ($Localization.WindowsComponentBroken -f "Windows Feature Experience Pack")
Start-Process -FilePath "https://t.me/sophia_chat" Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79" Start-Process -FilePath "https://discord.gg/sSryhaEv79"
@ -348,10 +311,11 @@ public static string GetString(uint strId)
exit exit
} }
# Check if Microsoft Store being an important system component was removed # Check whether EventLog service is running in order to be sire that Event Logger is enabled
if (-not (Get-AppxPackage -Name Microsoft.WindowsStore)) if ((Get-Service -Name EventLog).Status -eq "Stopped")
{ {
Write-Warning -Message ($Localization.WindowsComponentBroken -f "Microsoft Store") # Extract the localized "Event Viewer" string from shell32.dll
Write-Warning -Message ($Localization.WindowsComponentBroken -f $([WinAPI.GetStr]::GetString(22029))
Start-Process -FilePath "https://t.me/sophia_chat" Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79" Start-Process -FilePath "https://discord.gg/sSryhaEv79"
@ -359,54 +323,16 @@ public static string GetString(uint strId)
exit exit
} }
# Check if the current module version is the latest one # Check whether Microsoft Store being an important system component was removed
try if (-not (Get-AppxPackage -Name Microsoft.WindowsStore))
{
# Check the internet connection
$Parameters = @{
Name = "dns.msftncsi.com"
Server = "1.1.1.1"
DnsOnly = $true
ErrorAction = "Stop"
}
if ((Resolve-DnsName @Parameters).IPAddress -notcontains "131.107.255.255")
{
return
}
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_7
$CurrentRelease = (Get-Module -Name Sophia).Version.ToString()
if ([System.Version]$LatestRelease -gt [System.Version]$CurrentRelease)
{ {
Write-Warning -Message $Localization.UnsupportedRelease Write-Warning -Message ($Localization.WindowsComponentBroken -f "Microsoft Store")
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat" Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79" Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit 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
}
}
catch [System.ComponentModel.Win32Exception]
{
Write-Warning -Message $Localization.NoInternetConnection
Write-Error -Message $Localization.NoInternetConnection -ErrorAction SilentlyContinue
}
#region Defender checks #region Defender checks
# Check whether necessary Microsoft Defender components exists # Check whether necessary Microsoft Defender components exists
@ -556,7 +482,93 @@ public static string GetString(uint strId)
} }
#endregion Defender checks #endregion Defender checks
# Detect the OS build version # Check for a pending reboot
$PendingActions = @(
# 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"
)
if (($PendingActions | Test-Path) -contains $true)
{
Write-Warning -Message $Localization.RebootPending
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Check whether the current module version is the latest one
try
{
# Check the internet connection
$Parameters = @{
Name = "dns.msftncsi.com"
Server = "1.1.1.1"
DnsOnly = $true
ErrorAction = "Stop"
}
if ((Resolve-DnsName @Parameters).IPAddress -notcontains "131.107.255.255")
{
return
}
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 Sophia).Version.ToString()
if ([System.Version]$LatestRelease -gt [System.Version]$CurrentRelease)
{
Write-Warning -Message $Localization.UnsupportedRelease
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
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
}
}
catch [System.ComponentModel.Win32Exception]
{
Write-Warning -Message $Localization.NoInternetConnection
Write-Error -Message $Localization.NoInternetConnection -ErrorAction SilentlyContinue
}
# Check whether all necessary files exist in the bin folder
$Files = @(
"$PSScriptRoot\..\bin\LGPO.exe",
"$PSScriptRoot\..\bin\Microsoft.Windows.SDK.NET.dll",
"$PSScriptRoot\..\bin\WinRT.Runtime.dll"
)
if (($Files | Test-Path) -contains $false)
{
Write-Warning -Message $Localization.Bin
Start-Process -FilePath "https://github.com/farag2/Sophia-Script-for-Windows/releases/latest"
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Detect Windows build version
switch ((Get-CimInstance -ClassName CIM_OperatingSystem).BuildNumber) switch ((Get-CimInstance -ClassName CIM_OperatingSystem).BuildNumber)
{ {
{$_ -lt 22631} {$_ -lt 22631}
@ -587,7 +599,7 @@ public static string GetString(uint strId)
{ {
if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR) -lt 2861) if ((Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR) -lt 2861)
{ {
# Check whether the OS minor build version is 2861 minimum # Check whether Windows minor build version is 2861 minimum
# https://learn.microsoft.com/en-us/windows/release-health/windows11-release-information#windows-11-current-versions # https://learn.microsoft.com/en-us/windows/release-health/windows11-release-information#windows-11-current-versions
$CurrentBuild = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name CurrentBuild $CurrentBuild = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name CurrentBuild
$UBR = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR $UBR = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" -Name UBR
@ -720,7 +732,7 @@ public static string GetString(uint strId)
# Extract the localized "Please wait..." string from shell32.dll # Extract the localized "Please wait..." string from shell32.dll
Write-Verbose -Message ([WinAPI.GetStr]::GetString(12612)) -Verbose Write-Verbose -Message ([WinAPI.GetStr]::GetString(12612)) -Verbose
# Check if hosts contains any of string from $IPArray array # Check whether hosts contains any of string from $IPArray array
if ((Get-Content -Path "$env:SystemRoot\System32\drivers\etc\hosts" -Encoding Default -Force | ForEach-Object -Process {$_.Trim()} | ForEach-Object -Process { if ((Get-Content -Path "$env:SystemRoot\System32\drivers\etc\hosts" -Encoding Default -Force | ForEach-Object -Process {$_.Trim()} | ForEach-Object -Process {
($_ -ne "") -and ($_ -ne " ") -and (-not $_.StartsWith("#")) -and ($IPArray -split "`r?`n" | Select-String -Pattern $_) ($_ -ne "") -and ($_ -ne " ") -and (-not $_.StartsWith("#")) -and ($IPArray -split "`r?`n" | Select-String -Pattern $_)
}) -contains $true) }) -contains $true)
@ -4505,7 +4517,7 @@ function OneDrive
return return
} }
# Check if user is logged into OneDrive (Microsoft account) # Check whether user is logged into OneDrive (Microsoft account)
$UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore $UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore
if ($UserEmail) if ($UserEmail)
{ {
@ -7750,7 +7762,7 @@ function WinPrtScrFolder
$Default $Default
) )
# Check if user is logged into OneDrive (Microsoft account) # Check whether user is logged into OneDrive (Microsoft account)
$UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore $UserEmail = Get-ItemProperty -Path HKCU:\Software\Microsoft\OneDrive\Accounts\Personal -Name UserEmail -ErrorAction Ignore
if ($UserEmail) if ($UserEmail)
{ {
@ -7832,7 +7844,7 @@ function WinPrtScrFolder
RecommendedTroubleshooting -Default RecommendedTroubleshooting -Default
.NOTES .NOTES
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data" and the error reporting feature will be turned on In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data" and the error reporting feature will be turned on
.NOTES .NOTES
Machine-wide Machine-wide
@ -7876,7 +7888,7 @@ function RecommendedTroubleshooting
} }
} }
# Set the OS level of diagnostic data gathering to "Optional diagnostic data" # Set Windows level of diagnostic data gathering to "Optional diagnostic data"
if (-not (Test-Path -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack)) if (-not (Test-Path -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack))
{ {
New-Item -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack -Force New-Item -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack -Force
@ -9921,7 +9933,7 @@ function Install-WSA
return return
} }
# Check if Windows 11 is installed on an SSD # Check whether Windows 11 is installed on an SSD
$DiskNumber = (Get-Disk | Where-Object -FilterScript {$_.Isboot -and $_.IsSystem -and ($_.OperationalStatus -eq "Online")}).Number $DiskNumber = (Get-Disk | Where-Object -FilterScript {$_.Isboot -and $_.IsSystem -and ($_.OperationalStatus -eq "Online")}).Number
if (Get-PhysicalDisk -DeviceNumber $DiskNumber | Where-Object -FilterScript {$_.MediaType -ne "SSD"}) if (Get-PhysicalDisk -DeviceNumber $DiskNumber | Where-Object -FilterScript {$_.MediaType -ne "SSD"})
{ {
@ -11766,7 +11778,7 @@ function CleanupTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName "Windows Cleanup" -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName "Windows Cleanup" -ErrorAction Ignore)
{ {
# Also we can parse "$env:SystemRoot\System32\Tasks\Sophia\Windows Cleanup" to check if the task was created # Also we can parse "$env:SystemRoot\System32\Tasks\Sophia\Windows Cleanup" to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Windows Cleanup"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Windows Cleanup"} | Foreach-Object {
@ -12191,7 +12203,7 @@ function SoftwareDistributionTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName SoftwareDistribution -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName SoftwareDistribution -ErrorAction Ignore)
{ {
# Also we can parse $env:SystemRoot\System32\Tasks\Sophia\SoftwareDistribution to check if the task was created # Also we can parse $env:SystemRoot\System32\Tasks\Sophia\SoftwareDistribution to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "SoftwareDistribution"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "SoftwareDistribution"} | Foreach-Object {
@ -12495,7 +12507,7 @@ function TempTask
# Checking if we're trying to create the task when it was already created as another user # Checking if we're trying to create the task when it was already created as another user
if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName Temp -ErrorAction Ignore) if (Get-ScheduledTask -TaskPath "\Sophia\" -TaskName Temp -ErrorAction Ignore)
{ {
# Also we can parse $env:SystemRoot\System32\Tasks\Sophia\Temp to check if the task was created # Also we can parse $env:SystemRoot\System32\Tasks\Sophia\Temp to Check whether the task was created
$ScheduleService = New-Object -ComObject Schedule.Service $ScheduleService = New-Object -ComObject Schedule.Service
$ScheduleService.Connect() $ScheduleService.Connect()
$ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Temp"} | Foreach-Object { $ScheduleService.GetFolder("\Sophia").GetTasks(0) | Where-Object -FilterScript {$_.Name -eq "Temp"} | Foreach-Object {
@ -14465,11 +14477,11 @@ function OpenWindowsTerminalAdminContext
if if
( (
# Check if it is not blocked by policy # Check whether it is not blocked by policy
(-not (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" -Name "{9F156763-7844-4DC4-B2B1-901F640F5155}" -ErrorAction Ignore)) -and (-not (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" -Name "{9F156763-7844-4DC4-B2B1-901F640F5155}" -ErrorAction Ignore)) -and
# Check if the package installed # Check whether the package installed
(Get-AppxPackage -Name Microsoft.WindowsTerminal) -and (Get-AppxPackage -Name Microsoft.WindowsTerminal) -and
# Check if Windows Terminal version is greater or equal than 1.11 # Check whether Windows Terminal version is greater or equal than 1.11
([System.Version](Get-AppxPackage -Name Microsoft.WindowsTerminal).Version -ge [System.Version]"1.11") ([System.Version](Get-AppxPackage -Name Microsoft.WindowsTerminal).Version -ge [System.Version]"1.11")
) )
{ {
@ -14626,7 +14638,7 @@ function UpdateLGPEPolicies
{ {
foreach ($Item in $Path.Property) foreach ($Item in $Path.Property)
{ {
# Check if property isn't equal to "(default)" and exists # Check whether property isn't equal to "(default)" and exists
if (($null -ne $Item) -and ($Item -ne "(default)")) if (($null -ne $Item) -and ($Item -ne "(default)"))
{ {
# Where all ADMX templates are located to compare with # Where all ADMX templates are located to compare with
@ -14684,7 +14696,7 @@ function UpdateLGPEPolicies
{ {
foreach ($Item in $Path.Property) foreach ($Item in $Path.Property)
{ {
# Check if property isn't equal to "(default)" and exists # Check whether property isn't equal to "(default)" and exists
if (($null -ne $Item) -and ($Item -ne "(default)")) if (($null -ne $Item) -and ($Item -ne "(default)"))
{ {
# Where all ADMX templates are located to compare with # Where all ADMX templates are located to compare with
@ -14844,7 +14856,7 @@ public static void PostMessage()
} }
} }
# Check if any of scheduled tasks were created. Unless open Task Scheduler # Check whether any of scheduled tasks were created. Unless open Task Scheduler
if ($Script:ScheduledTasks) if ($Script:ScheduledTasks)
{ {
# Find and close taskschd.msc by its' argument # Find and close taskschd.msc by its' argument

4
src/Sophia_Script_for_Windows_11_PowerShell_7/Sophia.ps1

@ -799,7 +799,7 @@ WinPrtScrFolder -Desktop
<# <#
Run troubleshooter automatically, then notify me Run troubleshooter automatically, then notify me
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data", and the error reporting feature will be turned on In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data", and the error reporting feature will be turned on
Автоматически запускать средства устранения неполадок, а затем уведомлять Автоматически запускать средства устранения неполадок, а затем уведомлять
Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows
@ -808,7 +808,7 @@ RecommendedTroubleshooting -Automatically
<# <#
Ask me before running troubleshooter (default value) Ask me before running troubleshooter (default value)
In order this feature to work the OS level of diagnostic data gathering will be set to "Optional diagnostic data" In order this feature to work Windows level of diagnostic data gathering will be set to "Optional diagnostic data"
Спрашивать перед запуском средств устранения неполадок (значение по умолчанию) Спрашивать перед запуском средств устранения неполадок (значение по умолчанию)
Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows Чтобы заработала данная функция, уровень сбора диагностических данных ОС будет установлен на "Необязательные диагностические данные" и включится создание отчетов об ошибках Windows

Loading…
Cancel
Save