Browse Source

Code refactoring

master
Dmitry Nefedov 2 months ago
parent
commit
cf1de99d53
  1. 19
      Wrapper/Config/config_Windows_10.json
  2. 3
      Wrapper/Config/config_Windows_10_LTSC.json
  3. 3
      Wrapper/Config/config_Windows_11.json
  4. 4
      Wrapper/Localizations/de-DE/tooltip_Windows_10.json
  5. 4
      Wrapper/Localizations/de-DE/tooltip_Windows_11.json
  6. 4
      Wrapper/Localizations/en-US/tooltip_Windows_10.json
  7. 4
      Wrapper/Localizations/en-US/tooltip_Windows_11.json
  8. 4
      Wrapper/Localizations/ru-RU/tooltip_Windows_10.json
  9. 4
      Wrapper/Localizations/ru-RU/tooltip_Windows_11.json
  10. BIN
      Wrapper/SophiaScriptWrapper.exe
  11. 5
      src/Sophia_Script_for_Windows_10/Functions.ps1
  12. 219
      src/Sophia_Script_for_Windows_10/Module/Sophia.psm1
  13. 20
      src/Sophia_Script_for_Windows_10/Sophia.ps1
  14. 3
      src/Sophia_Script_for_Windows_10_LTSC_2019/Functions.ps1
  15. 158
      src/Sophia_Script_for_Windows_10_LTSC_2019/Module/Sophia.psm1
  16. 12
      src/Sophia_Script_for_Windows_10_LTSC_2019/Sophia.ps1
  17. 3
      src/Sophia_Script_for_Windows_10_LTSC_2021/Functions.ps1
  18. 157
      src/Sophia_Script_for_Windows_10_LTSC_2021/Module/Sophia.psm1
  19. 12
      src/Sophia_Script_for_Windows_10_LTSC_2021/Sophia.ps1
  20. 3
      src/Sophia_Script_for_Windows_10_PowerShell_7/Functions.ps1
  21. 219
      src/Sophia_Script_for_Windows_10_PowerShell_7/Module/Sophia.psm1
  22. 20
      src/Sophia_Script_for_Windows_10_PowerShell_7/Sophia.ps1
  23. 3
      src/Sophia_Script_for_Windows_11/Functions.ps1
  24. 167
      src/Sophia_Script_for_Windows_11/Module/Sophia.psm1
  25. 12
      src/Sophia_Script_for_Windows_11/Sophia.ps1
  26. 3
      src/Sophia_Script_for_Windows_11_PowerShell_7/Functions.ps1
  27. 164
      src/Sophia_Script_for_Windows_11_PowerShell_7/Module/Sophia.psm1
  28. 12
      src/Sophia_Script_for_Windows_11_PowerShell_7/Sophia.ps1

19
Wrapper/Config/config_Windows_10.json

@ -1634,9 +1634,6 @@
"Zero": { "Zero": {
"Tag": "NET6x64" "Tag": "NET6x64"
}, },
"One": {
"Tag": "NET7x64"
},
"Two": { "Two": {
"Tag": "NET8x64" "Tag": "NET8x64"
} }
@ -2279,22 +2276,6 @@
"Preset": "", "Preset": "",
"WindowsDefault": "One" "WindowsDefault": "One"
}, },
{
"Region": "Context menu",
"Control": "cmb",
"Required": "false",
"Function": "ImagesEditContext",
"Arg": {
"Zero": {
"Tag": "Hide"
},
"One": {
"Tag": "Show"
}
},
"Preset": "Zero",
"WindowsDefault": "One"
},
{ {
"Region": "Context menu", "Region": "Context menu",
"Control": "cmb", "Control": "cmb",

3
Wrapper/Config/config_Windows_10_LTSC.json

@ -1561,9 +1561,6 @@
"Zero": { "Zero": {
"Tag": "NET6x64" "Tag": "NET6x64"
}, },
"One": {
"Tag": "NET7x64"
},
"Two": { "Two": {
"Tag": "NET8x64" "Tag": "NET8x64"
} }

3
Wrapper/Config/config_Windows_11.json

@ -1560,9 +1560,6 @@
"Zero": { "Zero": {
"Tag": "NET6x64" "Tag": "NET6x64"
}, },
"One": {
"Tag": "NET7x64"
},
"Two": { "Two": {
"Tag": "NET8x64" "Tag": "NET8x64"
} }

4
Wrapper/Localizations/de-DE/tooltip_Windows_10.json

@ -1441,10 +1441,6 @@
"Tag": "NET6x64", "Tag": "NET6x64",
"ToolTip": ".NET Desktop Runtime 6 x64." "ToolTip": ".NET Desktop Runtime 6 x64."
}, },
"One": {
"Tag": "NET7x64",
"ToolTip": ".NET Desktop Runtime 7 x64."
},
"Two": { "Two": {
"Tag": "NET8x64", "Tag": "NET8x64",
"ToolTip": ".NET Desktop Runtime 8 x64." "ToolTip": ".NET Desktop Runtime 8 x64."

4
Wrapper/Localizations/de-DE/tooltip_Windows_11.json

@ -1379,10 +1379,6 @@
"Tag": "NET6x64", "Tag": "NET6x64",
"ToolTip": ".NET Desktop Runtime 6 x64." "ToolTip": ".NET Desktop Runtime 6 x64."
}, },
"One": {
"Tag": "NET7x64",
"ToolTip": ".NET Desktop Runtime 7 x64."
},
"Two": { "Two": {
"Tag": "NET8x64", "Tag": "NET8x64",
"ToolTip": ".NET Desktop Runtime 8 x64." "ToolTip": ".NET Desktop Runtime 8 x64."

4
Wrapper/Localizations/en-US/tooltip_Windows_10.json

@ -1441,10 +1441,6 @@
"Tag": "NET6x64", "Tag": "NET6x64",
"ToolTip": ".NET Desktop Runtime 6 x64." "ToolTip": ".NET Desktop Runtime 6 x64."
}, },
"One": {
"Tag": "NET7x64",
"ToolTip": ".NET Desktop Runtime 7 x64."
},
"Two": { "Two": {
"Tag": "NET8x64", "Tag": "NET8x64",
"ToolTip": ".NET Desktop Runtime 8 x64." "ToolTip": ".NET Desktop Runtime 8 x64."

4
Wrapper/Localizations/en-US/tooltip_Windows_11.json

@ -1379,10 +1379,6 @@
"Tag": "NET6x64", "Tag": "NET6x64",
"ToolTip": ".NET Desktop Runtime 6 x64." "ToolTip": ".NET Desktop Runtime 6 x64."
}, },
"One": {
"Tag": "NET7x64",
"ToolTip": ".NET Desktop Runtime 7 x64."
},
"Two": { "Two": {
"Tag": "NET8x64", "Tag": "NET8x64",
"ToolTip": ".NET Desktop Runtime 8 x64." "ToolTip": ".NET Desktop Runtime 8 x64."

4
Wrapper/Localizations/ru-RU/tooltip_Windows_10.json

@ -1441,10 +1441,6 @@
"Tag": "NET6x64", "Tag": "NET6x64",
"ToolTip": ".NET Desktop Runtime 6 x64." "ToolTip": ".NET Desktop Runtime 6 x64."
}, },
"One": {
"Tag": "NET7x64",
"ToolTip": ".NET Desktop Runtime 7 x64."
},
"Two": { "Two": {
"Tag": "NET8x64", "Tag": "NET8x64",
"ToolTip": ".NET Desktop Runtime 8 x64." "ToolTip": ".NET Desktop Runtime 8 x64."

4
Wrapper/Localizations/ru-RU/tooltip_Windows_11.json

@ -1379,10 +1379,6 @@
"Tag": "NET6x64", "Tag": "NET6x64",
"ToolTip": ".NET Desktop Runtime 6 x64." "ToolTip": ".NET Desktop Runtime 6 x64."
}, },
"One": {
"Tag": "NET7x64",
"ToolTip": ".NET Desktop Runtime 7 x64."
},
"Two": { "Two": {
"Tag": "NET8x64", "Tag": "NET8x64",
"ToolTip": ".NET Desktop Runtime 8 x64." "ToolTip": ".NET Desktop Runtime 8 x64."

BIN
Wrapper/SophiaScriptWrapper.exe

Binary file not shown.

5
src/Sophia_Script_for_Windows_10/Functions.ps1

@ -5,8 +5,7 @@
Version: v5.18.2 Version: v5.18.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved
@ -195,7 +194,7 @@ $Parameters = @{
continue continue
} }
# If a module command is UserFolders ### # If a module command is UserFolders
if ($Command -eq "UserFolders") if ($Command -eq "UserFolders")
{ {
# Get all command arguments, excluding defaults # Get all command arguments, excluding defaults

219
src/Sophia_Script_for_Windows_10/Module/Sophia.psm1

@ -5,8 +5,7 @@
Version: v5.18.2 Version: v5.18.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved
@ -36,6 +35,7 @@
.LINK Authors .LINK Authors
https://github.com/farag2 https://github.com/farag2
https://github.com/Inestic https://github.com/Inestic
https://github.com/lowl1f3
#> #>
#region InitialActions #region InitialActions
@ -64,6 +64,7 @@ function InitialActions
# Extract strings from %SystemRoot%\System32\shell32.dll using its' number # Extract strings from %SystemRoot%\System32\shell32.dll using its' number
# https://github.com/SamuelArnold/StarKill3r/blob/master/Star%20Killer/Star%20Killer/bin/Debug/Scripts/SANS-SEC505-master/scripts/Day1-PowerShell/Expand-IndirectString.ps1 # https://github.com/SamuelArnold/StarKill3r/blob/master/Star%20Killer/Star%20Killer/bin/Debug/Scripts/SANS-SEC505-master/scripts/Day1-PowerShell/Expand-IndirectString.ps1
# [WinAPI.GetStrings]::GetIndirectString("@%SystemRoot%\system32\schedsvc.dll,-100")
$Signature = @{ $Signature = @{
Namespace = "WinAPI" Namespace = "WinAPI"
Name = "GetStrings" Name = "GetStrings"
@ -841,33 +842,6 @@ public static extern bool SetForegroundWindow(IntPtr hWnd);
Write-Error -Message ($Localization.RestartFunction -f $MyInvocation.Line.Trim()) -ErrorAction SilentlyContinue Write-Error -Message ($Localization.RestartFunction -f $MyInvocation.Line.Trim()) -ErrorAction SilentlyContinue
} }
# Register a temp schedule task to check whether there's a Windows bug presented
$Action = New-ScheduledTaskAction -Execute powershell.exe
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest
$Parameters = @{
TaskName = "SophiaTempScheduledTask"
Principal = $Principal
Action = $Action
Settings = $Settings
}
try
{
Register-ScheduledTask @Parameters -Force -ErrorAction Stop
}
catch [Microsoft.Management.Infrastructure.CimException]
{
Write-Verbose -Message ($Localization.WindowsComponentBroken -f [WinAPI.GetStrings]::GetIndirectString("@%SystemRoot%\system32\schedsvc.dll,-100")) -Verbose
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Remove temp schedule task
Unregister-ScheduledTask -TaskName SophiaTempScheduledTask -Confirm:$false -ErrorAction Ignore
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\Computer.txt", "$env:TEMP\User.txt" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\Computer.txt", "$env:TEMP\User.txt" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
@ -5648,10 +5622,12 @@ Unregister-ScheduledTask -TaskName SymbolicLink -Confirm:`$false
"@ "@
# Create a temporary scheduled task to create a symbolic link to the %SystemDrive%\Temp folder # Create a temporary scheduled task to create a symbolic link to the %SystemDrive%\Temp folder
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $SymbolicLinkTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $SymbolicLinkTask"
$Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME $Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "SymbolicLink" TaskName = "SymbolicLink"
Principal = $Principal Principal = $Principal
@ -5770,10 +5746,12 @@ Unregister-ScheduledTask -TaskName TemporaryTask -Confirm:`$false
"@ "@
# Create a temporary scheduled task to clean up the temporary folder # Create a temporary scheduled task to clean up the temporary folder
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $TempFolderCleanupTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $TempFolderCleanupTask"
$Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME $Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "TemporaryTask" TaskName = "TemporaryTask"
Principal = $Principal Principal = $Principal
@ -10213,15 +10191,18 @@ function InstallVCRedist
return return
} }
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/VCRedist/2015%2B if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
winget install --id=Microsoft.VCRedist.2015+.x86 --exact --force --accept-source-agreements {
winget install --id=Microsoft.VCRedist.2015+.x64 --exact --force --accept-source-agreements # https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/VCRedist/2015%2B
winget install --id=Microsoft.VCRedist.2015+.x86 --exact --force --accept-source-agreements
winget install --id=Microsoft.VCRedist.2015+.x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -10268,10 +10249,10 @@ function InstallVCRedist
<# <#
.SYNOPSIS .SYNOPSIS
Install the latest .NET Desktop Runtime 6, 7, 8 x64 Install the latest .NET Desktop Runtime 6, 8 x64
.EXAMPLE .EXAMPLE
InstallDotNetRuntimes -Runtimes NET6x64, NET7x64, NET8x64 InstallDotNetRuntimes -Runtimes NET6x64, NET8x64
.LINK .LINK
https://dotnet.microsoft.com/en-us/download/dotnet https://dotnet.microsoft.com/en-us/download/dotnet
@ -10288,7 +10269,7 @@ function InstallDotNetRuntimes
Mandatory = $true, Mandatory = $true,
ParameterSetName = "Runtimes" ParameterSetName = "Runtimes"
)] )]
[ValidateSet("NET6x64", "NET7x64", "NET8x64")] [ValidateSet("NET6x64", "NET8x64")]
[string[]] [string[]]
$Runtimes $Runtimes
) )
@ -10321,15 +10302,18 @@ function InstallDotNetRuntimes
{ {
NET6x64 NET6x64
{ {
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/6 if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
# .NET Desktop Runtime 6 x64 {
winget install --id=Microsoft.DotNet.DesktopRuntime.6 --architecture x64 --exact --force --accept-source-agreements # https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/6
# .NET Desktop Runtime 6 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.6 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -10363,60 +10347,19 @@ function InstallDotNetRuntimes
Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
} }
} }
NET7x64
{
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17")
{
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/7
# .NET Desktop Runtime 7 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.7 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
else
{
# .NET Desktop Runtime 7
# https://github.com/dotnet/core/blob/main/release-notes/releases-index.json
$Parameters = @{
Uri = "https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/7.0/releases.json"
Verbose = $true
UseBasicParsing = $true
}
$LatestRelease = (Invoke-RestMethod @Parameters)."latest-release"
$DownloadsFolder = Get-ItemPropertyValue -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" -Name "{374DE290-123F-4565-9164-39C4925E467B}"
# .NET Desktop Runtime 7 x64
$Parameters = @{
Uri = "https://dotnetcli.azureedge.net/dotnet/Runtime/$LatestRelease/dotnet-runtime-$LatestRelease-win-x64.exe"
OutFile = "$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe"
UseBasicParsing = $true
Verbose = $true
}
Invoke-WebRequest @Parameters
Start-Process -FilePath "$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe" -ArgumentList "/install /passive /norestart" -Wait
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070
$Paths = @(
"$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe",
"$env:TEMP\Microsoft_.NET_Runtime*.log"
)
Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
}
NET8x64 NET8x64
{ {
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# .NET Desktop Runtime 8 x64 if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
winget install --id=Microsoft.DotNet.DesktopRuntime.8 --architecture x64 --exact --force --accept-source-agreements {
# .NET Desktop Runtime 8 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.8 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -11550,7 +11493,7 @@ function UninstallUWPApps
[PSCustomObject]@{ [PSCustomObject]@{
Name = $AppxPackage.Name Name = $AppxPackage.Name
PackageFullName = $AppxPackage.PackageFullName PackageFullName = $AppxPackage.PackageFullName
# Sometimes there's more than one package presented in Windows with the same package name like {Microsoft Teams, Microsoft Teams} and we need to display one the first one a window # Sometimes there's more than one package presented in Windows with the same package name like {Microsoft Teams, Microsoft Teams} and we need to display the first one
DisplayName = $PackageId.DisplayName | Select-Object -First 1 DisplayName = $PackageId.DisplayName | Select-Object -First 1
} }
} }
@ -12825,10 +12768,12 @@ public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
`$Process.Start() | Out-Null `$Process.Start() | Out-Null
"@ "@
# Create the "Windows Cleanup" task # Create "Windows Cleanup" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $CleanupTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $CleanupTask"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "Windows Cleanup" TaskName = "Windows Cleanup"
TaskPath = "Sophia" TaskPath = "Sophia"
@ -12976,9 +12921,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" -Value $ToastNotification -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" -Value $ToastNotification -Encoding Default -Force
# Create the "Windows Cleanup Notification" task # Create the "Windows Cleanup Notification" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 30 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 30 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "Windows Cleanup Notification" TaskName = "Windows Cleanup Notification"
@ -13286,9 +13233,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" -Value $SoftwareDistributionTask -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" -Value $SoftwareDistributionTask -Encoding Default -Force
# Create the "SoftwareDistribution" task # Create the "SoftwareDistribution" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "SoftwareDistribution" TaskName = "SoftwareDistribution"
@ -13603,9 +13552,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" -Value $TempTask -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" -Value $TempTask -Encoding Default -Force
# Create the "Temp" task # Create the "Temp" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 60 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 60 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "Temp" TaskName = "Temp"
@ -14723,66 +14674,6 @@ function EditWithPaint3DContext
} }
} }
<#
.SYNOPSIS
The "Edit" item in the images context menu
.PARAMETER Hide
Hide the "Edit" item from the images context menu
.PARAMETER Show
Show the "Edit" item in the images context menu
.EXAMPLE
ImagesEditContext -Hide
.EXAMPLE
ImagesEditContext -Show
.NOTES
Current user
#>
function ImagesEditContext
{
param
(
[Parameter(
Mandatory = $true,
ParameterSetName = "Hide"
)]
[switch]
$Hide,
[Parameter(
Mandatory = $true,
ParameterSetName = "Show"
)]
[switch]
$Show
)
if (-not ((Get-WindowsCapability -Online -Name "Microsoft.Windows.MSPaint*").State -eq "Installed"))
{
return
}
switch ($PSCmdlet.ParameterSetName)
{
"Hide"
{
if (-not (Test-Path -Path Registry::HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\edit))
{
New-Item -Path Registry::HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\edit -Force
}
New-ItemProperty -Path Registry::HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\edit -Name ProgrammaticAccessOnly -PropertyType String -Value "" -Force
}
"Show"
{
Remove-ItemProperty -Path Registry::HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\edit -Name ProgrammaticAccessOnly -Force -ErrorAction Ignore
}
}
}
<# <#
.SYNOPSIS .SYNOPSIS
The "Print" item in the .bat and .cmd context menu The "Print" item in the .bat and .cmd context menu

20
src/Sophia_Script_for_Windows_10/Sophia.ps1

@ -5,8 +5,7 @@
Version: v5.18.2 Version: v5.18.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved
@ -55,6 +54,7 @@
.LINK Authors .LINK Authors
https://github.com/farag2 https://github.com/farag2
https://github.com/Inestic https://github.com/Inestic
https://github.com/lowl1f3
#> #>
#Requires -RunAsAdministrator #Requires -RunAsAdministrator
@ -70,7 +70,7 @@ param
Clear-Host Clear-Host
$Host.UI.RawUI.WindowTitle = "Sophia Script for Windows 10 v5.18.2 | Made with $([System.Char]::ConvertFromUtf32(0x1F497)) of Windows | $([System.Char]0x00A9) farag & Inestic, 2014$([System.Char]0x2013)2024" $Host.UI.RawUI.WindowTitle = "Sophia Script for Windows 10 v5.18.2 | Made with $([System.Char]::ConvertFromUtf32(0x1F497)) of Windows | $([System.Char]0x00A9) farag, Inestic & lowl1f3, 2014$([System.Char]0x2013)2024"
Remove-Module -Name Sophia -Force -ErrorAction Ignore Remove-Module -Name Sophia -Force -ErrorAction Ignore
Import-LocalizedData -BindingVariable Global:Localization -BaseDirectory $PSScriptRoot\Localizations -FileName Sophia Import-LocalizedData -BindingVariable Global:Localization -BaseDirectory $PSScriptRoot\Localizations -FileName Sophia
@ -1007,12 +1007,12 @@ UninstallPCHealthCheck
InstallVCRedist InstallVCRedist
<# <#
Install the latest .NET Desktop Runtime 6, 7, 8 x64 Install the latest .NET Desktop Runtime 6, 8 x64
Установить последнюю версию .NET Desktop Runtime 6, 7, 8 x64 Установить последнюю версию .NET Desktop Runtime 6, 8 x64
https://dotnet.microsoft.com/en-us/download/dotnet https://dotnet.microsoft.com/en-us/download/dotnet
#> #>
InstallDotNetRuntimes -Runtimes NET6x64, NET7x64, NET8x64 InstallDotNetRuntimes -Runtimes NET6x64, NET8x64
# Enable proxying only blocked sites from the unified registry of Roskomnadzor. The function is applicable for Russia only # Enable proxying only blocked sites from the unified registry of Roskomnadzor. The function is applicable for Russia only
# Включить проксирование только заблокированных сайтов из единого реестра Роскомнадзора. Функция применима только для России # Включить проксирование только заблокированных сайтов из единого реестра Роскомнадзора. Функция применима только для России
@ -1389,14 +1389,6 @@ EditWithPaint3DContext -Hide
# Отобразить пункт "Изменить с помощью Paint 3D" в контекстном меню медиа-файлов (значение по умолчанию) # Отобразить пункт "Изменить с помощью Paint 3D" в контекстном меню медиа-файлов (значение по умолчанию)
# EditWithPaint3DContext -Show # EditWithPaint3DContext -Show
# Hide the "Edit" item from the images context menu
# Скрыть пункт "Изменить" из контекстного меню изображений
ImagesEditContext -Hide
# Show the "Edit" item in images context menu (default value)
# Отобразить пункт "Изменить" в контекстном меню изображений (значение по умолчанию)
# ImagesEditContext -Show
# Hide the "Print" item from the .bat and .cmd context menu # Hide the "Print" item from the .bat and .cmd context menu
# Скрыть пункт "Печать" из контекстного меню .bat и .cmd файлов # Скрыть пункт "Печать" из контекстного меню .bat и .cmd файлов
PrintCMDContext -Hide PrintCMDContext -Hide

3
src/Sophia_Script_for_Windows_10_LTSC_2019/Functions.ps1

@ -5,8 +5,7 @@
Version: v5.8.2 Version: v5.8.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved

158
src/Sophia_Script_for_Windows_10_LTSC_2019/Module/Sophia.psm1

@ -5,8 +5,7 @@
Version: v5.8.2 Version: v5.8.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved
@ -36,6 +35,7 @@
.LINK Authors .LINK Authors
https://github.com/farag2 https://github.com/farag2
https://github.com/Inestic https://github.com/Inestic
https://github.com/lowl1f3
#> #>
#region InitialActions #region InitialActions
@ -64,6 +64,7 @@ function InitialActions
# Extract strings from %SystemRoot%\System32\shell32.dll using its' number # Extract strings from %SystemRoot%\System32\shell32.dll using its' number
# https://github.com/SamuelArnold/StarKill3r/blob/master/Star%20Killer/Star%20Killer/bin/Debug/Scripts/SANS-SEC505-master/scripts/Day1-PowerShell/Expand-IndirectString.ps1 # https://github.com/SamuelArnold/StarKill3r/blob/master/Star%20Killer/Star%20Killer/bin/Debug/Scripts/SANS-SEC505-master/scripts/Day1-PowerShell/Expand-IndirectString.ps1
# [WinAPI.GetStrings]::GetIndirectString("@%SystemRoot%\system32\schedsvc.dll,-100")
$Signature = @{ $Signature = @{
Namespace = "WinAPI" Namespace = "WinAPI"
Name = "GetStrings" Name = "GetStrings"
@ -812,33 +813,6 @@ public static extern bool SetForegroundWindow(IntPtr hWnd);
Write-Error -Message ($Localization.RestartFunction -f $MyInvocation.Line.Trim()) -ErrorAction SilentlyContinue Write-Error -Message ($Localization.RestartFunction -f $MyInvocation.Line.Trim()) -ErrorAction SilentlyContinue
} }
# Register a temp schedule task to check whether there's a Windows bug presented
$Action = New-ScheduledTaskAction -Execute powershell.exe
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest
$Parameters = @{
TaskName = "SophiaTempScheduledTask"
Principal = $Principal
Action = $Action
Settings = $Settings
}
try
{
Register-ScheduledTask @Parameters -Force -ErrorAction Stop
}
catch [Microsoft.Management.Infrastructure.CimException]
{
Write-Verbose -Message ($Localization.WindowsComponentBroken -f [WinAPI.GetStrings]::GetIndirectString("@%SystemRoot%\system32\schedsvc.dll,-100")) -Verbose
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Remove temp schedule task
Unregister-ScheduledTask -TaskName SophiaTempScheduledTask -Confirm:$false -ErrorAction Ignore
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\Computer.txt", "$env:TEMP\User.txt" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\Computer.txt", "$env:TEMP\User.txt" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
@ -4373,10 +4347,12 @@ Unregister-ScheduledTask -TaskName SymbolicLink -Confirm:`$false
"@ "@
# Create a temporary scheduled task to create a symbolic link to the %SystemDrive%\Temp folder # Create a temporary scheduled task to create a symbolic link to the %SystemDrive%\Temp folder
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $SymbolicLinkTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $SymbolicLinkTask"
$Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME $Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "SymbolicLink" TaskName = "SymbolicLink"
Principal = $Principal Principal = $Principal
@ -4495,10 +4471,12 @@ Unregister-ScheduledTask -TaskName TemporaryTask -Confirm:`$false
"@ "@
# Create a temporary scheduled task to clean up the temporary folder # Create a temporary scheduled task to clean up the temporary folder
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $TempFolderCleanupTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $TempFolderCleanupTask"
$Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME $Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "TemporaryTask" TaskName = "TemporaryTask"
Principal = $Principal Principal = $Principal
@ -8526,15 +8504,18 @@ function InstallVCRedist
return return
} }
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/VCRedist/2015%2B if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
winget install --id=Microsoft.VCRedist.2015+.x86 --exact --force --accept-source-agreements {
winget install --id=Microsoft.VCRedist.2015+.x64 --exact --force --accept-source-agreements # https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/VCRedist/2015%2B
winget install --id=Microsoft.VCRedist.2015+.x86 --exact --force --accept-source-agreements
winget install --id=Microsoft.VCRedist.2015+.x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -8581,10 +8562,10 @@ function InstallVCRedist
<# <#
.SYNOPSIS .SYNOPSIS
Install the latest .NET Desktop Runtime 6, 7, 8 x64 Install the latest .NET Desktop Runtime 6, 8 x64
.EXAMPLE .EXAMPLE
InstallDotNetRuntimes -Runtimes NET6x64, NET7x64, NET8x64 InstallDotNetRuntimes -Runtimes NET6x64, NET8x64
.LINK .LINK
https://dotnet.microsoft.com/en-us/download/dotnet https://dotnet.microsoft.com/en-us/download/dotnet
@ -8601,7 +8582,7 @@ function InstallDotNetRuntimes
Mandatory = $true, Mandatory = $true,
ParameterSetName = "Runtimes" ParameterSetName = "Runtimes"
)] )]
[ValidateSet("NET6x64", "NET7x64", "NET8x64")] [ValidateSet("NET6x64", "NET8x64")]
[string[]] [string[]]
$Runtimes $Runtimes
) )
@ -8634,15 +8615,18 @@ function InstallDotNetRuntimes
{ {
NET6x64 NET6x64
{ {
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/6 if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
# .NET Desktop Runtime 6 x64 {
winget install --id=Microsoft.DotNet.DesktopRuntime.6 --architecture x64 --exact --force --accept-source-agreements # https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/6
# .NET Desktop Runtime 6 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.6 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -8676,61 +8660,19 @@ function InstallDotNetRuntimes
Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
} }
} }
NET7x64
{
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17")
{
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/7
# .NET Desktop Runtime 7 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.7 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
else
{
# .NET Desktop Runtime 7
# https://github.com/dotnet/core/blob/main/release-notes/releases-index.json
$Parameters = @{
Uri = "https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/7.0/releases.json"
Verbose = $true
UseBasicParsing = $true
}
$LatestRelease = (Invoke-RestMethod @Parameters)."latest-release"
$DownloadsFolder = Get-ItemPropertyValue -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" -Name "{374DE290-123F-4565-9164-39C4925E467B}"
# .NET Desktop Runtime 7 x64
$Parameters = @{
Uri = "https://dotnetcli.azureedge.net/dotnet/Runtime/$LatestRelease/dotnet-runtime-$LatestRelease-win-x64.exe"
OutFile = "$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe"
UseBasicParsing = $true
Verbose = $true
}
Invoke-WebRequest @Parameters
Start-Process -FilePath "$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe" -ArgumentList "/install /passive /norestart" -Wait
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070
$Paths = @(
"$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe",
"$env:TEMP\Microsoft_.NET_Runtime*.log"
)
Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
}
NET8x64 NET8x64
{ {
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# .NET Desktop Runtime 8 x64 if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
winget install --id=Microsoft.DotNet.DesktopRuntime.8 --architecture x64 --exact --force --accept-source-agreements {
# .NET Desktop Runtime 8 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.8 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -9438,10 +9380,12 @@ public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
`$Process.Start() | Out-Null `$Process.Start() | Out-Null
"@ "@
# Create the "Windows Cleanup" task # Create "Windows Cleanup" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $CleanupTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $CleanupTask"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "Windows Cleanup" TaskName = "Windows Cleanup"
TaskPath = "Sophia" TaskPath = "Sophia"
@ -9589,9 +9533,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" -Value $ToastNotification -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" -Value $ToastNotification -Encoding Default -Force
# Create the "Windows Cleanup Notification" task # Create the "Windows Cleanup Notification" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 30 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 30 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "Windows Cleanup Notification" TaskName = "Windows Cleanup Notification"
@ -9899,9 +9845,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" -Value $SoftwareDistributionTask -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" -Value $SoftwareDistributionTask -Encoding Default -Force
# Create the "SoftwareDistribution" task # Create the "SoftwareDistribution" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "SoftwareDistribution" TaskName = "SoftwareDistribution"
@ -10216,9 +10164,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" -Value $TempTask -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" -Value $TempTask -Encoding Default -Force
# Create the "Temp" task # Create the "Temp" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 60 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 60 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "Temp" TaskName = "Temp"

12
src/Sophia_Script_for_Windows_10_LTSC_2019/Sophia.ps1

@ -5,8 +5,7 @@
Version: v5.8.2 Version: v5.8.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved
@ -55,6 +54,7 @@
.LINK Authors .LINK Authors
https://github.com/farag2 https://github.com/farag2
https://github.com/Inestic https://github.com/Inestic
https://github.com/lowl1f3
#> #>
#Requires -RunAsAdministrator #Requires -RunAsAdministrator
@ -70,7 +70,7 @@ param
Clear-Host Clear-Host
$Host.UI.RawUI.WindowTitle = "Sophia Script for Windows 10 LTSC 2019 v5.8.2 | Made with $([System.Char]::ConvertFromUtf32(0x1F497)) of Windows | $([System.Char]0x00A9) farag & Inestic, 2014$([System.Char]0x2013)2024" $Host.UI.RawUI.WindowTitle = "Sophia Script for Windows 10 LTSC 2019 v5.8.2 | Made with $([System.Char]::ConvertFromUtf32(0x1F497)) of Windows | $([System.Char]0x00A9) farag, Inestic & lowl1f3, 2014$([System.Char]0x2013)2024"
Remove-Module -Name Sophia -Force -ErrorAction Ignore Remove-Module -Name Sophia -Force -ErrorAction Ignore
Import-LocalizedData -BindingVariable Global:Localization -BaseDirectory $PSScriptRoot\Localizations -FileName Sophia Import-LocalizedData -BindingVariable Global:Localization -BaseDirectory $PSScriptRoot\Localizations -FileName Sophia
@ -788,12 +788,12 @@ ActiveHours -Automatically
InstallVCRedist InstallVCRedist
<# <#
Install the latest .NET Desktop Runtime 6, 7, 8 x64 Install the latest .NET Desktop Runtime 6, 8 x64
Установить последнюю версию .NET Desktop Runtime 6, 7, 8 x64 Установить последнюю версию .NET Desktop Runtime 6, 8 x64
https://dotnet.microsoft.com/en-us/download/dotnet https://dotnet.microsoft.com/en-us/download/dotnet
#> #>
InstallDotNetRuntimes -Runtimes NET6x64, NET7x64, NET8x64 InstallDotNetRuntimes -Runtimes NET6x64, NET8x64
# Enable proxying only blocked sites from the unified registry of Roskomnadzor. The function is applicable for Russia only # Enable proxying only blocked sites from the unified registry of Roskomnadzor. The function is applicable for Russia only
# Включить проксирование только заблокированных сайтов из единого реестра Роскомнадзора. Функция применима только для России # Включить проксирование только заблокированных сайтов из единого реестра Роскомнадзора. Функция применима только для России

3
src/Sophia_Script_for_Windows_10_LTSC_2021/Functions.ps1

@ -5,8 +5,7 @@
Version: v5.18.2 Version: v5.18.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved

157
src/Sophia_Script_for_Windows_10_LTSC_2021/Module/Sophia.psm1

@ -5,8 +5,7 @@
Version: v5.18.2 Version: v5.18.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved
@ -36,6 +35,7 @@
.LINK Authors .LINK Authors
https://github.com/farag2 https://github.com/farag2
https://github.com/Inestic https://github.com/Inestic
https://github.com/lowl1f3
#> #>
#region InitialActions #region InitialActions
@ -64,6 +64,7 @@ function InitialActions
# Extract strings from %SystemRoot%\System32\shell32.dll using its' number # Extract strings from %SystemRoot%\System32\shell32.dll using its' number
# https://github.com/SamuelArnold/StarKill3r/blob/master/Star%20Killer/Star%20Killer/bin/Debug/Scripts/SANS-SEC505-master/scripts/Day1-PowerShell/Expand-IndirectString.ps1 # https://github.com/SamuelArnold/StarKill3r/blob/master/Star%20Killer/Star%20Killer/bin/Debug/Scripts/SANS-SEC505-master/scripts/Day1-PowerShell/Expand-IndirectString.ps1
# [WinAPI.GetStrings]::GetIndirectString("@%SystemRoot%\system32\schedsvc.dll,-100")
$Signature = @{ $Signature = @{
Namespace = "WinAPI" Namespace = "WinAPI"
Name = "GetStrings" Name = "GetStrings"
@ -812,33 +813,6 @@ public static extern bool SetForegroundWindow(IntPtr hWnd);
Write-Error -Message ($Localization.RestartFunction -f $MyInvocation.Line.Trim()) -ErrorAction SilentlyContinue Write-Error -Message ($Localization.RestartFunction -f $MyInvocation.Line.Trim()) -ErrorAction SilentlyContinue
} }
# Register a temp schedule task to check whether there's a Windows bug presented
$Action = New-ScheduledTaskAction -Execute powershell.exe
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest
$Parameters = @{
TaskName = "SophiaTempScheduledTask"
Principal = $Principal
Action = $Action
Settings = $Settings
}
try
{
Register-ScheduledTask @Parameters -Force -ErrorAction Stop
}
catch [Microsoft.Management.Infrastructure.CimException]
{
Write-Verbose -Message ($Localization.WindowsComponentBroken -f [WinAPI.GetStrings]::GetIndirectString("@%SystemRoot%\system32\schedsvc.dll,-100")) -Verbose
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Remove temp schedule task
Unregister-ScheduledTask -TaskName SophiaTempScheduledTask -Confirm:$false -ErrorAction Ignore
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\Computer.txt", "$env:TEMP\User.txt" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\Computer.txt", "$env:TEMP\User.txt" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
@ -4745,10 +4719,12 @@ Unregister-ScheduledTask -TaskName SymbolicLink -Confirm:`$false
"@ "@
# Create a temporary scheduled task to create a symbolic link to the %SystemDrive%\Temp folder # Create a temporary scheduled task to create a symbolic link to the %SystemDrive%\Temp folder
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $SymbolicLinkTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $SymbolicLinkTask"
$Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME $Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "SymbolicLink" TaskName = "SymbolicLink"
Principal = $Principal Principal = $Principal
@ -4867,10 +4843,12 @@ Unregister-ScheduledTask -TaskName TemporaryTask -Confirm:`$false
"@ "@
# Create a temporary scheduled task to clean up the temporary folder # Create a temporary scheduled task to clean up the temporary folder
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $TempFolderCleanupTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $TempFolderCleanupTask"
$Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME $Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "TemporaryTask" TaskName = "TemporaryTask"
Principal = $Principal Principal = $Principal
@ -9153,15 +9131,18 @@ function InstallVCRedist
return return
} }
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/VCRedist/2015%2B if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
winget install --id=Microsoft.VCRedist.2015+.x86 --exact --force --accept-source-agreements {
winget install --id=Microsoft.VCRedist.2015+.x64 --exact --force --accept-source-agreements # https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/VCRedist/2015%2B
winget install --id=Microsoft.VCRedist.2015+.x86 --exact --force --accept-source-agreements
winget install --id=Microsoft.VCRedist.2015+.x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -9208,10 +9189,10 @@ function InstallVCRedist
<# <#
.SYNOPSIS .SYNOPSIS
Install the latest .NET Desktop Runtime 6, 7, 8 x64 Install the latest .NET Desktop Runtime 6, 8 x64
.EXAMPLE .EXAMPLE
InstallDotNetRuntimes -Runtimes NET6x64, NET7x64, NET8x64 InstallDotNetRuntimes -Runtimes NET6x64, NET8x64
.LINK .LINK
https://dotnet.microsoft.com/en-us/download/dotnet https://dotnet.microsoft.com/en-us/download/dotnet
@ -9228,7 +9209,7 @@ function InstallDotNetRuntimes
Mandatory = $true, Mandatory = $true,
ParameterSetName = "Runtimes" ParameterSetName = "Runtimes"
)] )]
[ValidateSet("NET6x64", "NET7x64", "NET8x64")] [ValidateSet("NET6x64", "NET8x64")]
[string[]] [string[]]
$Runtimes $Runtimes
) )
@ -9261,15 +9242,18 @@ function InstallDotNetRuntimes
{ {
NET6x64 NET6x64
{ {
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/6 if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
# .NET Desktop Runtime 6 x64 {
winget install --id=Microsoft.DotNet.DesktopRuntime.6 --architecture x64 --exact --force --accept-source-agreements # https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/6
# .NET Desktop Runtime 6 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.6 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -9303,60 +9287,19 @@ function InstallDotNetRuntimes
Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
} }
} }
NET7x64
{
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17")
{
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/7
# .NET Desktop Runtime 7 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.7 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
else
{
# .NET Desktop Runtime 7
# https://github.com/dotnet/core/blob/main/release-notes/releases-index.json
$Parameters = @{
Uri = "https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/7.0/releases.json"
Verbose = $true
UseBasicParsing = $true
}
$LatestRelease = (Invoke-RestMethod @Parameters)."latest-release"
$DownloadsFolder = Get-ItemPropertyValue -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" -Name "{374DE290-123F-4565-9164-39C4925E467B}"
# .NET Desktop Runtime 7 x64
$Parameters = @{
Uri = "https://dotnetcli.azureedge.net/dotnet/Runtime/$LatestRelease/dotnet-runtime-$LatestRelease-win-x64.exe"
OutFile = "$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe"
UseBasicParsing = $true
Verbose = $true
}
Invoke-WebRequest @Parameters
Start-Process -FilePath "$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe" -ArgumentList "/install /passive /norestart" -Wait
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070
$Paths = @(
"$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe",
"$env:TEMP\Microsoft_.NET_Runtime*.log"
)
Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
}
NET8x64 NET8x64
{ {
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# .NET Desktop Runtime 8 x64 if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
winget install --id=Microsoft.DotNet.DesktopRuntime.8 --architecture x64 --exact --force --accept-source-agreements {
# .NET Desktop Runtime 8 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.8 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -10568,10 +10511,12 @@ public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
`$Process.Start() | Out-Null `$Process.Start() | Out-Null
"@ "@
# Create the "Windows Cleanup" task # Create "Windows Cleanup" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $CleanupTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $CleanupTask"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "Windows Cleanup" TaskName = "Windows Cleanup"
TaskPath = "Sophia" TaskPath = "Sophia"
@ -10719,9 +10664,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" -Value $ToastNotification -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" -Value $ToastNotification -Encoding Default -Force
# Create the "Windows Cleanup Notification" task # Create the "Windows Cleanup Notification" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 30 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 30 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "Windows Cleanup Notification" TaskName = "Windows Cleanup Notification"
@ -11029,9 +10976,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" -Value $SoftwareDistributionTask -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" -Value $SoftwareDistributionTask -Encoding Default -Force
# Create the "SoftwareDistribution" task # Create the "SoftwareDistribution" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "SoftwareDistribution" TaskName = "SoftwareDistribution"
@ -11346,9 +11295,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" -Value $TempTask -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" -Value $TempTask -Encoding Default -Force
# Create the "Temp" task # Create the "Temp" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 60 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 60 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "Temp" TaskName = "Temp"

12
src/Sophia_Script_for_Windows_10_LTSC_2021/Sophia.ps1

@ -5,8 +5,7 @@
Version: v5.18.2 Version: v5.18.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved
@ -55,6 +54,7 @@
.LINK Authors .LINK Authors
https://github.com/farag2 https://github.com/farag2
https://github.com/Inestic https://github.com/Inestic
https://github.com/lowl1f3
#> #>
#Requires -RunAsAdministrator #Requires -RunAsAdministrator
@ -70,7 +70,7 @@ param
Clear-Host Clear-Host
$Host.UI.RawUI.WindowTitle = "Sophia Script for Windows 10 LTSC 2021 v5.18.2 | Made with $([System.Char]::ConvertFromUtf32(0x1F497)) of Windows | $([System.Char]0x00A9) farag & Inestic, 2014$([System.Char]0x2013)2024" $Host.UI.RawUI.WindowTitle = "Sophia Script for Windows 10 LTSC 2021 v5.18.2 | Made with $([System.Char]::ConvertFromUtf32(0x1F497)) of Windows | $([System.Char]0x00A9) farag, Inestic & lowl1f3, 2014$([System.Char]0x2013)2024"
Remove-Module -Name Sophia -Force -ErrorAction Ignore Remove-Module -Name Sophia -Force -ErrorAction Ignore
Import-LocalizedData -BindingVariable Global:Localization -BaseDirectory $PSScriptRoot\Localizations -FileName Sophia Import-LocalizedData -BindingVariable Global:Localization -BaseDirectory $PSScriptRoot\Localizations -FileName Sophia
@ -886,12 +886,12 @@ ActiveHours -Automatically
InstallVCRedist InstallVCRedist
<# <#
Install the latest .NET Desktop Runtime 6, 7, 8 x64 Install the latest .NET Desktop Runtime 6, 8 x64
Установить последнюю версию .NET Desktop Runtime 6, 7, 8 x64 Установить последнюю версию .NET Desktop Runtime 6, 8 x64
https://dotnet.microsoft.com/en-us/download/dotnet https://dotnet.microsoft.com/en-us/download/dotnet
#> #>
InstallDotNetRuntimes -Runtimes NET6x64, NET7x64, NET8x64 InstallDotNetRuntimes -Runtimes NET6x64, NET8x64
# Enable proxying only blocked sites from the unified registry of Roskomnadzor. The function is applicable for Russia only # Enable proxying only blocked sites from the unified registry of Roskomnadzor. The function is applicable for Russia only
# Включить проксирование только заблокированных сайтов из единого реестра Роскомнадзора. Функция применима только для России # Включить проксирование только заблокированных сайтов из единого реестра Роскомнадзора. Функция применима только для России

3
src/Sophia_Script_for_Windows_10_PowerShell_7/Functions.ps1

@ -5,8 +5,7 @@
Version: v5.18.2 Version: v5.18.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved

219
src/Sophia_Script_for_Windows_10_PowerShell_7/Module/Sophia.psm1

@ -5,8 +5,7 @@
Version: v5.18.2 Version: v5.18.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved
@ -36,6 +35,7 @@
.LINK Authors .LINK Authors
https://github.com/farag2 https://github.com/farag2
https://github.com/Inestic https://github.com/Inestic
https://github.com/lowl1f3
#> #>
#region InitialActions #region InitialActions
@ -60,6 +60,7 @@ function InitialActions
# Extract strings from %SystemRoot%\System32\shell32.dll using its' number # Extract strings from %SystemRoot%\System32\shell32.dll using its' number
# https://github.com/SamuelArnold/StarKill3r/blob/master/Star%20Killer/Star%20Killer/bin/Debug/Scripts/SANS-SEC505-master/scripts/Day1-PowerShell/Expand-IndirectString.ps1 # https://github.com/SamuelArnold/StarKill3r/blob/master/Star%20Killer/Star%20Killer/bin/Debug/Scripts/SANS-SEC505-master/scripts/Day1-PowerShell/Expand-IndirectString.ps1
# [WinAPI.GetStrings]::GetIndirectString("@%SystemRoot%\system32\schedsvc.dll,-100")
$Signature = @{ $Signature = @{
Namespace = "WinAPI" Namespace = "WinAPI"
Name = "GetStrings" Name = "GetStrings"
@ -827,33 +828,6 @@ public static extern bool SetForegroundWindow(IntPtr hWnd);
Write-Error -Message ($Localization.RestartFunction -f $MyInvocation.Line.Trim()) -ErrorAction SilentlyContinue Write-Error -Message ($Localization.RestartFunction -f $MyInvocation.Line.Trim()) -ErrorAction SilentlyContinue
} }
# Register a temp schedule task to check whether there's a Windows bug presented
$Action = New-ScheduledTaskAction -Execute powershell.exe
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest
$Parameters = @{
TaskName = "SophiaTempScheduledTask"
Principal = $Principal
Action = $Action
Settings = $Settings
}
try
{
Register-ScheduledTask @Parameters -Force -ErrorAction Stop
}
catch [Microsoft.Management.Infrastructure.CimException]
{
Write-Verbose -Message ($Localization.WindowsComponentBroken -f [WinAPI.GetStrings]::GetIndirectString("@%SystemRoot%\system32\schedsvc.dll,-100")) -Verbose
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Remove temp schedule task
Unregister-ScheduledTask -TaskName SophiaTempScheduledTask -Confirm:$false -ErrorAction Ignore
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\Computer.txt", "$env:TEMP\User.txt" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\Computer.txt", "$env:TEMP\User.txt" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
@ -5637,10 +5611,12 @@ Unregister-ScheduledTask -TaskName SymbolicLink -Confirm:`$false
"@ "@
# Create a temporary scheduled task to create a symbolic link to the %SystemDrive%\Temp folder # Create a temporary scheduled task to create a symbolic link to the %SystemDrive%\Temp folder
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $SymbolicLinkTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $SymbolicLinkTask"
$Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME $Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "SymbolicLink" TaskName = "SymbolicLink"
Principal = $Principal Principal = $Principal
@ -5759,10 +5735,12 @@ Unregister-ScheduledTask -TaskName TemporaryTask -Confirm:`$false
"@ "@
# Create a temporary scheduled task to clean up the temporary folder # Create a temporary scheduled task to clean up the temporary folder
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $TempFolderCleanupTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $TempFolderCleanupTask"
$Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME $Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "TemporaryTask" TaskName = "TemporaryTask"
Principal = $Principal Principal = $Principal
@ -10202,15 +10180,18 @@ function InstallVCRedist
return return
} }
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/VCRedist/2015%2B if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
winget install --id=Microsoft.VCRedist.2015+.x86 --exact --force --accept-source-agreements {
winget install --id=Microsoft.VCRedist.2015+.x64 --exact --force --accept-source-agreements # https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/VCRedist/2015%2B
winget install --id=Microsoft.VCRedist.2015+.x86 --exact --force --accept-source-agreements
winget install --id=Microsoft.VCRedist.2015+.x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -10257,10 +10238,10 @@ function InstallVCRedist
<# <#
.SYNOPSIS .SYNOPSIS
Install the latest .NET Desktop Runtime 6, 7, 8 x64 Install the latest .NET Desktop Runtime 6, 8 x64
.EXAMPLE .EXAMPLE
InstallDotNetRuntimes -Runtimes NET6x64, NET7x64, NET8x64 InstallDotNetRuntimes -Runtimes NET6x64, NET8x64
.LINK .LINK
https://dotnet.microsoft.com/en-us/download/dotnet https://dotnet.microsoft.com/en-us/download/dotnet
@ -10277,7 +10258,7 @@ function InstallDotNetRuntimes
Mandatory = $true, Mandatory = $true,
ParameterSetName = "Runtimes" ParameterSetName = "Runtimes"
)] )]
[ValidateSet("NET6x64", "NET7x64", "NET8x64")] [ValidateSet("NET6x64", "NET8x64")]
[string[]] [string[]]
$Runtimes $Runtimes
) )
@ -10310,15 +10291,18 @@ function InstallDotNetRuntimes
{ {
NET6x64 NET6x64
{ {
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/6 if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
# .NET Desktop Runtime 6 x64 {
winget install --id=Microsoft.DotNet.DesktopRuntime.6 --architecture x64 --exact --force --accept-source-agreements # https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/6
# .NET Desktop Runtime 6 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.6 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -10352,60 +10336,19 @@ function InstallDotNetRuntimes
Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
} }
} }
NET7x64
{
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17")
{
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/7
# .NET Desktop Runtime 7 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.7 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
else
{
# .NET Desktop Runtime 7
# https://github.com/dotnet/core/blob/main/release-notes/releases-index.json
$Parameters = @{
Uri = "https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/7.0/releases.json"
Verbose = $true
UseBasicParsing = $true
}
$LatestRelease = (Invoke-RestMethod @Parameters)."latest-release"
$DownloadsFolder = Get-ItemPropertyValue -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" -Name "{374DE290-123F-4565-9164-39C4925E467B}"
# .NET Desktop Runtime 7 x64
$Parameters = @{
Uri = "https://dotnetcli.azureedge.net/dotnet/Runtime/$LatestRelease/dotnet-runtime-$LatestRelease-win-x64.exe"
OutFile = "$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe"
UseBasicParsing = $true
Verbose = $true
}
Invoke-WebRequest @Parameters
Start-Process -FilePath "$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe" -ArgumentList "/install /passive /norestart" -Wait
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070
$Paths = @(
"$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe",
"$env:TEMP\Microsoft_.NET_Runtime*.log"
)
Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
}
NET8x64 NET8x64
{ {
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# .NET Desktop Runtime 8 x64 if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
winget install --id=Microsoft.DotNet.DesktopRuntime.8 --architecture x64 --exact --force --accept-source-agreements {
# .NET Desktop Runtime 8 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.8 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -11549,7 +11492,7 @@ function UninstallUWPApps
[PSCustomObject]@{ [PSCustomObject]@{
Name = $AppxPackage.Name Name = $AppxPackage.Name
PackageFullName = $AppxPackage.PackageFullName PackageFullName = $AppxPackage.PackageFullName
# Sometimes there's more than one package presented in Windows with the same package name like {Microsoft Teams, Microsoft Teams} and we need to display one the first one a window # Sometimes there's more than one package presented in Windows with the same package name like {Microsoft Teams, Microsoft Teams} and we need to display the first one
DisplayName = $PackageId.DisplayName | Select-Object -First 1 DisplayName = $PackageId.DisplayName | Select-Object -First 1
} }
} }
@ -12834,10 +12777,12 @@ public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
`$Process.Start() | Out-Null `$Process.Start() | Out-Null
"@ "@
# Create the "Windows Cleanup" task # Create "Windows Cleanup" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $CleanupTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $CleanupTask"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "Windows Cleanup" TaskName = "Windows Cleanup"
TaskPath = "Sophia" TaskPath = "Sophia"
@ -12985,9 +12930,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" -Value $ToastNotification -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" -Value $ToastNotification -Encoding Default -Force
# Create the "Windows Cleanup Notification" task # Create the "Windows Cleanup Notification" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 30 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 30 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "Windows Cleanup Notification" TaskName = "Windows Cleanup Notification"
@ -13295,9 +13242,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" -Value $SoftwareDistributionTask -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" -Value $SoftwareDistributionTask -Encoding Default -Force
# Create the "SoftwareDistribution" task # Create the "SoftwareDistribution" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "SoftwareDistribution" TaskName = "SoftwareDistribution"
@ -13612,9 +13561,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" -Value $TempTask -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" -Value $TempTask -Encoding Default -Force
# Create the "Temp" task # Create the "Temp" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 60 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 60 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "Temp" TaskName = "Temp"
@ -14732,66 +14683,6 @@ function EditWithPaint3DContext
} }
} }
<#
.SYNOPSIS
The "Edit" item in the images context menu
.PARAMETER Hide
Hide the "Edit" item from the images context menu
.PARAMETER Show
Show the "Edit" item in the images context menu
.EXAMPLE
ImagesEditContext -Hide
.EXAMPLE
ImagesEditContext -Show
.NOTES
Current user
#>
function ImagesEditContext
{
param
(
[Parameter(
Mandatory = $true,
ParameterSetName = "Hide"
)]
[switch]
$Hide,
[Parameter(
Mandatory = $true,
ParameterSetName = "Show"
)]
[switch]
$Show
)
if (-not ((Get-WindowsCapability -Online -Name "Microsoft.Windows.MSPaint*").State -eq "Installed"))
{
return
}
switch ($PSCmdlet.ParameterSetName)
{
"Hide"
{
if (-not (Test-Path -Path Registry::HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\edit))
{
New-Item -Path Registry::HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\edit -Force
}
New-ItemProperty -Path Registry::HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\edit -Name ProgrammaticAccessOnly -PropertyType String -Value "" -Force
}
"Show"
{
Remove-ItemProperty -Path Registry::HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\edit -Name ProgrammaticAccessOnly -Force -ErrorAction Ignore
}
}
}
<# <#
.SYNOPSIS .SYNOPSIS
The "Print" item in the .bat and .cmd context menu The "Print" item in the .bat and .cmd context menu

20
src/Sophia_Script_for_Windows_10_PowerShell_7/Sophia.ps1

@ -5,8 +5,7 @@
Version: v5.18.2 Version: v5.18.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved
@ -55,6 +54,7 @@
.LINK Authors .LINK Authors
https://github.com/farag2 https://github.com/farag2
https://github.com/Inestic https://github.com/Inestic
https://github.com/lowl1f3
#> #>
#Requires -RunAsAdministrator #Requires -RunAsAdministrator
@ -70,7 +70,7 @@ param
Clear-Host Clear-Host
$Host.UI.RawUI.WindowTitle = "Sophia Script for Windows 10 v5.18.2 (PowerShell 7) | Made with $([System.Char]::ConvertFromUtf32(0x1F497)) of Windows | $([System.Char]0x00A9) farag & Inestic, 2014$([System.Char]0x2013)2024" $Host.UI.RawUI.WindowTitle = "Sophia Script for Windows 10 v5.18.2 (PowerShell 7) | Made with $([System.Char]::ConvertFromUtf32(0x1F497)) of Windows | $([System.Char]0x00A9) farag, Inestic & lowl1f3, 2014$([System.Char]0x2013)2024"
# PowerShell 7 doesn't load en-us localization automatically if there is no localization folder in user's language which is determined by $PSUICulture # PowerShell 7 doesn't load en-us localization automatically if there is no localization folder in user's language which is determined by $PSUICulture
# https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/import-localizeddata?view=powershell-7.3 # https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/import-localizeddata?view=powershell-7.3
@ -1016,12 +1016,12 @@ UninstallPCHealthCheck
InstallVCRedist InstallVCRedist
<# <#
Install the latest .NET Desktop Runtime 6, 7, 8 x64 Install the latest .NET Desktop Runtime 6, 8 x64
Установить последнюю версию .NET Desktop Runtime 6, 7, 8 x64 Установить последнюю версию .NET Desktop Runtime 6, 8 x64
https://dotnet.microsoft.com/en-us/download/dotnet https://dotnet.microsoft.com/en-us/download/dotnet
#> #>
InstallDotNetRuntimes -Runtimes NET6x64, NET7x64, NET8x64 InstallDotNetRuntimes -Runtimes NET6x64, NET8x64
# Enable proxying only blocked sites from the unified registry of Roskomnadzor. The function is applicable for Russia only # Enable proxying only blocked sites from the unified registry of Roskomnadzor. The function is applicable for Russia only
# Включить проксирование только заблокированных сайтов из единого реестра Роскомнадзора. Функция применима только для России # Включить проксирование только заблокированных сайтов из единого реестра Роскомнадзора. Функция применима только для России
@ -1398,14 +1398,6 @@ EditWithPaint3DContext -Hide
# Отобразить пункт "Изменить с помощью Paint 3D" в контекстном меню медиа-файлов (значение по умолчанию) # Отобразить пункт "Изменить с помощью Paint 3D" в контекстном меню медиа-файлов (значение по умолчанию)
# EditWithPaint3DContext -Show # EditWithPaint3DContext -Show
# Hide the "Edit" item from the images context menu
# Скрыть пункт "Изменить" из контекстного меню изображений
ImagesEditContext -Hide
# Show the "Edit" item in images context menu (default value)
# Отобразить пункт "Изменить" в контекстном меню изображений (значение по умолчанию)
# ImagesEditContext -Show
# Hide the "Print" item from the .bat and .cmd context menu # Hide the "Print" item from the .bat and .cmd context menu
# Скрыть пункт "Печать" из контекстного меню .bat и .cmd файлов # Скрыть пункт "Печать" из контекстного меню .bat и .cmd файлов
PrintCMDContext -Hide PrintCMDContext -Hide

3
src/Sophia_Script_for_Windows_11/Functions.ps1

@ -5,8 +5,7 @@
Version: v6.6.2 Version: v6.6.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved

167
src/Sophia_Script_for_Windows_11/Module/Sophia.psm1

@ -5,8 +5,7 @@
Version: v6.6.2 Version: v6.6.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved
@ -35,6 +34,7 @@
.LINK Authors .LINK Authors
https://github.com/farag2 https://github.com/farag2
https://github.com/Inestic https://github.com/Inestic
https://github.com/lowl1f3
#> #>
#region InitialActions #region InitialActions
@ -63,6 +63,7 @@ function InitialActions
# Extract strings from %SystemRoot%\System32\shell32.dll using its' number # Extract strings from %SystemRoot%\System32\shell32.dll using its' number
# https://github.com/SamuelArnold/StarKill3r/blob/master/Star%20Killer/Star%20Killer/bin/Debug/Scripts/SANS-SEC505-master/scripts/Day1-PowerShell/Expand-IndirectString.ps1 # https://github.com/SamuelArnold/StarKill3r/blob/master/Star%20Killer/Star%20Killer/bin/Debug/Scripts/SANS-SEC505-master/scripts/Day1-PowerShell/Expand-IndirectString.ps1
# [WinAPI.GetStrings]::GetIndirectString("@%SystemRoot%\system32\schedsvc.dll,-100")
$Signature = @{ $Signature = @{
Namespace = "WinAPI" Namespace = "WinAPI"
Name = "GetStrings" Name = "GetStrings"
@ -610,7 +611,7 @@ public static extern bool SetForegroundWindow(IntPtr hWnd);
DnsOnly = $true DnsOnly = $true
ErrorAction = "Stop" ErrorAction = "Stop"
} }
if ((Resolve-DnsName @Parameters).IPAddress -notcontains "131.107.255.255") ### if ((Resolve-DnsName @Parameters).IPAddress -notcontains "131.107.255.255")
{ {
return return
} }
@ -814,33 +815,6 @@ public static extern bool SetForegroundWindow(IntPtr hWnd);
Write-Error -Message ($Localization.RestartFunction -f $MyInvocation.Line.Trim()) -ErrorAction SilentlyContinue Write-Error -Message ($Localization.RestartFunction -f $MyInvocation.Line.Trim()) -ErrorAction SilentlyContinue
} }
# Register a temp schedule task to check whether there's a Windows bug presented
$Action = New-ScheduledTaskAction -Execute powershell.exe
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest
$Parameters = @{
TaskName = "SophiaTempScheduledTask"
Principal = $Principal
Action = $Action
Settings = $Settings
}
try
{
Register-ScheduledTask @Parameters -Force -ErrorAction Stop
}
catch [Microsoft.Management.Infrastructure.CimException]
{
Write-Verbose -Message ($Localization.WindowsComponentBroken -f [WinAPI.GetStrings]::GetIndirectString("@%SystemRoot%\system32\schedsvc.dll,-100")) -Verbose
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Remove temp schedule task
Unregister-ScheduledTask -TaskName SophiaTempScheduledTask -Confirm:$false -ErrorAction Ignore
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\Computer.txt", "$env:TEMP\User.txt" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\Computer.txt", "$env:TEMP\User.txt" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
@ -5246,10 +5220,12 @@ Unregister-ScheduledTask -TaskName SymbolicLink -Confirm:`$false
"@ "@
# Create a temporary scheduled task to create a symbolic link to the %SystemDrive%\Temp folder # Create a temporary scheduled task to create a symbolic link to the %SystemDrive%\Temp folder
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $SymbolicLinkTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $SymbolicLinkTask"
$Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME $Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "SymbolicLink" TaskName = "SymbolicLink"
Principal = $Principal Principal = $Principal
@ -5368,10 +5344,12 @@ Unregister-ScheduledTask -TaskName TemporaryTask -Confirm:`$false
"@ "@
# Create a temporary scheduled task to clean up the temporary folder # Create a temporary scheduled task to clean up the temporary folder
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $TempFolderCleanupTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $TempFolderCleanupTask"
$Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME $Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "TemporaryTask" TaskName = "TemporaryTask"
Principal = $Principal Principal = $Principal
@ -9837,15 +9815,18 @@ function InstallVCRedist
return return
} }
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/VCRedist/2015%2B if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
winget install --id=Microsoft.VCRedist.2015+.x86 --exact --force --accept-source-agreements {
winget install --id=Microsoft.VCRedist.2015+.x64 --exact --force --accept-source-agreements # https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/VCRedist/2015%2B
winget install --id=Microsoft.VCRedist.2015+.x86 --exact --force --accept-source-agreements
winget install --id=Microsoft.VCRedist.2015+.x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -9892,10 +9873,10 @@ function InstallVCRedist
<# <#
.SYNOPSIS .SYNOPSIS
Install the latest .NET Desktop Runtime 6, 7, 8 x64 Install the latest .NET Desktop Runtime 6, 8 x64
.EXAMPLE .EXAMPLE
InstallDotNetRuntimes -Runtimes NET6x64, NET7x64, NET8x64 InstallDotNetRuntimes -Runtimes NET6x64, NET8x64
.LINK .LINK
https://dotnet.microsoft.com/en-us/download/dotnet https://dotnet.microsoft.com/en-us/download/dotnet
@ -9912,7 +9893,7 @@ function InstallDotNetRuntimes
Mandatory = $true, Mandatory = $true,
ParameterSetName = "Runtimes" ParameterSetName = "Runtimes"
)] )]
[ValidateSet("NET6x64", "NET7x64", "NET8x64")] [ValidateSet("NET6x64", "NET8x64")]
[string[]] [string[]]
$Runtimes $Runtimes
) )
@ -9945,15 +9926,18 @@ function InstallDotNetRuntimes
{ {
NET6x64 NET6x64
{ {
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/6 if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
# .NET Desktop Runtime 6 x64 {
winget install --id=Microsoft.DotNet.DesktopRuntime.6 --architecture x64 --exact --force --accept-source-agreements # https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/6
# .NET Desktop Runtime 6 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.6 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -9987,61 +9971,19 @@ function InstallDotNetRuntimes
Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
} }
} }
NET7x64
{
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17")
{
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/7
# .NET Desktop Runtime 7 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.7 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
else
{
# .NET Desktop Runtime 7
# https://github.com/dotnet/core/blob/main/release-notes/releases-index.json
$Parameters = @{
Uri = "https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/7.0/releases.json"
Verbose = $true
UseBasicParsing = $true
}
$LatestRelease = (Invoke-RestMethod @Parameters)."latest-release"
$DownloadsFolder = Get-ItemPropertyValue -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" -Name "{374DE290-123F-4565-9164-39C4925E467B}"
# .NET Desktop Runtime 7 x64
$Parameters = @{
Uri = "https://dotnetcli.azureedge.net/dotnet/Runtime/$LatestRelease/dotnet-runtime-$LatestRelease-win-x64.exe"
OutFile = "$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe"
UseBasicParsing = $true
Verbose = $true
}
Invoke-WebRequest @Parameters
Start-Process -FilePath "$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe" -ArgumentList "/install /passive /norestart" -Wait
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070
$Paths = @(
"$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe",
"$env:TEMP\Microsoft_.NET_Runtime*.log"
)
Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
}
NET8x64 NET8x64
{ {
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# .NET Desktop Runtime 8 x64 if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
winget install --id=Microsoft.DotNet.DesktopRuntime.8 --architecture x64 --exact --force --accept-source-agreements {
# .NET Desktop Runtime 8 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.8 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -11025,7 +10967,10 @@ function UninstallUWPApps
"Microsoft.OutlookForWindows", "Microsoft.OutlookForWindows",
# Chat (Microsoft Teams) # Chat (Microsoft Teams)
"MicrosoftTeams" "MicrosoftTeams",
# Microsoft Copilot
"Microsoft.Windows.Ai.CoPilot.Provider"
) )
foreach ($Package in $Packages) foreach ($Package in $Packages)
{ {
@ -11047,7 +10992,7 @@ function UninstallUWPApps
[PSCustomObject]@{ [PSCustomObject]@{
Name = $AppxPackage.Name Name = $AppxPackage.Name
PackageFullName = $AppxPackage.PackageFullName PackageFullName = $AppxPackage.PackageFullName
# Sometimes there's more than one package presented in Windows with the same package name like {Microsoft Teams, Microsoft Teams} and we need to display one the first one a window # Sometimes there's more than one package presented in Windows with the same package name like {Microsoft Teams, Microsoft Teams} and we need to display the first one
DisplayName = $PackageId.DisplayName | Select-Object -First 1 DisplayName = $PackageId.DisplayName | Select-Object -First 1
} }
} }
@ -12155,10 +12100,12 @@ public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
`$Process.Start() | Out-Null `$Process.Start() | Out-Null
"@ "@
# Create the "Windows Cleanup" task # Create "Windows Cleanup" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $CleanupTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $CleanupTask"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "Windows Cleanup" TaskName = "Windows Cleanup"
TaskPath = "Sophia" TaskPath = "Sophia"
@ -12306,9 +12253,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" -Value $ToastNotification -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" -Value $ToastNotification -Encoding Default -Force
# Create the "Windows Cleanup Notification" task # Create the "Windows Cleanup Notification" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 30 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 30 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "Windows Cleanup Notification" TaskName = "Windows Cleanup Notification"
@ -12616,9 +12565,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" -Value $SoftwareDistributionTask -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" -Value $SoftwareDistributionTask -Encoding Default -Force
# Create the "SoftwareDistribution" task # Create the "SoftwareDistribution" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "SoftwareDistribution" TaskName = "SoftwareDistribution"
@ -12933,9 +12884,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" -Value $TempTask -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" -Value $TempTask -Encoding Default -Force
# Create the "Temp" task # Create the "Temp" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 60 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 60 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "Temp" TaskName = "Temp"

12
src/Sophia_Script_for_Windows_11/Sophia.ps1

@ -5,8 +5,7 @@
Version: v6.6.2 Version: v6.6.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved
@ -54,6 +53,7 @@
.LINK Authors .LINK Authors
https://github.com/farag2 https://github.com/farag2
https://github.com/Inestic https://github.com/Inestic
https://github.com/lowl1f3
#> #>
#Requires -RunAsAdministrator #Requires -RunAsAdministrator
@ -69,7 +69,7 @@ param
Clear-Host Clear-Host
$Host.UI.RawUI.WindowTitle = "Sophia Script for Windows 11 v6.6.2 | Made with $([System.Char]::ConvertFromUtf32(0x1F497)) of Windows | $([System.Char]0x00A9) farag & Inestic, 2014$([System.Char]0x2013)2024" $Host.UI.RawUI.WindowTitle = "Sophia Script for Windows 11 v6.6.2 | Made with $([System.Char]::ConvertFromUtf32(0x1F497)) of Windows | $([System.Char]0x00A9) farag, Inestic & lowl1f3, 2014$([System.Char]0x2013)2024"
Remove-Module -Name Sophia -Force -ErrorAction Ignore Remove-Module -Name Sophia -Force -ErrorAction Ignore
Import-LocalizedData -BindingVariable Global:Localization -BaseDirectory $PSScriptRoot\Localizations -FileName Sophia Import-LocalizedData -BindingVariable Global:Localization -BaseDirectory $PSScriptRoot\Localizations -FileName Sophia
@ -979,12 +979,12 @@ DefaultTerminalApp -WindowsTerminal
InstallVCRedist InstallVCRedist
<# <#
Install the latest .NET Desktop Runtime 6, 7, 8 x64 Install the latest .NET Desktop Runtime 6, 8 x64
Установить последнюю версию .NET Desktop Runtime 6, 7, 8 x64 Установить последнюю версию .NET Desktop Runtime 6, 8 x64
https://dotnet.microsoft.com/en-us/download/dotnet https://dotnet.microsoft.com/en-us/download/dotnet
#> #>
InstallDotNetRuntimes -Runtimes NET6x64, NET7x64, NET8x64 InstallDotNetRuntimes -Runtimes NET6x64, NET8x64
# Enable proxying only blocked sites from the unified registry of Roskomnadzor. The function is applicable for Russia only # Enable proxying only blocked sites from the unified registry of Roskomnadzor. The function is applicable for Russia only
# Включить проксирование только заблокированных сайтов из единого реестра Роскомнадзора. Функция применима только для России # Включить проксирование только заблокированных сайтов из единого реестра Роскомнадзора. Функция применима только для России

3
src/Sophia_Script_for_Windows_11_PowerShell_7/Functions.ps1

@ -5,8 +5,7 @@
Version: v6.6.2 Version: v6.6.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved

164
src/Sophia_Script_for_Windows_11_PowerShell_7/Module/Sophia.psm1

@ -5,8 +5,7 @@
Version: v6.6.2 Version: v6.6.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved
@ -35,6 +34,7 @@
.LINK Authors .LINK Authors
https://github.com/farag2 https://github.com/farag2
https://github.com/Inestic https://github.com/Inestic
https://github.com/lowl1f3
#> #>
#region InitialActions #region InitialActions
@ -59,6 +59,7 @@ function InitialActions
# Extract strings from %SystemRoot%\System32\shell32.dll using its' number # Extract strings from %SystemRoot%\System32\shell32.dll using its' number
# https://github.com/SamuelArnold/StarKill3r/blob/master/Star%20Killer/Star%20Killer/bin/Debug/Scripts/SANS-SEC505-master/scripts/Day1-PowerShell/Expand-IndirectString.ps1 # https://github.com/SamuelArnold/StarKill3r/blob/master/Star%20Killer/Star%20Killer/bin/Debug/Scripts/SANS-SEC505-master/scripts/Day1-PowerShell/Expand-IndirectString.ps1
# [WinAPI.GetStrings]::GetIndirectString("@%SystemRoot%\system32\schedsvc.dll,-100")
$Signature = @{ $Signature = @{
Namespace = "WinAPI" Namespace = "WinAPI"
Name = "GetStrings" Name = "GetStrings"
@ -803,33 +804,6 @@ public static extern bool SetForegroundWindow(IntPtr hWnd);
Write-Error -Message ($Localization.RestartFunction -f $MyInvocation.Line.Trim()) -ErrorAction SilentlyContinue Write-Error -Message ($Localization.RestartFunction -f $MyInvocation.Line.Trim()) -ErrorAction SilentlyContinue
} }
# Register a temp schedule task to check whether there's a Windows bug presented
$Action = New-ScheduledTaskAction -Execute powershell.exe
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest
$Parameters = @{
TaskName = "SophiaTempScheduledTask"
Principal = $Principal
Action = $Action
Settings = $Settings
}
try
{
Register-ScheduledTask @Parameters -Force -ErrorAction Stop
}
catch [Microsoft.Management.Infrastructure.CimException]
{
Write-Verbose -Message ($Localization.WindowsComponentBroken -f [WinAPI.GetStrings]::GetIndirectString("@%SystemRoot%\system32\schedsvc.dll,-100")) -Verbose
Start-Process -FilePath "https://t.me/sophia_chat"
Start-Process -FilePath "https://discord.gg/sSryhaEv79"
exit
}
# Remove temp schedule task
Unregister-ScheduledTask -TaskName SophiaTempScheduledTask -Confirm:$false -ErrorAction Ignore
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\Computer.txt", "$env:TEMP\User.txt" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\Computer.txt", "$env:TEMP\User.txt" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
@ -5235,10 +5209,12 @@ Unregister-ScheduledTask -TaskName SymbolicLink -Confirm:`$false
"@ "@
# Create a temporary scheduled task to create a symbolic link to the %SystemDrive%\Temp folder # Create a temporary scheduled task to create a symbolic link to the %SystemDrive%\Temp folder
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $SymbolicLinkTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $SymbolicLinkTask"
$Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME $Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "SymbolicLink" TaskName = "SymbolicLink"
Principal = $Principal Principal = $Principal
@ -5357,10 +5333,12 @@ Unregister-ScheduledTask -TaskName TemporaryTask -Confirm:`$false
"@ "@
# Create a temporary scheduled task to clean up the temporary folder # Create a temporary scheduled task to clean up the temporary folder
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $TempFolderCleanupTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $TempFolderCleanupTask"
$Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME $Trigger = New-ScheduledTaskTrigger -AtLogon -User $env:USERNAME
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "TemporaryTask" TaskName = "TemporaryTask"
Principal = $Principal Principal = $Principal
@ -9826,15 +9804,18 @@ function InstallVCRedist
return return
} }
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/VCRedist/2015%2B if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
winget install --id=Microsoft.VCRedist.2015+.x86 --exact --force --accept-source-agreements {
winget install --id=Microsoft.VCRedist.2015+.x64 --exact --force --accept-source-agreements # https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/VCRedist/2015%2B
winget install --id=Microsoft.VCRedist.2015+.x86 --exact --force --accept-source-agreements
winget install --id=Microsoft.VCRedist.2015+.x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -9881,10 +9862,10 @@ function InstallVCRedist
<# <#
.SYNOPSIS .SYNOPSIS
Install the latest .NET Desktop Runtime 6, 7, 8 x64 Install the latest .NET Desktop Runtime 6, 8 x64
.EXAMPLE .EXAMPLE
InstallDotNetRuntimes -Runtimes NET6x64, NET7x64, NET8x64 InstallDotNetRuntimes -Runtimes NET6x64, NET8x64
.LINK .LINK
https://dotnet.microsoft.com/en-us/download/dotnet https://dotnet.microsoft.com/en-us/download/dotnet
@ -9901,7 +9882,7 @@ function InstallDotNetRuntimes
Mandatory = $true, Mandatory = $true,
ParameterSetName = "Runtimes" ParameterSetName = "Runtimes"
)] )]
[ValidateSet("NET6x64", "NET7x64", "NET8x64")] [ValidateSet("NET6x64", "NET8x64")]
[string[]] [string[]]
$Runtimes $Runtimes
) )
@ -9934,15 +9915,18 @@ function InstallDotNetRuntimes
{ {
NET6x64 NET6x64
{ {
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/6 if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
# .NET Desktop Runtime 6 x64 {
winget install --id=Microsoft.DotNet.DesktopRuntime.6 --architecture x64 --exact --force --accept-source-agreements # https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/6
# .NET Desktop Runtime 6 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.6 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -9976,60 +9960,19 @@ function InstallDotNetRuntimes
Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
} }
} }
NET7x64
{
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17")
{
# https://github.com/microsoft/winget-pkgs/tree/master/manifests/m/Microsoft/DotNet/DesktopRuntime/7
# .NET Desktop Runtime 7 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.7 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
else
{
# .NET Desktop Runtime 7
# https://github.com/dotnet/core/blob/main/release-notes/releases-index.json
$Parameters = @{
Uri = "https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/7.0/releases.json"
Verbose = $true
UseBasicParsing = $true
}
$LatestRelease = (Invoke-RestMethod @Parameters)."latest-release"
$DownloadsFolder = Get-ItemPropertyValue -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" -Name "{374DE290-123F-4565-9164-39C4925E467B}"
# .NET Desktop Runtime 7 x64
$Parameters = @{
Uri = "https://dotnetcli.azureedge.net/dotnet/Runtime/$LatestRelease/dotnet-runtime-$LatestRelease-win-x64.exe"
OutFile = "$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe"
UseBasicParsing = $true
Verbose = $true
}
Invoke-WebRequest @Parameters
Start-Process -FilePath "$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe" -ArgumentList "/install /passive /norestart" -Wait
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070
$Paths = @(
"$DownloadsFolder\dotnet-runtime-$LatestRelease-win-x64.exe",
"$env:TEMP\Microsoft_.NET_Runtime*.log"
)
Get-ChildItem -Path $Paths -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
}
NET8x64 NET8x64
{ {
if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore).Version -ge [System.Version]"1.17") if (Get-AppxPackage -Name Microsoft.DesktopAppInstaller -ErrorAction Ignore)
{ {
# .NET Desktop Runtime 8 x64 if ([System.Version](Get-AppxPackage -Name Microsoft.DesktopAppInstaller).Version -ge [System.Version]"1.17")
winget install --id=Microsoft.DotNet.DesktopRuntime.8 --architecture x64 --exact --force --accept-source-agreements {
# .NET Desktop Runtime 8 x64
winget install --id=Microsoft.DotNet.DesktopRuntime.8 --architecture x64 --exact --force --accept-source-agreements
# PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word # PowerShell 5.1 (7.5 too) interprets 8.3 file name literally, if an environment variable contains a non-Latin word
# https://github.com/PowerShell/PowerShell/issues/21070 # https://github.com/PowerShell/PowerShell/issues/21070
Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore Get-ChildItem -Path "$env:TEMP\WinGet" -Force -ErrorAction Ignore | Remove-Item -Recurse -Force -ErrorAction Ignore
}
} }
else else
{ {
@ -11023,7 +10966,10 @@ function UninstallUWPApps
"Microsoft.OutlookForWindows", "Microsoft.OutlookForWindows",
# Chat (Microsoft Teams) # Chat (Microsoft Teams)
"MicrosoftTeams" "MicrosoftTeams",
# Microsoft Copilot
"Microsoft.Windows.Ai.CoPilot.Provider"
) )
foreach ($Package in $Packages) foreach ($Package in $Packages)
{ {
@ -11045,7 +10991,7 @@ function UninstallUWPApps
[PSCustomObject]@{ [PSCustomObject]@{
Name = $AppxPackage.Name Name = $AppxPackage.Name
PackageFullName = $AppxPackage.PackageFullName PackageFullName = $AppxPackage.PackageFullName
# Sometimes there's more than one package presented in Windows with the same package name like {Microsoft Teams, Microsoft Teams} and we need to display one the first one a window # Sometimes there's more than one package presented in Windows with the same package name like {Microsoft Teams, Microsoft Teams} and we need to display the first one
DisplayName = $PackageId.DisplayName | Select-Object -First 1 DisplayName = $PackageId.DisplayName | Select-Object -First 1
} }
} }
@ -12163,10 +12109,12 @@ public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
`$Process.Start() | Out-Null `$Process.Start() | Out-Null
"@ "@
# Create the "Windows Cleanup" task # Create "Windows Cleanup" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $CleanupTask" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $CleanupTask"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Parameters = @{ $Parameters = @{
TaskName = "Windows Cleanup" TaskName = "Windows Cleanup"
TaskPath = "Sophia" TaskPath = "Sophia"
@ -12314,9 +12262,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" -Value $ToastNotification -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" -Value $ToastNotification -Encoding Default -Force
# Create the "Windows Cleanup Notification" task # Create the "Windows Cleanup Notification" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\Windows_Cleanup_Notification.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 30 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 30 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "Windows Cleanup Notification" TaskName = "Windows Cleanup Notification"
@ -12624,9 +12574,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" -Value $SoftwareDistributionTask -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" -Value $SoftwareDistributionTask -Encoding Default -Force
# Create the "SoftwareDistribution" task # Create the "SoftwareDistribution" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\SoftwareDistributionTask.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "SoftwareDistribution" TaskName = "SoftwareDistribution"
@ -12941,9 +12893,11 @@ CreateObject("Wscript.Shell").Run "powershell.exe -ExecutionPolicy Bypass -NoPro
Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" -Value $TempTask -Encoding Default -Force Set-Content -Path "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" -Value $TempTask -Encoding Default -Force
# Create the "Temp" task # Create the "Temp" task
# We cannot create a schedule task if %COMPUTERNAME% is equal to %USERNAME%, so we have to use a "$env:COMPUTERNAME\$env:USERNAME" method
# https://github.com/PowerShell/PowerShell/issues/21377
$Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs" $Action = New-ScheduledTaskAction -Execute wscript.exe -Argument "$env:SystemRoot\System32\Tasks\Sophia\TempTask.vbs"
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest $Principal = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" -RunLevel Highest
$Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 60 -At 9pm $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 60 -At 9pm
$Parameters = @{ $Parameters = @{
TaskName = "Temp" TaskName = "Temp"

12
src/Sophia_Script_for_Windows_11_PowerShell_7/Sophia.ps1

@ -5,8 +5,7 @@
Version: v6.6.2 Version: v6.6.2
Date: 06.03.2024 Date: 06.03.2024
Copyright (c) 20142024 farag Copyright (c) 20142024 farag, Inestic & lowl1f3
Copyright (c) 20192024 farag & Inestic
Thanks to all https://forum.ru-board.com members involved Thanks to all https://forum.ru-board.com members involved
@ -54,6 +53,7 @@
.LINK Authors .LINK Authors
https://github.com/farag2 https://github.com/farag2
https://github.com/Inestic https://github.com/Inestic
https://github.com/lowl1f3
#> #>
#Requires -RunAsAdministrator #Requires -RunAsAdministrator
@ -69,7 +69,7 @@ param
Clear-Host Clear-Host
$Host.UI.RawUI.WindowTitle = "Sophia Script for Windows 11 v6.6.2 (PowerShell 7) | Made with $([System.Char]::ConvertFromUtf32(0x1F497)) of Windows | $([System.Char]0x00A9) farag & Inestic, 2014$([System.Char]0x2013)2024" $Host.UI.RawUI.WindowTitle = "Sophia Script for Windows 11 v6.6.2 (PowerShell 7) | Made with $([System.Char]::ConvertFromUtf32(0x1F497)) of Windows | $([System.Char]0x00A9) farag, Inestic & lowl1f3, 2014$([System.Char]0x2013)2024"
Remove-Module -Name Sophia -Force -ErrorAction Ignore Remove-Module -Name Sophia -Force -ErrorAction Ignore
@ -990,12 +990,12 @@ DefaultTerminalApp -WindowsTerminal
InstallVCRedist InstallVCRedist
<# <#
Install the latest .NET Desktop Runtime 6, 7, 8 x64 Install the latest .NET Desktop Runtime 6, 8 x64
Установить последнюю версию .NET Desktop Runtime 6, 7, 8 x64 Установить последнюю версию .NET Desktop Runtime 6, 8 x64
https://dotnet.microsoft.com/en-us/download/dotnet https://dotnet.microsoft.com/en-us/download/dotnet
#> #>
InstallDotNetRuntimes -Runtimes NET6x64, NET7x64, NET8x64 InstallDotNetRuntimes -Runtimes NET6x64, NET8x64
# Enable proxying only blocked sites from the unified registry of Roskomnadzor. The function is applicable for Russia only # Enable proxying only blocked sites from the unified registry of Roskomnadzor. The function is applicable for Russia only
# Включить проксирование только заблокированных сайтов из единого реестра Роскомнадзора. Функция применима только для России # Включить проксирование только заблокированных сайтов из единого реестра Роскомнадзора. Функция применима только для России

Loading…
Cancel
Save