diff --git a/Sophia/PowerShell 7.x/Sophia.ps1 b/Sophia/PowerShell 7.x/Sophia.ps1 index ed92cf3b..bdcbc1b1 100644 --- a/Sophia/PowerShell 7.x/Sophia.ps1 +++ b/Sophia/PowerShell 7.x/Sophia.ps1 @@ -2,8 +2,8 @@ .SYNOPSIS Default preset file for "Windows 10 Sophia Script" - Version: v5.6 - Date: 02.03.2021 + Version: v5.7 + Date: 05.03.2021 Copyright (c) 2015–2021 farag & oZ-Zo https://github.com/farag2 @@ -57,7 +57,7 @@ param Clear-Host -$Host.UI.RawUI.WindowTitle = "Windows 10 Sophia Script v5.6 | $([char]0x00A9) farag & oz-zo, 2015–2021" +$Host.UI.RawUI.WindowTitle = "Windows 10 Sophia Script v5.7 | $([char]0x00A9) farag & oz-zo, 2015–2021" Remove-Module -Name Sophia -Force -ErrorAction Ignore Import-Module -Name $PSScriptRoot\Sophia.psd1 -PassThru -Force @@ -348,11 +348,11 @@ FileTransferDialog -Detailed # FileTransferDialog -Compact # Expand the File Explorer ribbon -# Развернуть ленут проводника +# Развернуть ленту проводника FileExplorerRibbon -Expanded # Minimize the File Explorer ribbon (default value) -# Свернуть ленут проводника (значение по умолчанию) +# Свернуть ленту проводника (значение по умолчанию) # FileExplorerRibbon -Minimized # Display the recycle bin files delete confirmation @@ -415,6 +415,14 @@ TrayIcons -Show # Не отображать все значки в области уведомлений (значение по умолчанию) # TrayIcons -Hide +# Hide the Meet Now icon in the notification area +# Скрыть иконку "Провести собрание" в трее +MeetNow -Hide + +# Show the Meet Now icon in the notification area +# Отобразить иконку "Провести собрание" в трее +# MeetNow -Show + # Unpin "Microsoft Edge" and "Microsoft Store" from the taskbar # Открепить Microsoft Edge и Microsoft Store от панели задач UnpinTaskbarEdgeStore @@ -1014,44 +1022,44 @@ GPUScheduling -Enable #region Scheduled tasks <# - Create the "Windows Cleanup" scheduled task for cleaning up unused files and Windows updates - A minute before the task starts, a warning in the Windows action center will appear - The task runs every 90 days + Create the "Windows Cleanup" scheduled task for cleaning up Windows unused files and updates + A native interactive toast notification pops up every 30 days + The task runs every 30 days - Создать задачу "Windows Cleanup" по очистке неиспользуемых файлов и обновлений Windows в Планировщике задач - За минуту до выполнения задачи в Центре уведомлений Windows появится предупреждение - Задача выполняется каждые 90 дней + Создать задачу "Windows Cleanup" по очистке неиспользуемых файлов и обновлений Windows в Планировщике заданий + Нативный интерактивный тост всплывает каждые 30 дней + Задача выполняется каждые 30 дней #> -CleanUpTask -Register +CleanupTask -Register -# Delete the "Windows Cleanup" scheduled task for cleaning up unused files and Windows updates -# Удалить задачу "Windows Cleanup" по очистке неиспользуемых файлов и обновлений Windows из Планировщика задач -# CleanUpTask -Delete +# Delete the "Windows Cleanup" and "Windows Cleanup Notification" scheduled tasks for cleaning up Windows unused files and updates +# Удалить задачу "Windows Cleanup" и "Windows Cleanup Notification" по очистке неиспользуемых файлов и обновлений Windows из Планировщика заданий +# CleanupTask -Delete <# Create the "SoftwareDistribution" scheduled task for cleaning up the %SystemRoot%\SoftwareDistribution\Download folder - The task runs on Thursdays every 4 weeks + The task runs every 90 days - Создать задачу "SoftwareDistribution" по очистке папки %SystemRoot%\SoftwareDistribution\Download в Планировщике задач - Задача выполняется по четвергам каждую 4 неделю + Создать задачу "SoftwareDistribution" по очистке папки %SystemRoot%\SoftwareDistribution\Download в Планировщике заданий + Задача выполняется каждые 90 дней #> SoftwareDistributionTask -Register # Delete the "SoftwareDistribution" scheduled task for cleaning up the %SystemRoot%\SoftwareDistribution\Download folder -# Удалить задачу "SoftwareDistributionp" по очистке папки %SystemRoot%\SoftwareDistribution\Download из Планировщика задач +# Удалить задачу "SoftwareDistribution" по очистке папки %SystemRoot%\SoftwareDistribution\Download из Планировщика заданий # SoftwareDistributionTask -Delete <# Create the "Temp" scheduled task for cleaning up the %TEMP% folder - The task runs every 62 days + The task runs every 60 days - Создать задачу "Temp" в Планировщике задач по очистке папки %TEMP% - Задача выполняется каждые 62 дня + Создать задачу "Temp" в Планировщике заданий по очистке папки %TEMP% + Задача выполняется каждые 60 дней #> TempTask -Register # Delete the "Temp" scheduled task for cleaning up the %TEMP% folder -# Удалить задачу "Temp" по очистке папки %TEMP% из Планировщика задач +# Удалить задачу "Temp" по очистке папки %TEMP% из Планировщика заданий # TempTask -Delete #endregion Scheduled tasks diff --git a/Sophia/PowerShell 7.x/Sophia.psd1 b/Sophia/PowerShell 7.x/Sophia.psd1 index 6676d702..45581eb7 100644 Binary files a/Sophia/PowerShell 7.x/Sophia.psd1 and b/Sophia/PowerShell 7.x/Sophia.psd1 differ diff --git a/Sophia/PowerShell 7.x/Sophia.psm1 b/Sophia/PowerShell 7.x/Sophia.psm1 index 6a18b2a3..7ae2a2e9 100644 --- a/Sophia/PowerShell 7.x/Sophia.psm1 +++ b/Sophia/PowerShell 7.x/Sophia.psm1 @@ -2,8 +2,8 @@ .SYNOPSIS "Windows 10 Sophia Script" is a PowerShell module for Windows 10 fine-tuning and automating the routine tasks - Version: v5.6 - Date: 02.03.2021 + Version: v5.7 + Date: 05.03.2021 Copyright (c) 2015–2021 farag & oZ-Zo https://github.com/farag2 @@ -105,6 +105,7 @@ function Checkings "1" { Write-Warning -Message $Localization.ControlledFolderAccessDisabled + $Script:ControlledFolderAccess = $true Set-MpPreference -EnableControlledFolderAccess Disabled @@ -2423,6 +2424,77 @@ function TrayIcons } } +<# + .SYNOPSIS + Configure the Meet Now icon in the notification area + + .PARAMETER Hide + Hide the Meet Now icon in the notification area + + .PARAMETER Show + Show the Meet Now icon in the notification area + + .EXAMPLE + MeetNow -Hide + + .EXAMPLE + MeetNow -Show + + .NOTES + Current user only +#> +function MeetNow +{ + param + ( + [Parameter( + Mandatory = $true, + ParameterSetName = "Show" + )] + [switch] + $Show, + + [Parameter( + Mandatory = $true, + ParameterSetName = "Hide" + )] + [switch] + $Hide + ) + + switch ($PSCmdlet.ParameterSetName) + { + "Show" + { + $Settings = Get-ItemPropertyValue -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects3 -Name Settings -ErrorAction Ignore + $Settings[9] = 0 + New-ItemProperty -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects3 -Name Settings -PropertyType Binary -Value $Settings -Force + } + "Hide" + { + $Settings = Get-ItemPropertyValue -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects3 -Name Settings -ErrorAction Ignore + $Settings[9] = 128 + New-ItemProperty -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects3 -Name Settings -PropertyType Binary -Value $Settings -Force + } + } + + # Save all opened folders in order to restore them after File Explorer restart + Clear-Variable -Name OpenedFolders -Force -ErrorAction Ignore + $OpenedFolders = {(New-Object -ComObject Shell.Application).Windows() | ForEach-Object -Process {$_.Document.Folder.Self.Path}}.Invoke() + + # In order for the changes to take effect the File Explorer process has to be restarted + Stop-Process -Name explorer -Force + + # Restoring closed folders + foreach ($OpenedFolder in $OpenedFolders) + { + if (Test-Path -Path $OpenedFolder) + { + Invoke-Item -Path $OpenedFolder + } + } +} + <# .SYNOPSIS Unpin "Microsoft Edge" and "Microsoft Store" from the taskbar @@ -5482,7 +5554,6 @@ public extern static int SHSetKnownFolderPath(ref Guid folderId, uint flags, Int } # Pictures - Write-Verbose -Message $Localization.PicturesDriveSelect -Verbose Write-Warning -Message $Localization.FilesWontBeMoved @@ -7203,6 +7274,7 @@ function EnableWSL2 Invoke-WebRequest @Parameters Write-Verbose -Message $Localization.WSLUpdateInstalling -Verbose + Start-Process -FilePath "$DownloadsFolder\wsl_update_x64.msi" -ArgumentList "/passive" -Wait Remove-Item -Path "$DownloadsFolder\wsl_update_x64.msi" -Force @@ -7649,6 +7721,12 @@ public static string GetString(uint strId) Start-Sleep -Seconds 3 + # Open the Start menu to load the new layout + $wshell = New-Object -ComObject WScript.Shell + $wshell.SendKeys("^{ESC}") + + Start-Sleep -Seconds 3 + # Enable changing the Start menu layout Remove-ItemProperty -Path HKCU:\SOFTWARE\Policies\Microsoft\Windows\Explorer -Name LockedStartLayout -Force -ErrorAction Ignore Remove-ItemProperty -Path HKCU:\SOFTWARE\Policies\Microsoft\Windows\Explorer -Name StartLayoutFile -Force -ErrorAction Ignore @@ -7658,6 +7736,10 @@ public static string GetString(uint strId) Stop-Process -Name StartMenuExperienceHost -Force -ErrorAction Ignore Start-Sleep -Seconds 3 + + # Open the Start menu to load the new layout + $wshell = New-Object -ComObject WScript.Shell + $wshell.SendKeys("^{ESC}") } } #endregion Start menu @@ -8391,26 +8473,26 @@ function GPUScheduling #region Scheduled tasks <# .SYNOPSIS - The "Windows Cleanup" scheduled task for cleaning up unused files and Windows updates + The "Windows Cleanup" scheduled task for cleaning up Windows unused files and updates .PARAMETER Register - Create the "Windows Cleanup" scheduled task for cleaning up unused files and Windows updates + Create the "Windows Cleanup" scheduled task for cleaning up Windows unused files and updates .PARAMETER Delete - Delete the "Windows Cleanup" scheduled task for cleaning up unused files and Windows updates + Delete the "Windows Cleanup" and "Windows Cleanup Notification" scheduled tasks for cleaning up Windows unused files and updates .EXAMPLE - CleanUpTask -Register + CleanupTask -Register .EXAMPLE - CleanUpTask -Delete + CleanupTask -Delete .NOTES - A minute before the task starts, a warning in the Windows action center will appear + A native interactive toast notification pops up every 30 days + The task runs every 30 days Current user - The task runs every 90 days #> -function CleanUpTask +function CleanupTask { param ( @@ -8470,23 +8552,9 @@ function CleanUpTask New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\$VolumeCache" -Name StateFlags1337 -PropertyType DWord -Value 2 -Force } - $TaskScript = @" -`$cleanmgr = """{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\cleanmgr.exe""" - -[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] -`$Template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText01) - -`$ToastXML = [xml]`$Template.GetXml() -`$ToastXML.GetElementsByTagName("""text""").AppendChild(`$ToastXML.CreateTextNode("""$($Localization.CleanUpTaskToast)""")) - -`$XML = New-Object -TypeName Windows.Data.Xml.Dom.XmlDocument -`$XML.LoadXml(`$ToastXML.OuterXml) -[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier(`$cleanmgr).Show(`$XML) - + $CleanupTask = @" Get-Process -Name cleanmgr | Stop-Process -Force -Start-Sleep -Seconds 60 - `$ProcessInfo = New-Object -TypeName System.Diagnostics.ProcessStartInfo `$ProcessInfo.FileName = """$env:SystemRoot\system32\cleanmgr.exe""" `$ProcessInfo.Arguments = """/sagerun:1337""" @@ -8549,17 +8617,95 @@ while (`$true) `$Process.Start() | Out-Null "@ - $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $TaskScript" - $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9am + # Create the "Windows Cleanup" task + $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $CleanupTask" $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest - $Description = $Localization.CleanUpTaskDescription $Parameters = @{ "TaskName" = "Windows Cleanup" "TaskPath" = "Sophia Script" "Principal" = $Principal "Action" = $Action - "Description" = $Description + "Description" = $Localization.CleanupTaskDescription + "Settings" = $Settings + } + Register-ScheduledTask @Parameters -Force + + # Persist the Settings notifications to prevent to immediately disappear from Action Center + if (-not (Test-Path -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Notifications\Settings\windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel")) + { + New-Item -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Notifications\Settings\windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel" -Force + } + New-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Notifications\Settings\windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel" -Name ShowInActionCenter -PropertyType DWORD -Value 1 -Force + + # Register the "WindowsCleanup" protocol to be able to run the scheduled task upon clicking on the "Run" button + if (-not (Test-Path -Path Registry::HKEY_CLASSES_ROOT\WindowsCleanup)) + { + New-Item -Path Registry::HKEY_CLASSES_ROOT\WindowsCleanup -Force + } + New-itemproperty -Path Registry::HKEY_CLASSES_ROOT\WindowsCleanup -Name "(Default)" -PropertyType String -Value "url:WindowsCleanup" -Force + New-itemproperty -Path Registry::HKEY_CLASSES_ROOT\WindowsCleanup -Name "URL Protocol" -Value "" -Force + New-itemproperty -Path Registry::HKEY_CLASSES_ROOT\WindowsCleanup -Name EditFlags -PropertyType DWord -Value 2162688 -Force + if (-not (Test-Path -Path Registry::HKEY_CLASSES_ROOT\Shell\Open\command)) + { + New-item -Path Registry::HKEY_CLASSES_ROOT\WindowsCleanup\Shell\Open\command -Force + } + # If "Run" clicked run the "Windows Cleanup" task + New-itemproperty -Path Registry::HKEY_CLASSES_ROOT\WindowsCleanup\Shell\Open\command -Name "(Default)" -PropertyType String -Value 'powershell.exe -Command "& {Start-ScheduledTask -TaskPath ''\Sophia Script\'' -TaskName ''Windows Cleanup''}"' -Force + + $ToastNotification = @" +[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] +[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] + +[xml]`$ToastTemplate = @""" + + + + $($Localization.CleanupTaskNotificationTitle) + + + $($Localization.CleanupTaskNotificationEventTitle) + + + + + $($Localization.CleanupTaskNotificationEvent) + + + + + +"""@ + +$`ToastXml = [Windows.Data.Xml.Dom.XmlDocument]::New() +$`ToastXml.LoadXml($`ToastTemplate.OuterXml) + +$`ToastMessage = [Windows.UI.Notifications.ToastNotification]::New($`ToastXML) +[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("""windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel""").Show($`ToastMessage) +"@ + + # Create the "Windows Cleanup Notification" task + $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command $ToastNotification" + $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable + $Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest + $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 30 -At 9pm + $Parameters = @{ + "TaskName" = "Windows Cleanup Notification" + "TaskPath" = "Sophia Script" + "Principal" = $Principal + "Action" = $Action + "Description" = $Localization.CleanupNotificationTaskDescription "Settings" = $Settings "Trigger" = $Trigger } @@ -8568,6 +8714,7 @@ while (`$true) "Delete" { Unregister-ScheduledTask -TaskName "Windows Cleanup" -Confirm:$false + Unregister-ScheduledTask -TaskName "Windows Cleanup Notification" -Confirm:$false } } } @@ -8589,7 +8736,7 @@ while (`$true) SoftwareDistributionTask -Delete .NOTES - The task runs on Thursdays every 4 weeks + The task runs every 90 days Current user #> function SoftwareDistributionTask @@ -8620,7 +8767,7 @@ function SoftwareDistributionTask Get-ChildItem -Path $env:SystemRoot\SoftwareDistribution\Download -Recurse -Force | Remove-Item -Recurse -Force "@ $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument $Argument - $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9am + $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 90 -At 9pm $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -RunLevel Highest $Description = $Localization.FolderTaskDescription -f "$env:SystemRoot\SoftwareDistribution\Download" @@ -8659,7 +8806,7 @@ Get-ChildItem -Path $env:SystemRoot\SoftwareDistribution\Download -Recurse -Forc TempTask -Delete .NOTES - The task runs every 62 days + The task runs every 60 days Current user #> function TempTask @@ -8687,18 +8834,18 @@ function TempTask { $Argument = "Get-ChildItem -Path $env:TEMP -Force -Recurse | Remove-Item -Recurse -Force" $Action = New-ScheduledTaskAction -Execute powershell.exe -Argument $Argument - $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 62 -At 9am + $Trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 60 -At 9pm $Settings = New-ScheduledTaskSettingsSet -Compatibility Win8 -StartWhenAvailable $Principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -RunLevel Highest $Description = $Localization.FolderTaskDescription $Parameters = @{ - "TaskName" = "Temp" - "TaskPath" = "Sophia Script" - "Principal" = $Principal - "Action" = $Action - "Description" = $Description - "Settings" = $Settings - "Trigger" = $Trigger + "TaskName" = "Temp" + "TaskPath" = "Sophia Script" + "Principal" = $Principal + "Action" = $Action + "Description" = $Description + "Settings" = $Settings + "Trigger" = $Trigger } Register-ScheduledTask @Parameters -Force } @@ -8820,7 +8967,7 @@ function RemoveAllowedAppsControlledFolder # Add a folder to the exclusion from Microsoft Defender scanning function AddDefenderExclusionFolder { - $Title = $Localization.DefenderTitle + $Title = "Microsoft Defender" $Message = $Localization.DefenderExclusionFolderRequest $Add = $Localization.Add $Skip = $Localization.Skip