Sophia script for windows 10 как пользоваться

https://twitter.com/tea_head_Чуть больше года назад выкладывал свой скрипт по автоматизации настройки Windows 10. Давеча переписал Windows 10 Sophia Script в вид...
https://twitter.com/tea_head_
https://twitter.com/tea_head_

Чуть больше года назад выкладывал свой скрипт по автоматизации настройки Windows 10. Давеча переписал Windows 10 Sophia Script в виде примитивного модуля на 11 000+ строк для одноразового использования.

Основные претензии к предыдущей версии были три:

  1. Никто не хотел лезть в 3 500 строк кода и комментировать тот или иной раздел, чтобы он в дальнейшем не выполнялся;

  2. Если необходимо было откатиться на значение по умолчанию, никто не мог разобраться, что именно надо делать.

  3. Невозможно было перевести команды на другой язык без правки кода. Начиная с версии 5.1, файлы локализации вынесены в отдельные файлы, что облегчит процесс перевода.

Теперь скрипт состоит из 2 файлов: непосредственно модуль и файл пресета к нему, не считая файлов локализации. Модуль разбит примерно на 270 функций: как для внесения изменений, так и его «отката».

Теперь можно открыть файл пресета, где будет список из всех имеющихся функций (с подробным описанием каждой), и закомментировать строку с функций с помощью знака #, чтобы эта функция не выполнялась, или, наоборот, убрать знак # перед ней, чтобы функция выполнялась. Повторюсь: практически на каждую функцию есть функция на возврат в состояние по умолчанию, как «из коробки».


Поддерживаемые версии

Windows 10 Sophia Script поддерживает только актуальные версии Windows 10

Версия

Ма́ркетинговое название

Билд

Архитектура

Выпуск

Версия скрипта

20H2

October 2020 Update

19042

x64

Home/Pro/Enterprise

5.9

2004

May 2020 Update

19041

x64

Home/Pro/Enterprise

5.9

1809

LTSC Enterprise 2019

17763

x64

Enterprise

5.1.2

Основные функции

  • Настройка уровня телеметрии и конфиденциальности;

  • Отключить задачи диагностического отслеживания;

  • Настроить интерфейс;

  • Удалить «правильно» OneDrive;

  • Изменить путь переменной среды для %TEMP% на %SystemDrive%Temp

  • Изменить программно расположение пользовательских папок;

    • Рабочий стол;

    • Документы;

    • Загрузки;

    • Музыка;

    • Изображения;

    • Видео;

    с помощью интерактивного меню с использованием стрелок вверх/вниз и клавиши Enter для подтверждения выбора;

  • Удалить UWP-приложения, отображая локализованные имена пакетов, используя всплывающую форму, написанную на WPF;

    • При нажатии на галочку «Для всех пользователей» динамически генерируется список UWP-приложений для всех пользователей, и наоборот;

  • Отключить компоненты Windows, отображая локализованные имена пакетов, используя всплывающую форму, написанную на WPF;

  • Удалить дополнительные компоненты Windows, отображая локализованные имена пакетов, используя всплывающую форму, написанную на WPF;

  • Зарегистрировать любое приложение, вычислив правильно хэш-сумму, и
    установить его как приложение по умолчанию для каких-либо расширений, избежав всплывающего окошка «Каким образом вы хотите открыть этот файл?»;

  • Скачать и установить Расширения для видео HEVC от производителя устройства напрямую с сервера Microsoft, используя парсер https://store.rg-adguard.net, чтобы появилась возможность открывать файлы .heic и .heif;

  • Установить и настроить WSL2;

  • Отключить дополнительные компоненты Windows, используя всплывающую форму, написанную на WPF;

  • Создать задачу в Планировщике задач по очистке неиспользуемых файлов и обновлений Windows;

    • Всплывет нативный интерактивный тост с предложением запустить задачу, отложить или отклонить (смотрите раздел «скриншоты»)

  • Создать задачи в Планировщике задач по очистке папок;

    • %SystemRoot%SoftwareDistributionDownload

    • %TEMP%

  • Открепить все ярлыки от начального экрана;

  • Закрепить ярлыки Панель управления, Устройства и принтеры и Windows PowerShell на начальном экране (без использования сторонних программ)

  • Включить контролируемый доступ к папкам и добавить защищенные папки, используя диалоговое меню;

  • Добавить папку в список исключений сканирования Microsoft Defender, используя диалоговое меню;

  • Добавить файлы в список исключений сканирования Microsoft Defender, используя диалоговое меню;

  • Обновить иконки рабочего стола, переменные среды, панель задач и симулировать нажатие F5 для обновления рабочего стола;

  • Множество твиков проводника, контекстного и прочего.

Скриншоты

Полный разбор работа скрипта (how-to; на английском)


Использование

  • Скачайте актуальную версию согласно редакции вашей ОС;

  • просмотрите весь файл пресета Sophia.ps1, чтобы настроить выполнение тех или иных функций. По умолчанию выполняются самые востребованные функции. Некоторые функции закомментированы по умолчанию;

    • Чтобы функция выполнялась, уберите символ # перед названием функции;

    • Чтобы функция не выполнялась, поставьте символ # перед названием функции;

  • Будучи в папке с файлами скрипта, нажмите на «Файл» в панели проводника, далее — «Запустить Windows PowerShell» — «Запустить Windows PowerShell от имени администратора»;

  • Установите временно политику запуска скриптов в PowerShell, чтобы иметь возможность запускать скрипты в целом;

    • Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force

  • Запустите скрипт с помощью;

    • Введи .Sophia.ps1 и Enter


Как выполнить конкрентную(ые) функцию(и) (пример):

.Sophia.ps1 -Functions CreateRestorePoint, "ScheduledTasks -Disable", "WindowsCapabilities -Uninstall"
Выделение кавычками функций с аргументами обязательно.
Вне зависимости введенных функций в качестве аргумента, сначала будет выполнена функция проверок Checkings, а в конце — функции Refresh и Errors.


Сторонние обзоры скрипта

Устаревшее видео касательно версии 4.x (с привязкой ко времени) от Chris Titus Tech :)

  • comss.ru

  • 4sysops.com

  • neowin.net

  • ghacks.net

  • deskmodder.de

Скачать с GitHub

Telegram https://t.me/sophia_chat

Windows 10 Sophia Script

Вот уже много лет я поддерживаю Sophia Script for Windows, крупнейшего PowerShell-модуля на GitHub для тонкой настройки Windows 10 и Windows 11.

После бесконечных правок мы хотим показать вам SophiApp — графический наследних Sophia Script for Windows: бесплатная и полностью опенсорная программа для тонкой настройки Windows 10 и Windows 11.

И все эти время у меня была идея сделать ее графическую версию, чтобы показать пользователям, каким должен быть современный твикер для Windows, какие функции может в себе нести, а главное — посыл программы: настроить (а не оптимизировать) ОС официальным образом, задокументированным Microsoft, ничего не сломав и не обещая мнимое увеличение производительности, чем грешат аналогичные программы, вводя целенаправленно пользователей в заблуждение.

После бесконечных правок мы хотим показать вам SophiApp — графический наследних Sophia Script for Windows: бесплатная и полностью опенсорная программа для тонкой настройки Windows 10 и Windows 11.

К сожалению, она все еще далеко не идеальна, и уже пришло понимание, что нужна версия 2.0 с более современным UI и UX, но первый блин, вроде как, не оказался комом.

Программа все это время делалась на голом энтузиазме, и мы искренне хотим, чтобы пользователи Windows перестали воспринимать так называемые твикеры как что-то по определению вредное, не несущее пользы, а узнали, как можно настроить современные Windows 10 и 11, и что они в себе таят.

Скачать

И для любителей CLI: скачать всегда самую последнюю версию SophiApp, распаковать, удалить архив и открыть папку с программой автоматически. Просто вставьте команду в PowerShell (можно без прав администратора). Программа не будет автоматически запущена.

irm app.sophi.app -useb | iex

Сделали для вас Inestic и я.

Ключевые возможности

  • Динамически отрисовывающийся UI: все элемент НЕ захардкожены;
  • Больше 130 твиков;
  • SophiApp использует паттерн MVVM;
  • Поддержка многопоточности;
  • SophiApp проверяется статическим анализатором, лицензию на который предоставили в PVS-Studio (да, я прямо им писал:));
  • Все билды компилируются в облаки с использованием GitHub Actions. Вы можете сравнить хэш-сумму архива на странице релиза с хэш-суммой в облачной консоли на шаге «Compress Files», чтобы быть уверенным, что архив не подменялся после релиза (для открытия облачных логов вы должны было залогинены в учетную запись GitHub);
  • Приложение отображает текущее состояние каждой функции в UI;
  • Описание к функциям;
  • Имеет встроенный движок поиска по заголовкам и описанию;
  • Программа поддерживает темную и светлую темы. Может менять тему мгновенно в зависимости от выставляемого режима приложений в Windows;
  • Настроить конфиденциальность и телеметрию;
  • Выключить заданий диагностического характера в Планировщике заданий;
  • Настроить UI и персонализацию;
  • Правильно и до конца удалить OneDrive, не нарушив целостность ОС;
  • Удалить UWP-приложения, отображая локализированные имена пакетов. Список приложений рендерится динамически, используя локальные иконки самих приложений. Ничего не захардкожено;
  • Скачать и установить расширение «HEVC Video Extensions from Device Manufacturer» из Microsoft Store с сервера Microsoft, используя парсер от https://store. rg-adguard. net, чтобы появилась возможность открывать файлы формата. heic и. heif;
  • Создать задание «Windows Cleanup« по очистке неиспользуемых файлов и обновлений Windows в Планировщике заданий. Перед началом очистки всплывет нативный тост, где вы сможете выбрать отложить ли, отменить или запустить задание;
  • Создать задание «SoftwareDistribution» по очистке папок %SystemRoot% SoftwareDistributionDownload и %TEMP% в Планировщике заданий;
  • Настроить безопасность Windows;
  • Огромное количество твиков по кастомизации проводника и контекстного меню;
  • Все настройки проводятся задокументированными возможностями ОС, что исключает шанс навредить работоспособности системе.

Системные требования

  • Windows 10 2004/20H2/21H1/21H2 x64;
  • Windows 11 21H2;
  • Windows 11 Insider Preview (Beta- и Dev-каналы) (22509+).
  • Чтобы запустить SophiApp, вы должны быть единственным вошедшим пользователем с права администратора на ПК
  • Правильная работоспособность программы гарантируется лишь в при использовании оригинального образа ОС. SophiApp может не работать на сборках Windows. Особенно если сборка была сделана сборщиками, которые целенаправленно ломают Microsoft Defender и выключает телеметрию, удаляя с корнем системные компоненты. То же касается и сторонних твикеров.
  • Необходимы сборки 1151 и 556 (и выше) для Windows 10 и Windows 11 соответственно.
  • Некоторые функции зависят от доступа в интернет. При отсутствии последнего соответствующие функции будут скрыты в UI до тех пор, пока не появится доступ;
  • Вы можете включить скрытые функции в UI, включив «Расширенные настройки» в Настройках программы. Скрытые функции будут помечены соответствующей шестеренкой;
  • После закрытия SophiApp будет автоматически создан лог-файл, который можно прикрепить, если возникла проблема, чтобы помочь нам понять, что пошло не так. Лог-файл не содержит никакую персональную информацию.

При запуске будет проведена проверка на наличие проблем в ОС, о чем пользователь будет уведомлен.

  • Некоторые функции зависят от доступа в интернет. При отсутствии последнего соответствующие функции будут скрыты в UI до тех пор, пока не появится доступ;
  • Вы можете включить скрытые функции в UI, включив «Расширенные настройки» в Настройках программы. Скрытые функции будут помечены соответствующей шестеренкой;
  • После закрытия SophiApp будет автоматически создан лог-файл, который можно прикрепить, если возникла проблема, чтобы помочь нам понять, что пошло не так. Лог-файл не содержит никакую персональную информацию.

Скриншоты

Когда нечего делать и добавляешь пульсирующее SVG-сердце

Локализация

Кроме русского, SophiApp переведена носителями на английский, украинский, немецкий и итальянский языки.

Журнал изменений

  • SophiApp. exe
  • Microsoft. Deployment. WindowsInstaller. dll
  • Microsoft. Dism. dll
  • Microsoft. Win32.TaskScheduler. dll
  • Microsoft. Win32.TaskScheduler. resources. dll
  • Newtonsoft. Json. dll
  • System. Management. Automation. dll
  • Windows. winmd

Если вам интересны новости ИТ и технологий из первоисточников на английском, можете подписать на мой новостной канал Sophia News, а обсудить их в чате Sophia Chat, где можно задать вопросы по SophiApp, Sophia Script, ПК, ОС, а также попросить написать код для автоматизации чего-либо на PowerShell.

Все баги и пожелания можете оставлять здесь или создать Issue на GitHub.

This page also in:

Sophia Script for Windows

Sophia Script





Telegram
Telegram

Discord


 

 

 

 

 

 

 

 

 

 

 




Donations

System Requirements

Screenshots

Videos

Key features

How to use

How to translate

SophiApp

Changelog

About Sophia Script

Typing SVG

Note: Sophia Script for Windows is the largest PowerShell module on GitHub for Windows 10 & Windows 11 fine-tuning and automating the routine tasks. It offers more than 150 unique tweaks, and shows how Windows can be configured without making any harm to it.

Before running

Note: Due to the fact that the script includes more than 150 functions with different arguments, you must read the entire Sophia.ps1 carefully and comment out/uncomment those functions that you do/do not want to be executed (without need to edit the code), or use Wrapper. Every tweak in the preset file has its’ corresponding function to restore the default settings. Running the script is best done on a fresh install because running it on wrong tweaked system may result in errors occurring.

Donations


ko-fi
USDT (TRC20)
TQtMjdocUWbKAeg1kLtB4ApjAVHt1v8Rtf

System Requirements

Version Marketing name Build Arch Editions
Windows 11 Insider Preview 23H2 2023 Update 22509+ Home/Pro/Enterprise
Windows 11 22H2 2022 Update 22621.963+ Home/Pro/Enterprise
Windows 11 21H2 22000.1335+ Home/Pro/Enterprise
Windows 10 22H2 2022 Update 19045.2364+ x64 Home/Pro/Enterprise
Windows 10 21H2 October 2021 Update 19044.2364+ x64 Home/Pro/Enterprise
Windows 10 21H2 Enterprise LTSC 2021 October 2021 Update 19044.2364+ x64 Enterprise
Windows 10 1809 Enterprise LTSC 2019 October 2018 Update 17763.3770+ x64 Enterprise

Warning

  • It’s allowed to be logged in as one admin user only during application startup.
  • 🔥🔥🔥Sophia Script for Windows may not work on a homebrew Windows. Especially, if the homebrew image was created by OS makers being all thumbs who break Microsoft Defender and disable OS telemetry by purposely uprooting system components

Key features

  • Set up Privacy & Telemetry;
  • Enable DNS-over-HTTPS for IPv4;
  • Turn off diagnostics tracking scheduled tasks with pop-up form written in WPF;
  • Set up UI & Personalization;
  • Uninstall OneDrive «correctly»;
  • Interactive prompts;
  • The TAB completion for functions and their arguments (if using the Functions.ps1 file);
  • Change %TEMP% environment variable path to %SystemDrive%Temp;
  • Change location of the user folders programmatically (without moving user files) within interactive menu using arrows to select a drive
    • «Desktop»
    • «Documents»
    • «Downloads»
    • «Music»
    • «Pictures»
    • «Videos»
  • Install free (light and dark) «Windows 11 Cursors Concept v2» cursors from Jepri Creations on-the-fly;
  • Uninstall UWP apps displaying packages names;
    • Generate installed UWP apps list dynamically
  • Restore the default uninstalled UWP apps for current user displaying localized packages names;
  • The TAB autocompletion for function and its’ arguments by typing first letters;
  • Disable Windows features displaying friendly packages names with pop-up form written in WPF;
  • Uninstall Windows capabilities displaying friendly packages names with pop-up form written in WPF;
  • Download and install the HEVC Video Extensions from Device Manufacturer to be able to open .heic and .heif formats;
  • Register app, calculate hash, and set as default for specific extension without the «How do you want to open this» pop-up using special function;
  • Install any supported Linux distrobution for WSL displaying friendly distro names with pop-up form written in WPF;
  • Create a Windows Cleanup and Windows Cleanup Notification scheduled tasks for Windows cleaning up unused files and updates;
    • A native toast notification will be displayed where you can choose to snooze, run the cleanup task or dismiss
  • Create tasks in the Task Scheduler to clear
    • %SystemRoot%SoftwareDistributionDownload
    • %TEMP%
  • Pin shortcuts to Start via pure PowerShell
    • Three shortcuts are pre-configured to be pinned: Control Panel, «old style» Devices and Printers, and Windows PowerShell
  • Unpin all Start menu tiles;
  • Turn on Controlled folder access and add protected folders using dialog menu;
  • Add exclusion folder from Microsoft Defender Antivirus scanning using dialog menu;
  • Add exclusion file from Microsoft Defender Antivirus scanning using dialog menu;
  • Refresh desktop icons, environment variables and taskbar without restarting File Explorer;
  • Configure the Windows security;
  • Many more File Explorer and context menu «deep» tweaks.

Screenshots

The TAB autocomplete. Read more here

Image

Change user folders location programmatically using the interactive menu

Image

Localized UWP packages names

Image Image

Localized Windows features names

Image Image

Download and install any supported Linux distribution in automatic mode

Image

Native interactive toasts for the scheduled tasks

Image

@BenchTweakGaming Sophia Script Wrapper

Wrapper

Videos

YT

YT YT

How to use

  • Choose the right script version for your Windows;

  • Download up-to-date version;

  • Expand the archive;

  • Open folder with the expanded archive;

  • Look through the Sophia.ps1 file to configure functions that you want to be run;

    • Place the «#» char before function if you don’t want it to be run.
    • Remove the «#» char before function if you want it to be run.
  • On Windows 10 click File in File Explorer, hover over Open Windows PowerShell, and select Open Windows PowerShell as Administrator (how-to with screenshots)

  • On Windows 11 right-click on the Windows icon and select Windows Terminal (Admin). Then change the current location

    Set-Location -Path "PathToSophiaFolder"
  • Set execution policy to be able to run scripts only in the current PowerShell session

    Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
  • Type .Sophia.ps1 Enter to run the whole preset file.

How to use Wrapper

  • Download and expand the archive;
  • Run SophiaScriptWrapper.exe and import Sophia.ps1;
    • The Wrapper has a real time UI rendering;
  • Configure every function;
  • Open the Console Output tab and press Run PowerShell.

How to run the specific function(s)

To run the specific function(s) dot source the Functions.ps1 file first:

# With a dot at the beginning
. .Functions.ps1
  • Now you can do like this (the quotation marks required)
Sophia -Functions<kbd>TAB</kbd>
Sophia -Functions temp<kbd>TAB</kbd>
Sophia -Functions unin<kbd>TAB</kbd>
Sophia -Functions uwp<kbd>TAB</kbd>
Sophia -Functions "DiagTrackService -Disable", "DiagnosticDataLevel -Minimal", UninstallUWPApps

UninstallUWPApps, "PinToStart -UnpinAll"

Or use an old-style format without the TAB functions autocomplete (the quotation marks required)

.Sophia.ps1 -Functions CreateRestorePoint, "ScheduledTasks -Disable", "WindowsCapabilities -Uninstall"

How to download Sophia Script via PowerShell

  • Download the always latest Sophia Script archive by invoking (not as administrator too) in PowerShell
irm script.sophi.app -useb | iex
  • The command will download and expand the latest Sophia Script archive (without running) according which Windows and PowerShell versions it is run on. If you run it on, e.g., Windows 11 via PowerShell 5.1, it will download Sophia Script for Windows 11 PowerShell 5.1.

How to translate

  • Get your OS UI culture by invoking $PSUICulture in PowerShell;
  • Create a folder with the UI culture name;
  • Place your localized Sophia.psd1 file into this folder.

Media

  • Discord
  • Telegram discussion group
  • Telegram channel
  • Ru-Board
  • rutracker
  • My Digital Life
  • 4sysops
  • gHacks Technology News
  • Neowin: Tech News, Reviews & Betas
  • Comss.ru
  • Habr
  • Deskmodder.d
  • PCsoleil Informatique
  • Reddit (archived)
    • PM me

SophiApp Community Edition (C# + WPF)

SophiApp is in active development 🚀

Image
Image

This page also in:

Sophia Script for Windows

Sophia Script





Telegram
Telegram

Discord


 

 

 

 

 

 

 

 

 

 

 




Donations

System Requirements

Screenshots

Videos

Key features

How to use

How to translate

SophiApp

Changelog

About Sophia Script

Typing SVG

Note: Sophia Script for Windows is the largest PowerShell module on GitHub for Windows 10 & Windows 11 fine-tuning and automating the routine tasks. It offers more than 150 unique tweaks, and shows how Windows can be configured without making any harm to it.

Before running

Note: Due to the fact that the script includes more than 150 functions with different arguments, you must read the entire Sophia.ps1 carefully and comment out/uncomment those functions that you do/do not want to be executed (without need to edit the code), or use Wrapper. Every tweak in the preset file has its’ corresponding function to restore the default settings. Running the script is best done on a fresh install because running it on wrong tweaked system may result in errors occurring.

Donations


ko-fi
USDT (TRC20)
TQtMjdocUWbKAeg1kLtB4ApjAVHt1v8Rtf

System Requirements

Version Marketing name Build Arch Editions
Windows 11 Insider Preview 23H2 2023 Update 22509+ Home/Pro/Enterprise
Windows 11 22H2 2022 Update 22621.963+ Home/Pro/Enterprise
Windows 11 21H2 22000.1335+ Home/Pro/Enterprise
Windows 10 22H2 2022 Update 19045.2364+ x64 Home/Pro/Enterprise
Windows 10 21H2 October 2021 Update 19044.2364+ x64 Home/Pro/Enterprise
Windows 10 21H2 Enterprise LTSC 2021 October 2021 Update 19044.2364+ x64 Enterprise
Windows 10 1809 Enterprise LTSC 2019 October 2018 Update 17763.3770+ x64 Enterprise

Warning

  • It’s allowed to be logged in as one admin user only during application startup.
  • 🔥🔥🔥Sophia Script for Windows may not work on a homebrew Windows. Especially, if the homebrew image was created by OS makers being all thumbs who break Microsoft Defender and disable OS telemetry by purposely uprooting system components

Key features

  • Set up Privacy & Telemetry;
  • Enable DNS-over-HTTPS for IPv4;
  • Turn off diagnostics tracking scheduled tasks with pop-up form written in WPF;
  • Set up UI & Personalization;
  • Uninstall OneDrive «correctly»;
  • Interactive prompts;
  • The TAB completion for functions and their arguments (if using the Functions.ps1 file);
  • Change %TEMP% environment variable path to %SystemDrive%Temp;
  • Change location of the user folders programmatically (without moving user files) within interactive menu using arrows to select a drive
    • «Desktop»
    • «Documents»
    • «Downloads»
    • «Music»
    • «Pictures»
    • «Videos»
  • Install free (light and dark) «Windows 11 Cursors Concept v2» cursors from Jepri Creations on-the-fly;
  • Uninstall UWP apps displaying packages names;
    • Generate installed UWP apps list dynamically
  • Restore the default uninstalled UWP apps for current user displaying localized packages names;
  • The TAB autocompletion for function and its’ arguments by typing first letters;
  • Disable Windows features displaying friendly packages names with pop-up form written in WPF;
  • Uninstall Windows capabilities displaying friendly packages names with pop-up form written in WPF;
  • Download and install the HEVC Video Extensions from Device Manufacturer to be able to open .heic and .heif formats;
  • Register app, calculate hash, and set as default for specific extension without the «How do you want to open this» pop-up using special function;
  • Install any supported Linux distrobution for WSL displaying friendly distro names with pop-up form written in WPF;
  • Create a Windows Cleanup and Windows Cleanup Notification scheduled tasks for Windows cleaning up unused files and updates;
    • A native toast notification will be displayed where you can choose to snooze, run the cleanup task or dismiss
  • Create tasks in the Task Scheduler to clear
    • %SystemRoot%SoftwareDistributionDownload
    • %TEMP%
  • Pin shortcuts to Start via pure PowerShell
    • Three shortcuts are pre-configured to be pinned: Control Panel, «old style» Devices and Printers, and Windows PowerShell
  • Unpin all Start menu tiles;
  • Turn on Controlled folder access and add protected folders using dialog menu;
  • Add exclusion folder from Microsoft Defender Antivirus scanning using dialog menu;
  • Add exclusion file from Microsoft Defender Antivirus scanning using dialog menu;
  • Refresh desktop icons, environment variables and taskbar without restarting File Explorer;
  • Configure the Windows security;
  • Many more File Explorer and context menu «deep» tweaks.

Screenshots

The TAB autocomplete. Read more here

Image

Change user folders location programmatically using the interactive menu

Image

Localized UWP packages names

Image Image

Localized Windows features names

Image Image

Download and install any supported Linux distribution in automatic mode

Image

Native interactive toasts for the scheduled tasks

Image

@BenchTweakGaming Sophia Script Wrapper

Wrapper

Videos

YT

YT YT

How to use

  • Choose the right script version for your Windows;

  • Download up-to-date version;

  • Expand the archive;

  • Open folder with the expanded archive;

  • Look through the Sophia.ps1 file to configure functions that you want to be run;

    • Place the «#» char before function if you don’t want it to be run.
    • Remove the «#» char before function if you want it to be run.
  • On Windows 10 click File in File Explorer, hover over Open Windows PowerShell, and select Open Windows PowerShell as Administrator (how-to with screenshots)

  • On Windows 11 right-click on the Windows icon and select Windows Terminal (Admin). Then change the current location

    Set-Location -Path "PathToSophiaFolder"
  • Set execution policy to be able to run scripts only in the current PowerShell session

    Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
  • Type .Sophia.ps1 Enter to run the whole preset file.

How to use Wrapper

  • Download and expand the archive;
  • Run SophiaScriptWrapper.exe and import Sophia.ps1;
    • The Wrapper has a real time UI rendering;
  • Configure every function;
  • Open the Console Output tab and press Run PowerShell.

How to run the specific function(s)

To run the specific function(s) dot source the Functions.ps1 file first:

# With a dot at the beginning
. .Functions.ps1
  • Now you can do like this (the quotation marks required)
Sophia -Functions<kbd>TAB</kbd>
Sophia -Functions temp<kbd>TAB</kbd>
Sophia -Functions unin<kbd>TAB</kbd>
Sophia -Functions uwp<kbd>TAB</kbd>
Sophia -Functions "DiagTrackService -Disable", "DiagnosticDataLevel -Minimal", UninstallUWPApps

UninstallUWPApps, "PinToStart -UnpinAll"

Or use an old-style format without the TAB functions autocomplete (the quotation marks required)

.Sophia.ps1 -Functions CreateRestorePoint, "ScheduledTasks -Disable", "WindowsCapabilities -Uninstall"

How to download Sophia Script via PowerShell

  • Download the always latest Sophia Script archive by invoking (not as administrator too) in PowerShell
irm script.sophi.app -useb | iex
  • The command will download and expand the latest Sophia Script archive (without running) according which Windows and PowerShell versions it is run on. If you run it on, e.g., Windows 11 via PowerShell 5.1, it will download Sophia Script for Windows 11 PowerShell 5.1.

How to translate

  • Get your OS UI culture by invoking $PSUICulture in PowerShell;
  • Create a folder with the UI culture name;
  • Place your localized Sophia.psd1 file into this folder.

Media

  • Discord
  • Telegram discussion group
  • Telegram channel
  • Ru-Board
  • rutracker
  • My Digital Life
  • 4sysops
  • gHacks Technology News
  • Neowin: Tech News, Reviews & Betas
  • Comss.ru
  • Habr
  • Deskmodder.d
  • PCsoleil Informatique
  • Reddit (archived)
    • PM me

SophiApp Community Edition (C# + WPF)

SophiApp is in active development 🚀

Image
Image

This page also in:

Sophia Script for Windows

Sophia Script





Telegram
Telegram

Discord


 

 

 

 

 

 

 

 

 

 

 




Donations

System Requirements

Screenshots

Videos

Key features

How to use

How to translate

SophiApp

Changelog

About Sophia Script

Typing SVG

Note: Sophia Script for Windows is the largest PowerShell module on GitHub for Windows 10 & Windows 11 fine-tuning and automating the routine tasks. It offers more than 150 unique tweaks, and shows how Windows can be configured without making any harm to it.

Before running

Note: Due to the fact that the script includes more than 150 functions with different arguments, you must read the entire Sophia.ps1 carefully and comment out/uncomment those functions that you do/do not want to be executed (without need to edit the code), or use Wrapper. Every tweak in the preset file has its’ corresponding function to restore the default settings. Running the script is best done on a fresh install because running it on wrong tweaked system may result in errors occurring.

Donations


ko-fi
USDT (TRC20)
TQtMjdocUWbKAeg1kLtB4ApjAVHt1v8Rtf

System Requirements

Version Marketing name Build Arch Editions
Windows 11 Insider Preview 23H2 2023 Update 22509+ Home/Pro/Enterprise
Windows 11 22H2 2022 Update 22621.963+ Home/Pro/Enterprise
Windows 11 21H2 22000.1335+ Home/Pro/Enterprise
Windows 10 22H2 2022 Update 19045.2364+ x64 Home/Pro/Enterprise
Windows 10 21H2 October 2021 Update 19044.2364+ x64 Home/Pro/Enterprise
Windows 10 21H2 Enterprise LTSC 2021 October 2021 Update 19044.2364+ x64 Enterprise
Windows 10 1809 Enterprise LTSC 2019 October 2018 Update 17763.3770+ x64 Enterprise

Warning

  • It’s allowed to be logged in as one admin user only during application startup.
  • 🔥🔥🔥Sophia Script for Windows may not work on a homebrew Windows. Especially, if the homebrew image was created by OS makers being all thumbs who break Microsoft Defender and disable OS telemetry by purposely uprooting system components

Key features

  • Set up Privacy & Telemetry;
  • Enable DNS-over-HTTPS for IPv4;
  • Turn off diagnostics tracking scheduled tasks with pop-up form written in WPF;
  • Set up UI & Personalization;
  • Uninstall OneDrive «correctly»;
  • Interactive prompts;
  • The TAB completion for functions and their arguments (if using the Functions.ps1 file);
  • Change %TEMP% environment variable path to %SystemDrive%Temp;
  • Change location of the user folders programmatically (without moving user files) within interactive menu using arrows to select a drive
    • «Desktop»
    • «Documents»
    • «Downloads»
    • «Music»
    • «Pictures»
    • «Videos»
  • Install free (light and dark) «Windows 11 Cursors Concept v2» cursors from Jepri Creations on-the-fly;
  • Uninstall UWP apps displaying packages names;
    • Generate installed UWP apps list dynamically
  • Restore the default uninstalled UWP apps for current user displaying localized packages names;
  • The TAB autocompletion for function and its’ arguments by typing first letters;
  • Disable Windows features displaying friendly packages names with pop-up form written in WPF;
  • Uninstall Windows capabilities displaying friendly packages names with pop-up form written in WPF;
  • Download and install the HEVC Video Extensions from Device Manufacturer to be able to open .heic and .heif formats;
  • Register app, calculate hash, and set as default for specific extension without the «How do you want to open this» pop-up using special function;
  • Install any supported Linux distrobution for WSL displaying friendly distro names with pop-up form written in WPF;
  • Create a Windows Cleanup and Windows Cleanup Notification scheduled tasks for Windows cleaning up unused files and updates;
    • A native toast notification will be displayed where you can choose to snooze, run the cleanup task or dismiss
  • Create tasks in the Task Scheduler to clear
    • %SystemRoot%SoftwareDistributionDownload
    • %TEMP%
  • Pin shortcuts to Start via pure PowerShell
    • Three shortcuts are pre-configured to be pinned: Control Panel, «old style» Devices and Printers, and Windows PowerShell
  • Unpin all Start menu tiles;
  • Turn on Controlled folder access and add protected folders using dialog menu;
  • Add exclusion folder from Microsoft Defender Antivirus scanning using dialog menu;
  • Add exclusion file from Microsoft Defender Antivirus scanning using dialog menu;
  • Refresh desktop icons, environment variables and taskbar without restarting File Explorer;
  • Configure the Windows security;
  • Many more File Explorer and context menu «deep» tweaks.

Screenshots

The TAB autocomplete. Read more here

Image

Change user folders location programmatically using the interactive menu

Image

Localized UWP packages names

Image Image

Localized Windows features names

Image Image

Download and install any supported Linux distribution in automatic mode

Image

Native interactive toasts for the scheduled tasks

Image

@BenchTweakGaming Sophia Script Wrapper

Wrapper

Videos

YT

YT YT

How to use

  • Choose the right script version for your Windows;

  • Download up-to-date version;

  • Expand the archive;

  • Open folder with the expanded archive;

  • Look through the Sophia.ps1 file to configure functions that you want to be run;

    • Place the «#» char before function if you don’t want it to be run.
    • Remove the «#» char before function if you want it to be run.
  • On Windows 10 click File in File Explorer, hover over Open Windows PowerShell, and select Open Windows PowerShell as Administrator (how-to with screenshots)

  • On Windows 11 right-click on the Windows icon and select Windows Terminal (Admin). Then change the current location

    Set-Location -Path "PathToSophiaFolder"
  • Set execution policy to be able to run scripts only in the current PowerShell session

    Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
  • Type .Sophia.ps1 Enter to run the whole preset file.

How to use Wrapper

  • Download and expand the archive;
  • Run SophiaScriptWrapper.exe and import Sophia.ps1;
    • The Wrapper has a real time UI rendering;
  • Configure every function;
  • Open the Console Output tab and press Run PowerShell.

How to run the specific function(s)

To run the specific function(s) dot source the Functions.ps1 file first:

# With a dot at the beginning
. .Functions.ps1
  • Now you can do like this (the quotation marks required)
Sophia -Functions<kbd>TAB</kbd>
Sophia -Functions temp<kbd>TAB</kbd>
Sophia -Functions unin<kbd>TAB</kbd>
Sophia -Functions uwp<kbd>TAB</kbd>
Sophia -Functions "DiagTrackService -Disable", "DiagnosticDataLevel -Minimal", UninstallUWPApps

UninstallUWPApps, "PinToStart -UnpinAll"

Or use an old-style format without the TAB functions autocomplete (the quotation marks required)

.Sophia.ps1 -Functions CreateRestorePoint, "ScheduledTasks -Disable", "WindowsCapabilities -Uninstall"

How to download Sophia Script via PowerShell

  • Download the always latest Sophia Script archive by invoking (not as administrator too) in PowerShell
irm script.sophi.app -useb | iex
  • The command will download and expand the latest Sophia Script archive (without running) according which Windows and PowerShell versions it is run on. If you run it on, e.g., Windows 11 via PowerShell 5.1, it will download Sophia Script for Windows 11 PowerShell 5.1.

How to translate

  • Get your OS UI culture by invoking $PSUICulture in PowerShell;
  • Create a folder with the UI culture name;
  • Place your localized Sophia.psd1 file into this folder.

Media

  • Discord
  • Telegram discussion group
  • Telegram channel
  • Ru-Board
  • rutracker
  • My Digital Life
  • 4sysops
  • gHacks Technology News
  • Neowin: Tech News, Reviews & Betas
  • Comss.ru
  • Habr
  • Deskmodder.d
  • PCsoleil Informatique
  • Reddit (archived)
    • PM me

SophiApp Community Edition (C# + WPF)

SophiApp is in active development 🚀

Image
Image

Скрипт настройки Windows 10 состоит из 2 файлов: непосредственно модуль и файл пресета к нему, не считая файлов локализации. Модуль разбит примерно на 270 функций: как для внесения изменений, так и его «отката».

Теперь можно открыть файл пресета, где будет список из всех имеющихся функций (с подробным описанием каждой), и закомментировать строку с функций с помощью знака #, чтобы эта функция не выполнялась, или, наоборот, убрать знак # перед ней, чтобы функция выполнялась. Повторюсь: практически на каждую функцию есть функция на возврат в состояние по умолчанию, как «из коробки».

Поддерживаемые версии

Windows 10 Sophia Script поддерживает только актуальные версии Windows 10: 2004 (20H1) и 2009 (20H2), x64, так как это по сути одна и та же версия. Возможно, чуть позже можно то же самое провернуть и со скриптом, написанным для LTSC (1809), так как эта версия Windows 10 достаточно популярна. Пока что для прочих версий можно использовать предыдущую версию скрипта 4.x.

Напомню основные функции.

Основные функции

  • Настройка уровня телеметрии и конфиденциальности;
  • Отключить задачи диагностического отслеживания;
  • Настроить интерфейс;
  • Удалить «правильно» OneDrive;
  • Изменить путь переменной среды для %TEMP% на %SystemDrive%Temp
  • Изменить программно расположение пользовательских папок;
    • Рабочий стол;
    • Документы;
    • Загрузки;
    • Музыка;
    • Изображения;
    • Видео;

    с помощью интерактивного меню с использованием стрелок вверх/вниз и клавиши Enter для подтверждения выбора;

  • Удалить UWP-приложения (со списком исключений), используя всплывающую форму, написанную на WPF;
  • Удалить компоненты Windows;
  • Установить и настроить WSL;
  • Отключить дополнительные компоненты Windows, используя всплывающую форму, написанную на WPF;
  • Создать задачу в Планировщике задач по очистке неиспользуемых файлов и обновлений Windows;
    • За минуту до выполнения задачи всплывает тостовое уведомление;
  • Создать задачи в Планировщике задач по очистке папок;
    • %SystemRoot%SoftwareDistributionDownload
    • %TEMP%
  • Открепить все ярлыки от начального экрана;
  • Закрепить ярлыки на начальном экране, используя syspin.exe
  • Включить контролируемый доступ к папкам и добавить защищенные папки, используя диалоговое меню;
  • Добавить папку в список исключений сканирования Microsoft Defender, используя диалоговое меню;
  • Добавить файлы в список исключений сканирования Microsoft Defender, используя диалоговое меню;
  • Обновить иконки рабочего стола, переменные среды, панель задач и симулировать нажатие F5 для обновления рабочего стола;
  • Множество твиков проводника, контекстного и прочего.

С полным списком функций можно ознакомиться в файле пресета.

Скрипт по автоматизации настройки Windows 10

Скрипт по автоматизации настройки Windows 10

Скрипт по автоматизации настройки Windows 10

Скрипт по автоматизации настройки Windows 10

Работа скрипта Windows 10 Sophia Script в действии

Nota bene

  • Перед выполнением стоит еще раз прочитать раздел на Github «Before running«.

Использование

  • Скачайте актуальную версию;
  • Настройте файл пресета под себя, закомментировав или раскомментировав функции;
  • Установите политику выполнения скриптов в PowerShell;
    • Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
  • Запустите скрипт с помощью;
    • .Sophia.psd1

Скрипт настройки Windows 10 скачать с GitHub

→ Windows 10 Sophia Script

Возможно вам будет интересно — Подборка программ — инструментов для системного администратора

источник

Настройки Windows 10: часть III, или куда приводят скрипты +28

Системное администрирование, Разработка под Windows, Читальный зал, PowerShell, Блог компании SkillFactory


Рекомендация: подборка платных и бесплатных курсов 3D-моделирования — https://katalog-kursov.ru/

Здравствуйте, товарищи! Прошло чуть больше полугода после выхода предыдущей статьи о Windows 10 Sophia Script — скрипте, который за прошедшие годы стал самым крупным (а их осталось всего два) опенсорс-проектом по персонализации и настройке Windows 10, а также автоматизации рутинных задач. В статье я расскажу, что изменилось с момента релиза версии, описываемой в статье от 29.09.2020, с какими трудностями мы столкнулись, и куда всё движется.


Как всё начиналось

Разработка наброска скрипта берёт своё начало в те далёкие времена, когда после года работы экономистом в отделе проектирования птицефабрики в одной организации я решил перейти в местный отдел IT.

Отдел IT

Отдел IT

Перейдя на новое место, я предложил автоматизировать настройку пользовательских ОС. Так, через пару недель, появился первый прародитель данного модуля — примитивный .reg-файл для настройки Windows 8.1. Но я и ему был рад, так как всё было в новинку.

Так продолжалось, наверное, год, пока я не понял, что упёрся в тупик и надо менять язык: начал готовить «батник».

В первый день выхода Windows 10 я сразу же «пересел» на неё, поняв, что Windows 8.1 осталась для Microsoft в прошлом. Со временем же «батник» рос, «мужал», разрастался и в какой-то момент даже стал дёргать другой интерпретатор, powershell.exe. Скорость работы падала, и я понимал, что придётся учить PowerShell, так как batch уже не удовлетворяет моим маниакальным запросам автоматизировать всё при настройке ОС.

Как сейчас помню, в феврале 2017 года я сел читать первую статью по запросу «как внести данные в реестр с помощью PowerShell». Уже к лету 2017 года я значительно продвинулся в переписывании всех имеющих функций из «батника» в новый скрипт.

Изначально, конечно, скрипт состоял лишь из одного файла с расширением .ps1. Пользователям приходилось править код и комментировать целые функции, чтобы настроить под себя. То ещё удовольствие было…

Помню, как первый раз почувствовал, что я делаю что-то полезное, когда некто создал issue с просьбой указывать, что я исправляю, когда перезаписываю файлы на GitHub. Пришлось вести журнал изменений.

В таком неспешном темпе разработка шла до августа 2019 года, когда я решил поделиться своими наработками здесь. Хотя я читаю Хабр с года эдак 2007-го, зарегистрировался лишь в 2016-м.

Немного облагородил код (ага, 10 раз), добавил описания на английском языке и накатал крохотную статью о своей pet-разработке. Удивительно, но статью пропустили, она попала в бездну, и я сел ждать.

Мой лик, когда ожидаю приглашения

Мой лик, когда ожидаю приглашения

Как сейчас помню: сижу на сеансе в кинотеатре, и приходит уведомление на почту о новом комментарии к моей статье. Так, стоп! Её одобрили?! 

Я не успевал отвечать на комментарии! Это была какая-то эйфория. Какой там фильм?! — меня на Хабр пригласили прямым инвайтом! Фурор! Даже код не обо…ли (а там был кровавый мрак) и вообще любезно приняли.

Мой лик, когда получил приглашение

Мой лик, когда получил приглашение

Самым неожиданным поворотом стало то, что через 5 дней после публикации мне написал некий Дмитрий (@oz-zo), прочитавший моё сетование на то, что у меня не хватает знаний, чтобы сделать графическую версию скрипта, даже хотя бы на Windows.Forms. Я был приятно удивлён, что есть ещё один старый безумец. Как выяснилось, старый, но не бесполезный!

Познакомившись, мы запланировали всё сделать примерно за 3 месяца на Windows.Forms, но наше приключение затянулось… больше чем на 1,5 года: лишь в этом месяце мы вышли на финишную прямую по созданию графической версии моего скрипта — SophiApp. Но это уже другая история, и, когда будет что показать, я обязательно расскажу, что мы пережили за время разработки, поделившись нашими инфернальными набросками и наработками.

С того времени как я познакомился с Дмитрием, разработка пошла быстрее: он внёс огромный вклад в создание новых функций, которых не было ни у кого: все графические функции с использованием WPF и логику к ним написал именно он; я лишь объяснил, как получать данные.

Иконка Sophia Script

Иконка Sophia Script

Немаловажным событием стало также знакомство с Дэвидом из Канады, который решил сделать самостоятельно

графическую надстройку для Sophia Script

, Sophia Script Wrapper, для повышения удобства редактирования пресет-файла. В текущем варианте пользователь импортирует пресет-файл скрипта, и в программе расставляются радиокнопки в зависимости от закомментированных и раскомментированных функций. Дальше можно настроить под себя и запустить выполнение настроенного пресет-файла.

Хотя Дэвиду уже нормально так, программировать он сел лишь недавно, окончив курсы. Но его программа выполняет ту задачу, для которой её и написали. Одним словом, люди пользуются.

Sophia Script Wrapper

Sophia Script Wrapper

Что поменялось в скрипте

За время, прошедшее с момента выхода прошлой статьи в сентябре, много воды утекло. Скрипт уже и не узнать. Больше 12 000 строк кода… Самые интересные изыскания пришлись на удаление UWP-приложений и закрепление ярлыков на начальный экран.

Напомню, какие версии Windows 10 поддерживает скрипт на данный момент.

Версия

Маркетинговое название

Билд

Архитектура

Издания

21H1

Spring 2021 Update

19043

x64

Home/Pro/Enterprise

20H2

October 2020 Update

19042

x64

Home/Pro/Enterprise

2004

May 2020 Update

19041

x64

Home/Pro/Enterprise

1809

LTSC Enterprise 2019

17763

x64

Enterprise

А теперь пройдёмся по всем доработанным и новым функциям.

Функции касающиеся манипуляций с UWP-приложениями

Было/Стало

Было/Стало

Наверное, вы уже заметили, что список стал локализованным. Также хочется добавить, что список генерируется динамически, загружая лишь установленные пакеты UWP-приложений в соответствии с текущей локализацией. Как это реализовано?

Свойство DisplayName, которое содержит локализованное имя пакета, находится лишь в одном классе (Get-AppxPackage вам никак тут не поможет, к сожалению):

«Windows.Management.Deployment.PackageManager»

[Windows.Management.Deployment.PackageManager, Windows.Web, ContentType = WindowsRuntime]::new().FindPackages() | Select-Object -Property DisplayName -ExpandProperty Id | Select-Object -Property Name, DisplayName

На выходе вы получите что-то вроде этого (простыню кода прячу под спойлер)

Name                                        DisplayName                                          
----                                        -----------                                          
1527c705-839a-4832-9118-54d4Bd6a0c89                                                             
c5e2524a-ea46-4f67-841f-6a9465d9d515        Проводник                                            
E2A4F912-2574-4A75-9BB0-0D023378592B        Сопоставитель приложений                             
F46D4000-FD22-4DB4-AC8E-4E1DDDE828FE        Диалоговое окно "Добавить рекомендованные папки"     
Microsoft.AAD.BrokerPlugin                  Учетная запись компании или учебного заведения       
Microsoft.AccountsControl                   Электронная почта и учетные записи                   
Microsoft.AsyncTextService                  AsyncTextService                                     
Microsoft.BioEnrollment                     Настройка Windows Hello                              
Microsoft.CredDialogHost                    Диалоговое окно учетных данных                       
Microsoft.ECApp                             Управление глазами                                   
Microsoft.LockApp                           Экран блокировки Windows по умолчанию                
Microsoft.MicrosoftEdgeDevToolsClient       Клиент средств разработчика для Microsoft Edge       
Microsoft.MicrosoftEdge                                                                          
Microsoft.Win32WebViewHost                  Веб-средство просмотра классических приложений       
Microsoft.Windows.Apprep.ChxApp             SmartScreen Защитника Windows                        
Microsoft.Windows.AssignedAccessLockApp     Приложение "Блокировка" при ограниченном доступе     
Microsoft.Windows.CallingShellApp           Видеозвонки                                          
Microsoft.Windows.CapturePicker             CapturePicker                                        
Microsoft.Windows.CloudExperienceHost       Ваша учетная запись                                  
Microsoft.Windows.ContentDeliveryManager    Содержимое, предоставленное корпорацией Майкрософт   
Microsoft.Windows.NarratorQuickStart        Экранный диктор                                      
Microsoft.Windows.OOBENetworkCaptivePortal  Поток портала авторизации                            
Microsoft.Windows.OOBENetworkConnectionFlow Последовательность действий при сетевом подключении  
Microsoft.Windows.ParentalControls          Функции семьи учетных записей Майкрософт             
Microsoft.Windows.PeopleExperienceHost      Windows Shell Experience                             
Microsoft.Windows.PinningConfirmationDialog PinningConfirmationDialog                            
Microsoft.Windows.Search                    Windows Search                                       
Microsoft.Windows.SecHealthUI               Безопасность Windows                                 
Microsoft.Windows.SecureAssessmentBrowser   Тестирование                                         
Microsoft.Windows.ShellExperienceHost       Windows Shell Experience                             
Microsoft.Windows.StartMenuExperienceHost   Запустить                                            
Microsoft.Windows.XGpuEjectDialog           Безопасное извлечение устройства                     
Microsoft.XboxGameCallableUI                Xbox Game UI                                         
MicrosoftWindows.Client.CBS                 Windows Feature Experience Pack                      
MicrosoftWindows.UndockedDevKit             UDK Package                                          
NcsiUwpApp                                  NcsiUwpApp                                           
Windows.CBSPreview                          Предварительный просмотр штрихкодов Windows          
windows.immersivecontrolpanel               Параметры                                            
Windows.PrintDialog                         PrintDialog                                          
Microsoft.Services.Store.Engagement         Microsoft Engagement Framework                       
Microsoft.Services.Store.Engagement         Microsoft Engagement Framework                       
Microsoft.UI.Xaml.2.0                       Microsoft.UI.Xaml.2.0                                
Microsoft.VCLibs.140.00                     Microsoft Visual C++ 2015 UWP Runtime Package        
Microsoft.Advertising.Xaml                  Microsoft Advertising SDK for XAML                   
Microsoft.NET.Native.Framework.2.2          Microsoft .Net Native Framework Package 2.2          
Microsoft.NET.Native.Framework.2.2          Microsoft .Net Native Framework Package 2.2          
Microsoft.VCLibs.140.00                     Microsoft Visual C++ 2015 UWP Runtime Package        
Microsoft.VCLibs.140.00                     Microsoft Visual C++ 2015 UWP Runtime Package        
Microsoft.NET.Native.Runtime.2.2            Microsoft .Net Native Runtime Package 2.2            
Microsoft.NET.Native.Runtime.2.2            Microsoft .Net Native Runtime Package 2.2            
Microsoft.VCLibs.140.00.UWPDesktop          Microsoft Visual C++ 2015 UWP Desktop Runtime Package
Microsoft.VCLibs.140.00.UWPDesktop          Microsoft Visual C++ 2015 UWP Desktop Runtime Package
Microsoft.UI.Xaml.2.1                       Microsoft.UI.Xaml.2.1                                
Microsoft.UI.Xaml.2.1                       Microsoft.UI.Xaml.2.1                                
Microsoft.UI.Xaml.2.0                       Microsoft.UI.Xaml.2.0                                
Microsoft.UI.Xaml.2.3                       Microsoft.UI.Xaml.2.3                                
Microsoft.UI.Xaml.2.3                       Microsoft.UI.Xaml.2.3                                
Microsoft.UI.Xaml.2.4                       Microsoft.UI.Xaml.2.4                                
Microsoft.UI.Xaml.2.4                       Microsoft.UI.Xaml.2.4                                
Microsoft.ScreenSketch                      Набросок на фрагменте экрана                         
Microsoft.NET.Native.Framework.1.7          Microsoft .Net Native Framework Package 1.7          
Microsoft.NET.Native.Framework.1.7          Microsoft .Net Native Framework Package 1.7          
Microsoft.NET.Native.Runtime.1.7            Microsoft .Net Native Runtime Package 1.7            
Microsoft.NET.Native.Runtime.1.7            Microsoft .Net Native Runtime Package 1.7            
Microsoft.VCLibs.120.00                     Microsoft Visual C++ Runtime Package                 
Microsoft.VCLibs.120.00                     Microsoft Visual C++ Runtime Package                 
Microsoft.VCLibs.140.00.UWPDesktop          Microsoft Visual C++ 2015 UWP Desktop Runtime Package
Microsoft.VCLibs.140.00.UWPDesktop          Microsoft Visual C++ 2015 UWP Desktop Runtime Package
Microsoft.VCLibs.140.00                     Microsoft Visual C++ 2015 UWP Runtime Package        
Microsoft.VCLibs.140.00                     Microsoft Visual C++ 2015 UWP Runtime Package        
Microsoft.WebpImageExtension                Расширения для изображений Webp                      
Microsoft.DesktopAppInstaller               Установщик приложения                                
Microsoft.NET.Native.Framework.2.2          Microsoft .Net Native Framework Package 2.2          
Microsoft.NET.Native.Framework.2.2          Microsoft .Net Native Framework Package 2.2          
AppUp.IntelGraphicsExperience               Центр управления графикой Intel®                     
Microsoft.Windows.StartMenuExperienceHost   Запустить                                            
Microsoft.Windows.ShellExperienceHost       Windows Shell Experience                             
Microsoft.Windows.AssignedAccessLockApp     Приложение "Блокировка" при ограниченном доступе     
Microsoft.WindowsTerminal                   Windows Terminal                                     
Microsoft.AV1VideoExtension                 AV1 Video Extension                                  
Microsoft.HEIFImageExtension                Расширения для изображений HEIF                      
Microsoft.Windows.Photos                    Фотографии (Майкрософт)                              
Microsoft.UI.Xaml.2.5                       Microsoft.UI.Xaml.2.5                                
Microsoft.UI.Xaml.2.5                       Microsoft.UI.Xaml.2.5                                
Microsoft.WindowsStore                      Microsoft Store                                      
Microsoft.StorePurchaseApp                  Узел для покупок в Store                             
Microsoft.LanguageExperiencePackru-RU       Пакет локализованного интерфейса на русском          
Microsoft.MicrosoftEdge                     Microsoft Edge                                       
Microsoft.VP9VideoExtensions                Расширения для VP9-видео                             
MicrosoftWindows.Client.WebExperience       Windows Web Experience Pack                          
Microsoft.WebMediaExtensions                Расширения для интернет-мультимедиа                  
Microsoft.HEVCVideoExtension                Расширения для видео HEVC от производителя устройства
MicrosoftWindows.Client.CBS                 Windows Feature Experience Pack                      
Microsoft.MicrosoftEdge.Stable              Microsoft Edge     

Первые попытки переписать функцию удаления UWP-пакетов

Первые попытки переписать функцию удаления UWP-пакетов

Хоть на картинке и не видно, но кнопка «Для всех пользователей» была тоже полностью переписана. Раньше она совершенно неправильно работала. Сейчас же её логика приведена к должному функционалу. По умолчанию при загрузке формы отображается список приложений для текущего пользователя (все системные пакеты и Microsoft Store исключены из списка, так что удалить хоть что-то важное не получится никак, в отличие, кстати, от всех других скриптов в Интернете). При нажатии на кнопку «Для всех пользователей» происходит динамическая перегенерация списка с учётом установленных пакетов во всех учётных записях. То есть вы можете удалить все приложения для текущего пользователя, и форма отобразится пустой, но при запуске функции с ключом «-ForAllUsers» отобразится список пакетов для всех учётных записей.

Как-то меня попросили добавить поддержку PowerShell 7. И всё это было бы смешно, когда бы не было так грустно…

Во-первых, ни для кого не будет секретом, что, хотя в PowerShell 7 исправили очень много багов, в нынешнем виде очень далёк от финальной версии, ведь там до сих пор даже не работает командлет Get-ComputerRestorePoint из коробки. И (в качестве временного решения) Microsoft предложил загружать в сессию недостающие модули из папки PowerShell 5.1, используя аргумент -UseWindowsPowerShell.

Таким образом, мне приходится загружать модули Microsoft.PowerShell.Management, PackageManagement, Appx, чтобы воссоздать работоспособность скрипта на PowerShell 7:

Import-Module -Name Microsoft.PowerShell.Management, PackageManagement, Appx -UseWindowsPowerShell

Во-вторых, код для получения локализованных имен UWP-пакетов не работает в PowerShell 7 вообще, так как Microsoft решил не включать библиотеки WinRT в релизы PowerShell 7, но вынес разработку на отдельные ресурсы: WinRT и Windows.SDK. Это упомянул и Steven Lee в обсуждении на GitHub, а также уведомил, что команда PowerShell решила не включать в дальнейшем в релизы эти библиотеки. Поэтому, чтобы вызвать необходимые API, мне приходится хранить в папке две библиотеки по 26 МБ и 284 КБ. Тут остаётся лишь поставить мем с пингвином.

Код для получения локализованных имен UWP-пакетов на PowerShell 7 выглядит так:

Add-Type -AssemblyName "$PSScriptRootLibrariesWinRT.Runtime.dll"
Add-Type -AssemblyName "$PSScriptRootLibrariesMicrosoft.Windows.SDK.NET.dll"

$AppxPackages = Get-AppxPackage -PackageTypeFilter Bundle -AllUsers
$PackagesIds = [Windows.Management.Deployment.PackageManager]::new().FindPackages().AdditionalTypeData[[Collections.IEnumerable].TypeHandle] | Select-Object -Property DisplayName -ExpandProperty Id | Select-Object -Property Name, DisplayName

foreach ($AppxPackage in $AppxPackages)
{
	$PackageId = $PackagesIds | Where-Object -FilterScript {$_.Name -eq $AppxPackage.Name}

	if (-not $PackageId)
	{
		continue
	}

	[PSCustomObject]@{
		Name = $AppxPackage.Name
		PackageFullName = $AppxPackage.PackageFullName
		DisplayName = $PackageId.DisplayName
	}
}

На выходе будет что-то вроде:

Name                                         PackageFullName                                                                DisplayName
----                                         ---------------                                                                -----------
RealtekSemiconductorCorp.RealtekAudioControl RealtekSemiconductorCorp.RealtekAudioControl_1.1.137.0_neutral_~_dt26b99r8h8gj Realtek Audio Control
Microsoft.MicrosoftStickyNotes               Microsoft.MicrosoftStickyNotes_3.7.142.0_neutral_~_8wekyb3d8bbwe               Microsoft Sticky Notes
Microsoft.ScreenSketch                       Microsoft.ScreenSketch_2020.814.2355.0_neutral_~_8wekyb3d8bbwe                 Набросок на фрагменте экрана
Microsoft.WindowsCalculator                  Microsoft.WindowsCalculator_2020.2008.2.0_neutral_~_8wekyb3d8bbwe              Windows Calculator
AppUp.IntelGraphicsExperience                AppUp.IntelGraphicsExperience_1.100.3282.0_neutral_~_8j3eq9eme6ctt             Центр управления графикой Intel®
Microsoft.MicrosoftSolitaireCollection       Microsoft.MicrosoftSolitaireCollection_4.7.10142.0_neutral_~_8wekyb3d8bbwe     Microsoft Solitaire Collection
Microsoft.DesktopAppInstaller                Microsoft.DesktopAppInstaller_2020.1112.20.0_neutral_~_8wekyb3d8bbwe           Установщик приложения
Microsoft.WindowsStore                       Microsoft.WindowsStore_12101.1001.1413.0_neutral_~_8wekyb3d8bbwe               Microsoft Store
Microsoft.Windows.Photos                     Microsoft.Windows.Photos_2020.20120.4004.0_neutral_~_8wekyb3d8bbwe             Фотографии (Майкрософт)
Microsoft.WebMediaExtensions                 Microsoft.WebMediaExtensions_1.0.40471.0_neutral_~_8wekyb3d8bbwe               Расширения для интернет-мультим…
Microsoft.WindowsCamera                      Microsoft.WindowsCamera_2021.105.10.0_neutral_~_8wekyb3d8bbwe                  Камера Windows
Microsoft.StorePurchaseApp                   Microsoft.StorePurchaseApp_12103.1001.813.0_neutral_~_8wekyb3d8bbwe            Узел для покупок в Store
Microsoft.WindowsTerminal                    Microsoft.WindowsTerminal_2021.413.2245.0_neutral_~_8wekyb3d8bbwe              Windows Terminal
Microsoft.WindowsTerminalPreview             Microsoft.WindowsTerminalPreview_2021.413.2303.0_neutral_~_8wekyb3d8bbwe       Windows Terminal Preview

Аналогичный подход используется для функции восстановления UWP-приложений. Чтобы восстановить пакет, как известно, необходимо вычленить путь до его манифеста.

Восстановление удаленных UWP-приложений для текущего пользователя

Восстановление удаленных UWP-приложений для текущего пользователя

Код для получения общего списка всех манифестов выглядит так (можете даже выполнить, если, конечно, не удалили все UWP-приложения):

$Bundles = (Get-AppXPackage -PackageTypeFilter Framework -AllUsers).PackageFullName
Get-ChildItem -Path "HKLM:SOFTWAREClassesLocal SettingsSoftwareMicrosoftWindowsCurrentVersionAppModelPackageRepositoryPackages" | ForEach-Object -Process {
	Get-ItemProperty -Path $_.PSPath
} | Where-Object -FilterScript {$_.Path -match "Program Files"} | Where-Object -FilterScript {$_.PSChildName -notin $Bundles} | Where-Object -FilterScript {$_.Path -match "x64"} | ForEach-Object -Process {"$($_.Path)AppxManifest.xml"}

И вы увидите что-то вроде:

C:Program FilesWindowsAppsA025C540.Yandex.Music_4.40.7713.0_x64__vfvw9svesycw6AppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.549981C3F5F10_2.2103.17603.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.BingNews_1.0.6.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.BingWeather_1.0.6.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.DesktopAppInstaller_1.11.10771.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.GamingApp_1.0.1.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.GetHelp_10.2102.40951.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.Getstarted_10.2.40751.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.HEIFImageExtension_1.0.40978.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.MicrosoftOfficeHub_18.2008.12711.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.MicrosoftSolitaireCollection_4.9.4072.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.MicrosoftStickyNotes_1.8.15.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.Paint_10.2103.1.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.People_10.1909.12456.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.PowerAutomateDesktop_1.0.31.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.ScreenSketch_11.2103.13.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.SkypeApp_14.53.77.0_x64__kzf8qxf38zg5cAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.StorePurchaseApp_12103.1001.8.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.Todos_0.41.4902.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.VP9VideoExtensions_1.0.40631.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.WebMediaExtensions_1.0.40831.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.WebpImageExtension_1.0.32731.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.Windows.Photos_2021.21030.17018.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.WindowsAlarms_1.0.38.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.WindowsCalculator_10.2103.8.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.WindowsCamera_2020.503.58.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsmicrosoft.windowscommunicationsapps_16005.13426.20688.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.WindowsFeedbackHub_1.2009.10531.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.WindowsMaps_1.0.27.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.WindowsNotepad_10.2103.6.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.WindowsSoundRecorder_1.0.42.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.WindowsStore_12103.1001.11.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.WindowsTerminal_1.6.10571.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.Xbox.TCUI_1.23.28002.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.XboxGameOverlay_1.54.4001.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.XboxGamingOverlay_5.621.4072.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.XboxIdentityProvider_12.67.21001.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.XboxSpeechToTextOverlay_1.21.13002.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.YourPhone_1.21022.202.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.ZuneMusic_10.21012.10511.0_x64__8wekyb3d8bbweAppxManifest.xml
C:Program FilesWindowsAppsMicrosoft.ZuneVideo_10.21021.10311.0_x64__8wekyb3d8bbweAppxManifest.xml

PS C:Windowssystem32WindowsPowerShellv1.0> 

Но нам надо сопоставить имя пакета, его локализованное имя в системе и путь до манифеста. Искать будем среди пакетов, которые имеют статус «Staged», то есть готовы к восстановлению.

# Тут нельзя напрямую вписать -PackageTypeFilter Bundle, так как иначе не выдается нужное свойство InstallLocation. Только сравнивать с $Bundles
$Bundles = (Get-AppXPackage -PackageTypeFilter Bundle -AllUsers).Name
$AppxPackages = Get-AppxPackage -AllUsers | Where-Object -FilterScript {$_.PackageUserInformation -match "Staged"} | Where-Object -FilterScript {$_.Name -in $Bundles}
$PackagesIds = [Windows.Management.Deployment.PackageManager, Windows.Web, ContentType = WindowsRuntime]::new().FindPackages() | Select-Object -Property DisplayName -ExpandProperty Id | Select-Object -Property Name, DisplayName

foreach ($AppxPackage in $AppxPackages)
{
	$PackageId = $PackagesIds | Where-Object -FilterScript {$_.Name -eq $AppxPackage.Name}

	if (-not $PackageId)
	{
		continue
	}

	[PSCustomObject]@{
		Name            = $AppxPackage.Name
		PackageFullName = $AppxPackage.PackageFullName
		DisplayName     = $PackageId.DisplayName
		AppxManifest    = "$($AppxPackage.InstallLocation)AppxManifest.xml"
	}
}

Ну, а дальше уже дело техники. Кстати, если вам надо восстановить все возможные пакеты без разбора, то в этом вам поможет.

# Re-register all UWP apps
$Bundles = (Get-AppXPackage -PackageTypeFilter Framework -AllUsers).PackageFullName
Get-ChildItem -Path "HKLM:SOFTWAREClassesLocal SettingsSoftwareMicrosoftWindowsCurrentVersionAppModelPackageRepositoryPackages" | ForEach-Object -Process {
	Get-ItemProperty -Path $_.PSPath
} | Where-Object -FilterScript {$_.Path -match "Program Files"} | Where-Object -FilterScript {$_.PSChildName -notin $Bundles} | Where-Object -FilterScript {$_.Path -match "x64"} | ForEach-Object -Process {"$($_.Path)AppxManifest.xml"} | Add-AppxPackage -Register -ForceApplicationShutdown -ForceUpdateFromAnyVersion -DisableDevelopmentMode -Verbose
# Check for UWP apps updates
Get-CimInstance -Namespace "Rootcimv2mdmdmmap" -ClassName "MDM_EnterpriseModernAppManagement_AppManagement01" | Invoke-CimMethod -MethodName UpdateScanMethod

Мы специально не хотели хардкодить список приложений как на удаление, так и на восстановление, так это слишком топорно. Одним словом, получить локализованные имена приложений реально. Дмитрий создал форму на WPF и накатал логику. Не знаю, почему, но мне с Дмитрием потребовалась, наверное, пара недель, учтя все возможные и невозможные условия использования, заставить всё работать как надо.

Точно таким же способом можно выводить список локализованных имён компонентов Windows и дополнительных компонентов.

Работает экстремально медленно, но спасает то, что у меня выводится лишь захардоженный список компонентов, которые можно безболезненно отключить (и включить опять, конечно).

Get-WindowsOptionalFeature -Online | ForEach-Object -Process {Get-WindowsOptionalFeature -FeatureName $_.FeatureName -Online} | Select-Object -Property FeatureName, DisplayName | Format-Table -AutoSize

Было

Было
Стало
Стало
Наши лики, когда, наконец, всё заработало
Наши лики, когда, наконец, всё заработало

Интернационализация скрипта

На необходимость этой фичи обратил внимание @FrankSinatra в комментариях. Интернационализация позволяет избавиться от страшной конструкции вида

if ($RU)
{
	
}
else
{
	
}

Отныне в корне папки скрипта находятся папки с названием кода локализации: например, ru-RU, en-US и так далее, где внутри находится файл локализации вида UnsupportedOSBitness = The script supports Windows 10 x64 only. Получить значение локализации можно командой $PSUICulture. 

Соответственно, чтобы это всё заработало, мы импортируем указанные локализационные файлы, сохраняя строки в переменную так, чтобы можно было вызывать их в скрипте:

# Sophia.psd1
ConvertFrom-StringData -StringData @'
UnsupportedOSBitness = The script supports Windows 10 x64 only
'@

# Sophia.ps1
Import-LocalizedData -BindingVariable Global:Localization -FileName Sophia
$Localization.UnsupportedOSBitness

И в зависимости от текущей локализации системы скрипт сам будет искать нужный файл. И код чище, и людя?м приятнее! Ну, а если необходимой локализации нет, то по умолчанию загружается английская.

На сегодня скрипт локализован на 8 языков: английский, китайский, немецкий, французский, итальянский, русский, украинский, турецкий, испанский и португальский. В будущем всё-таки планирую разместить языковые файлы на Crowdin, но немного душит жаба платить столько денег за некоммерческий продукт.

Закрепление ярлыков на начальном экране

Используется при этом чистый PowerShell. Изначально я использовал стороннюю программу syspin, но возникло желание всё-таки избавиться от неё. Как вы знаете, с выходом Windows 10 October 2018 Microsoft без шума закрыл доступ к API открепления (закрепления) ярлыков от начального экрана и панели задач: отныне это можно сделать лишь вручную.

Ниже приведён пример кода для закрепления (открепления) ярлыка на начальный экран, который когда-то работал. Как можете видеть, в коде используется метод получения локализованной строки, и для этого нам необходимо знать код строки, чтобы вызвать соответствующий пункт контекстного меню. В данном примере, чтобы закрепить ярлык командной строки, мы вызываем строку с кодом 51201, «Закрепить на начальном экране», из библиотеки %SystemRoot%system32shell32.dll.

Получить список всех локализованных строк удобнее всего через стороннюю утилиту ResourcesExtract.

Попытка закрепить ярлык командной строки устаревшим методом:

# Extract a localized string from shell32.dll
$Signature = @{
	Namespace = "WinAPI"
	Name = "GetStr"
	Language = "CSharp"
	MemberDefinition = @"
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
internal static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax);
public static string GetString(uint strId)
{
	IntPtr intPtr = GetModuleHandle("shell32.dll");
	StringBuilder sb = new StringBuilder(255);
	LoadString(intPtr, strId, sb, sb.Capacity);
	return sb.ToString();
}
"@
}

if (-not ("WinAPI.GetStr" -as [type]))
{
	Add-Type @Signature -Using System.Text
}

# Pin to Start: 51201
# Unpin from Start: 51394
$LocalizedString = [WinAPI.GetStr]::GetString(51201)

# Trying to pin the Command Prompt shortcut to Start
$Target = Get-Item -Path "$env:APPDATAMicrosoftWindowsStart MenuProgramsSystem ToolsCommand Prompt.lnk"
$Shell = New-Object -ComObject Shell.Application
$Folder = $Shell.NameSpace($Target.DirectoryName)
$file = $Folder.ParseName($Target.Name)
$Verb = $File.Verbs() | Where-Object -FilterScript {$_.Name -eq $LocalizedString}
$Verb.DoIt()

Сейчас консоль вываливается с ошибкой Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED).)

Хотя, как можно заметить, API, конечно, отдаёт глагол контекстного меню «Закрепить на начальном &экране», но не может его выполнить.

Мы знаем, что текущий макет начального экрана можно выгрузить в формате XML. Но, даже если его настроить должным образом, импортировать макет в профиль текущего пользователя не получится: Import-StartLayout -LayoutPath D:Layout.xml импортирует макеты начального экрана и панели задач только для новых пользователей.

Идея заключается в том, чтобы использовать политику «Макет начального экрана» (Prevent users from customizing their Start Screen), отвечающую за подгрузку предзаготовленного макета в формате XML из определённого места. Таким образом, наш хак будет состоять из следующих пунктов:

  • Выгружаем текущий макет начального экрана.

  • Парсим XML, добавляя необходимые нам ярлыки (ссылки должны вести на реально существующие ярлыки), и сохраняем.

  • С помощью политики временно выключаем возможность редактировать макет начального экрана.

  • Перезапускаем меню «Пуск».

  • Программно открываем меню «Пуск», чтобы в реестре сохранился его макет.

  • Выключаем политику, чтобы можно было редактировать макет начального экрана.

  • И открываем меню «Пуск» опять.

Вуаля! В данном примере мы настроили начальный экран на лету, закрепив на него три ярлыка для текущего пользователя: панель управления, устройства и принтеры и PowerShell, причём без перезапуска или выхода из учётной записи.

Код целиком:

<#
	.SYNOPSIS
	Configure the Start tiles

	.PARAMETER ControlPanel
	Pin the "Control Panel" shortcut to Start

	.PARAMETER DevicesPrinters
	Pin the "Devices & Printers" shortcut to Start

	.PARAMETER PowerShell
	Pin the "Windows PowerShell" shortcut to Start

	.PARAMETER UnpinAll
	Unpin all the Start tiles

	.EXAMPLE
	.Pin.ps1 -Tiles ControlPanel, DevicesPrinters, PowerShell

	.EXAMPLE
	.Pin.ps1 -UnpinAll

	.EXAMPLE
	.Pin.ps1 -UnpinAll -Tiles ControlPanel, DevicesPrinters, PowerShell

	.EXAMPLE
	.Pin.ps1 -UnpinAll -Tiles ControlPanel

	.EXAMPLE
	.Pin.ps1 -Tiles ControlPanel -UnpinAll

	.LINK
	https://github.com/farag2/Windows-10-Sophia-Script

	.NOTES
	Separate arguments with comma
	Current user
#>
[CmdletBinding()]
param
(
	[Parameter(
		Mandatory = $false,
		Position = 0
	)]
	[switch]
	$UnpinAll,

	[Parameter(
		Mandatory = $false,
		Position = 1
	)]
	[ValidateSet("ControlPanel", "DevicesPrinters", "PowerShell")]
	[string[]]
	$Tiles,

	[string]
	$StartLayout = "$PSScriptRootStartLayout.xml"
)

begin
{
	# Unpin all the Start tiles
	if ($UnpinAll)
	{
		Export-StartLayout -Path $StartLayout -UseDesktopApplicationID

		[xml]$XML = Get-Content -Path $StartLayout -Encoding UTF8 -Force
		$Groups = $XML.LayoutModificationTemplate.DefaultLayoutOverride.StartLayoutCollection.StartLayout.Group

		foreach ($Group in $Groups)
		{
			# Removing all groups inside XML
			$Group.ParentNode.RemoveChild($Group) | Out-Null
		}

		$XML.Save($StartLayout)
	}
}

process
{
	# Extract strings from shell32.dll using its' number
	$Signature = @{
		Namespace = "WinAPI"
		Name = "GetStr"
		Language = "CSharp"
		MemberDefinition = @"
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
internal static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax);
public static string GetString(uint strId)
{
	IntPtr intPtr = GetModuleHandle("shell32.dll");
	StringBuilder sb = new StringBuilder(255);
	LoadString(intPtr, strId, sb, sb.Capacity);
	return sb.ToString();
}
"@
	}

	if (-not ("WinAPI.GetStr" -as [type]))
	{
		Add-Type @Signature -Using System.Text
	}

	# Extract the localized "Devices and Printers" string from shell32.dll
	$DevicesPrinters = [WinAPI.GetStr]::GetString(30493)

	# We need to get the AppID because it's auto generated
	$Script:DevicesPrintersAppID = (Get-StartApps | Where-Object -FilterScript {$_.Name -eq $DevicesPrinters}).AppID

	$Parameters = @(
		# Control Panel hash table
		@{
			# Special name for Control Panel
			Name = "ControlPanel"
			Size = "2x2"
			Column = 0
			Row = 0
			AppID = "Microsoft.Windows.ControlPanel"
		},
		# "Devices & Printers" hash table
		@{
			# Special name for "Devices & Printers"
			Name = "DevicesPrinters"
			Size   = "2x2"
			Column = 2
			Row    = 0
			AppID  = $Script:DevicesPrintersAppID
		},
		# Windows PowerShell hash table
		@{
			# Special name for Windows PowerShell
			Name = "PowerShell"
			Size = "2x2"
			Column = 4
			Row = 0
			AppID = "{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}WindowsPowerShellv1.0powershell.exe"
		}
	)

	# Valid columns to place tiles in
	$ValidColumns = @(0, 2, 4)
	[string]$StartLayoutNS = "http://schemas.microsoft.com/Start/2014/StartLayout"

	# Add pre-configured hastable to XML
	function Add-Tile
	{
		param
		(
			[string]
			$Size,

			[int]
			$Column,

			[int]
			$Row,

			[string]
			$AppID
		)

		[string]$elementName = "start:DesktopApplicationTile"
		[Xml.XmlElement]$Table = $xml.CreateElement($elementName, $StartLayoutNS)
		$Table.SetAttribute("Size", $Size)
		$Table.SetAttribute("Column", $Column)
		$Table.SetAttribute("Row", $Row)
		$Table.SetAttribute("DesktopApplicationID", $AppID)

		$Table
	}

	if (-not (Test-Path -Path $StartLayout))
	{
		# Export the current Start layout
		Export-StartLayout -Path $StartLayout -UseDesktopApplicationID
	}

	[xml]$XML = Get-Content -Path $StartLayout -Encoding UTF8 -Force

	foreach ($Tile in $Tiles)
	{
		switch ($Tile)
		{
			ControlPanel
			{
				$ControlPanel = [WinAPI.GetStr]::GetString(12712)
				Write-Verbose -Message ("The `"{0}`" shortcut is being pinned to Start" -f $ControlPanel) -Verbose
			}
			DevicesPrinters
			{
				$DevicesPrinters = [WinAPI.GetStr]::GetString(30493)
				Write-Verbose -Message ("The `"{0}`" shortcut is being pinned to Start" -f $DevicesPrinters) -Verbose

				# Create the old-style "Devices and Printers" shortcut in the Start menu
				$Shell = New-Object -ComObject Wscript.Shell
				$Shortcut = $Shell.CreateShortcut("$env:APPDATAMicrosoftWindowsStart menuProgramsSystem Tools$DevicesPrinters.lnk")
				$Shortcut.TargetPath = "control"
				$Shortcut.Arguments = "printers"
				$Shortcut.IconLocation = "$env:SystemRootsystem32DeviceCenter.dll"
				$Shortcut.Save()

				Start-Sleep -Seconds 3
			}
			PowerShell
			{
				Write-Verbose -Message ("The `"{0}`" shortcut is being pinned to Start" -f "Windows PowerShell") -Verbose
			}
		}

		$Parameter = $Parameters | Where-Object -FilterScript {$_.Name -eq $Tile}
		$Group = $XML.LayoutModificationTemplate.DefaultLayoutOverride.StartLayoutCollection.StartLayout.Group | Where-Object -FilterScript {$_.Name -eq "Sophia Script"}

		# If the "Sophia Script" group exists in Start
		if ($Group)
		{
			$DesktopApplicationID = ($Parameters | Where-Object -FilterScript {$_.Name -eq $Tile}).AppID

			if (-not ($Group.DesktopApplicationTile | Where-Object -FilterScript {$_.DesktopApplicationID -eq $DesktopApplicationID}))
			{
				# Calculate current filled columns
				$CurrentColumns = @($Group.DesktopApplicationTile.Column)
				# Calculate current free columns and take the first one
				$Column = (Compare-Object -ReferenceObject $ValidColumns -DifferenceObject $CurrentColumns).InputObject | Select-Object -First 1
				# If filled cells contain desired ones assign the first free column
				if ($CurrentColumns -contains $Parameter.Column)
				{
					$Parameter.Column = $Column
				}
				$Group.AppendChild((Add-Tile @Parameter)) | Out-Null
			}
		}
		else
		{
			# Create the "Sophia Script" group
			[Xml.XmlElement]$Group = $XML.CreateElement("start:Group", $StartLayoutNS)
			$Group.SetAttribute("Name","Sophia Script")
			$Group.AppendChild((Add-Tile @Parameter)) | Out-Null
			$XML.LayoutModificationTemplate.DefaultLayoutOverride.StartLayoutCollection.StartLayout.AppendChild($Group) | Out-Null
		}
	}

	$XML.Save($StartLayout)
}

end
{
	# Temporarily disable changing the Start menu layout
	if (-not (Test-Path -Path HKCU:SOFTWAREPoliciesMicrosoftWindowsExplorer))
	{
		New-Item -Path HKCU:SOFTWAREPoliciesMicrosoftWindowsExplorer -Force
	}
	New-ItemProperty -Path HKCU:SOFTWAREPoliciesMicrosoftWindowsExplorer -Name LockedStartLayout -Value 1 -Force
	New-ItemProperty -Path HKCU:SOFTWAREPoliciesMicrosoftWindowsExplorer -Name StartLayoutFile -Value $StartLayout -Force

	Start-Sleep -Seconds 3

	# Restart the Start menu
	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}")

	Start-Sleep -Seconds 3

	# Enable changing the Start menu layout
	Remove-ItemProperty -Path HKCU:SOFTWAREPoliciesMicrosoftWindowsExplorer -Name LockedStartLayout -Force -ErrorAction Ignore
	Remove-ItemProperty -Path HKCU:SOFTWAREPoliciesMicrosoftWindowsExplorer -Name StartLayoutFile -Force -ErrorAction Ignore

	Remove-Item -Path $StartLayout -Force

	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}")
}

Создаваемые задания в планировщике заданий

Для начала разберём две задачи по автоматизации очистки папок %TEMP% и %SystemRoot%SoftwareDistributionDownload. Эти папки полезно очищать по расписанию, чтобы они не разрастались. На текущий момент папка временных файлов самоочищается раз в 60 дней, а папка, куда скачиваются установочные файлы для обновлений, — раз в 90 дней.

По завершении задания были добавлены нативные всплывающие тосты, так сказать, из информационно-эстетических соображений.

Windows 10 позволяет генерировать такие тосты очень просто. Пример всплывающего тоста, как на картинке выше:

[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null
[xml]$ToastTemplate = @"
<toast duration="Long">
	<visual>
		<binding template="ToastGeneric">
			<text>Уведомление</text>
			<group>
				<subgroup>
					<text hint-style="body" hint-wrap="true">Кэш обновлений Windows успешно удален</text>
				</subgroup>
			</group>
		</binding>
	</visual>
	<audio src="ms-winsoundevent:notification.default" />
</toast>
"@
$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)

В вызове CreateToastNotifier можно указывать приложение, иконка которого будет отображаться в верхнем левом углу тоста и которое будет открываться при нажатии на тост. В данном случае я использовал windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel — «Настройки». Но вы вольны указать любые приложения. Узнать список всех установленных приложений и их AppID нам поможет команда Get-StartApps.

Напомню, что задача по очистке папки для временных файлов удаляет лишь файлы старше суток:

Get-ChildItem -Path $env:TEMP -Recurse -Force | Where-Object {$_.CreationTime -lt (Get-Date).AddDays(-1)} | Remove-Item -Recurse -Force

А задача по очистке папки %SystemRoot%SoftwareDistributionDownload ждёт остановку службы wuauserv (Центр обновления Windows), чтобы в дальнейшем очистить папку

(Get-Service -Name wuauserv).WaitForStatus('Stopped', '01:00:00')

С заданием по запуску очистки диска и DISM с аргументами всё гораздо веселее. Изначально стояла задача просто запускать предзаготовленный пресет настроек для очистки диска и очистку ненужных обновлений, используя DISM: dism.exe /Online /English /Cleanup-Image /StartComponentCleanup /NoRestart.

Но пришлось решать, как заставить задание запускать очистку диска, сворачивать его окно, а потом также минимизировать окно консоли с запущенным DISM.

Сложность состоит в том, что при запуске очистки диска сначала открывается первое окошко со сканированием того, что можно очистить, потом оно закрывается, и только после этого открывается новое окошко (с новым MainWindowHandle) уже непосредственно с очисткой.

Если первое окошко достаточно легко свернуть:

$ProcessInfo = New-Object -TypeName System.Diagnostics.ProcessStartInfo
$ProcessInfo.FileName = "$env:SystemRootsystem32cleanmgr.exe"
$ProcessInfo.Arguments = "/sagerun:1337"
$ProcessInfo.UseShellExecute = $true
$ProcessInfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Minimized

То над тем, как свернуть второе, я поломал голову, конечно. После многих попыток хоть за что-то зацепиться, я понял, что:

только MainWindowHandle окна может помочь

Get-Process -Name cleanmgr | Stop-Process -Force
Get-Process -Name Dism | Stop-Process -Force
Get-Process -Name DismHost | Stop-Process -Force

$ProcessInfo = New-Object -TypeName System.Diagnostics.ProcessStartInfo
$ProcessInfo.FileName = "$env:SystemRootsystem32cleanmgr.exe"
$ProcessInfo.Arguments = "/sagerun:1337"
$ProcessInfo.UseShellExecute = $true
$ProcessInfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Minimized
$Process = New-Object -TypeName System.Diagnostics.Process
$Process.StartInfo = $ProcessInfo
$Process.Start() | Out-Null

Start-Sleep -Seconds 3

[int]$SourceMainWindowHandle = (Get-Process -Name cleanmgr | Where-Object -FilterScript {$_.PriorityClass -eq "BelowNormal"}).MainWindowHandle

function MinimizeWindow
{
	[CmdletBinding()]
	param
	(
		[Parameter(Mandatory = $true)]
		$Process
	)
	$ShowWindowAsync = @{
		Namespace = "WinAPI"
		Name = "Win32ShowWindowAsync"
		Language = "CSharp"
		MemberDefinition = @'
[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
'@
	}

	if (-not ("WinAPI.Win32ShowWindowAsync" -as [type]))
	{
		Add-Type @ShowWindowAsync
	}

	$MainWindowHandle = (Get-Process -Name $Process | Where-Object -FilterScript {$_.PriorityClass -eq "BelowNormal"}).MainWindowHandle
	[WinAPI.Win32ShowWindowAsync]::ShowWindowAsync($MainWindowHandle, 2)
}

while ($true)
{
	[int]$CurrentMainWindowHandle = (Get-Process -Name cleanmgr | Where-Object -FilterScript {$_.PriorityClass -eq "BelowNormal"}).MainWindowHandle

	if ($SourceMainWindowHandle -ne $CurrentMainWindowHandle)
	{
		MinimizeWindow -Process cleanmgr
		break
	}

	Start-Sleep -Milliseconds 5
}

$ProcessInfo = New-Object -TypeName System.Diagnostics.ProcessStartInfo
$ProcessInfo.FileName = "$env:SystemRootsystem32dism.exe"
$ProcessInfo.Arguments = "/Online /English /Cleanup-Image /StartComponentCleanup /NoRestart"
$ProcessInfo.UseShellExecute = $true
$ProcessInfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Minimized
$Process = New-Object -TypeName System.Diagnostics.Process
$Process.StartInfo = $ProcessInfo
$Process.Start() | Out-Null

Как видно из кода, $SourceMainWindowHandle первого окна ждёт, пока появится $CurrentMainWindowHandle второго окна, и, если, они не равны, то можно минимизировать новое окно. Дальше уже можно запускать DISM с ключами.

Но на этом я не остановился. Понял, что, возможно, пользователю будет неудобно, что за него решают, когда запускается такая задача (которая иногда может потребовать достаточное количество времени). Поэтому пришла идея сделать интерактивный всплывающий тост!

Как видно на скриншоте, пользователю предоставляются на выбор 3 варианта развития событий: отложить вопрос на 1, 30 минут или 4 часа, полностью отклонить предложение (тогда задача запустится через 30 дней) или запустить.

Как устроено это окно. Это всё тот же тост, но, чтобы создать кнопку, запускающую что-либо, кроме открытия страницы в браузере, необходимо сначала зарегистрировать новый протокол. В примере ниже показывается, как я регистрирую протокол WindowsCleanup:

if (-not (Test-Path -Path Registry::HKEY_CLASSES_ROOTWindowsCleanup))
{
	New-Item -Path Registry::HKEY_CLASSES_ROOTWindowsCleanup -Force
}
New-ItemProperty -Path Registry::HKEY_CLASSES_ROOTWindowsCleanup -Name "(default)" -PropertyType String -Value "URL:WindowsCleanup" -Force
New-ItemProperty -Path Registry::HKEY_CLASSES_ROOTWindowsCleanup -Name "URL Protocol" -Value "" -Force
New-ItemProperty -Path Registry::HKEY_CLASSES_ROOTWindowsCleanup -Name EditFlags -PropertyType DWord -Value 2162688 -Force
if (-not (Test-Path -Path Registry::HKEY_CLASSES_ROOTshellopencommand))
{
	New-item -Path Registry::HKEY_CLASSES_ROOTWindowsCleanupshellopencommand -Force
}
# If "Run" clicked run the "Windows Cleanup" task
New-ItemProperty -Path Registry::HKEY_CLASSES_ROOTWindowsCleanupshellopencommand -Name "(default)" -PropertyType String -Value 'powershell.exe -Command "& {Start-ScheduledTask -TaskPath ''Sophia Script'' -TaskName ''Windows Cleanup''}"' -Force

А потом привязываю его на кнопку запуска:

<action arguments=»WindowsCleanup:» content=»$($Localization.Run)» activationType=»protocol»/>

Всё вместе выглядит так:

# Persist the Settings notifications to prevent to immediately disappear from Action Center
if (-not (Test-Path -Path "HKCU:SOFTWAREMicrosoftWindowsCurrentVersionNotificationsSettingswindows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel"))
{
	New-Item -Path "HKCU:SOFTWAREMicrosoftWindowsCurrentVersionNotificationsSettingswindows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel" -Force
}
New-ItemProperty -Path "HKCU:SOFTWAREMicrosoftWindowsCurrentVersionNotificationsSettingswindows.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_ROOTWindowsCleanup))
{
	New-Item -Path Registry::HKEY_CLASSES_ROOTWindowsCleanup -Force
}
New-ItemProperty -Path Registry::HKEY_CLASSES_ROOTWindowsCleanup -Name "(default)" -PropertyType String -Value "URL:WindowsCleanup" -Force
New-ItemProperty -Path Registry::HKEY_CLASSES_ROOTWindowsCleanup -Name "URL Protocol" -Value "" -Force
New-ItemProperty -Path Registry::HKEY_CLASSES_ROOTWindowsCleanup -Name EditFlags -PropertyType DWord -Value 2162688 -Force
if (-not (Test-Path -Path Registry::HKEY_CLASSES_ROOTshellopencommand))
{
	New-item -Path Registry::HKEY_CLASSES_ROOTWindowsCleanupshellopencommand -Force
}
# If "Run" clicked run the "Windows Cleanup" task
New-ItemProperty -Path Registry::HKEY_CLASSES_ROOTWindowsCleanupshellopencommand -Name "(default)" -PropertyType String -Value 'powershell.exe -Command "& {Start-ScheduledTask -TaskPath ''Sophia Script'' -TaskName ''Windows Cleanup''}"' -Force

[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null
[xml]$ToastTemplate = @"
<toast duration="Long" scenario="reminder">
	<visual>
		<binding template="ToastGeneric">
<text>$($Localization.CleanupTaskNotificationTitle)</text>
<group>
	<subgroup>
		<text hint-style="title" hint-wrap="true">$($Localization.CleanupTaskNotificationEventTitle)</text>
	</subgroup>
</group>
<group>
	<subgroup>
		<text hint-style="body" hint-wrap="true">$($Localization.CleanupTaskNotificationEvent)</text>
	</subgroup>
</group>
		</binding>
	</visual>
	<audio src="ms-winsoundevent:notification.default" />
	<actions>
		<input id="SnoozeTimer" type="selection" title="$($Localization.CleanupTaskNotificationSnoozeInterval)" defaultInput="1">
<selection id="1" content="$($Localization.Minute)" />
<selection id="30" content="$($Localization.Minute)" />
<selection id="240" content="$($Localization.Minute)" />
		</input>
		<action activationType="system" arguments="snooze" hint-inputId="SnoozeTimer" content="" id="test-snooze"/>
		<action arguments="WindowsCleanup:" content="$($Localization.Run)" activationType="protocol"/>
		<action arguments="dismiss" content="" activationType="system"/>
	</actions>
</toast>
"@
$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)

Функция ассоциации файлов 

Как известно, начиная с Windows 8 невозможно самостоятельно ассоциировать какое-либо расширение с программой, не вычислив правильный хэш. Как выяснилось, Microsoft проводит манипуляции с захардоженной строкой «User Choice set via Windows User Experience {D18B6DD5-6124-4341-9318-804003BAFA0B}».

Пользователь Danyfirex смог реализовать правильное вычисление хэш-суммы на чистом PowerShell, но, к сожалению, после проведённых тестов выяснилось, что сам PowerShell 5.1 считает его неправильно, поэтому я вынужден был использовать код другого разработчика с алгоритмом, реализованным на чистом C#. Крайне быстро! Функция огромная, поэтому просто оставлю просто ссылку на код.

Автоматизация установки бесплатного расширения для встроенного UWP-приложения Фотографии

Еще одна забавная, но крайне полезная функция даёт возможность открывать файлы формата .heic и .heif.

Расширение крайне полезное, так как все современные телефоны умеют делать фотографии в формате HEIC, но по умолчанию Windows 10 не умеет открывать такие файлы, предлагая купить расширение в Microsoft Store по цене в 0,99 $. Но мало кто знает, что есть скрытая страница от поиска этого же самого расширения, но предназначенного для OEM-производителей. Эту же страницу можно открыть вручную, выполнив через Win+R или через PowerShell: ms-windows-store://pdp/?ProductId=9n4wgh0z6vhq

Для скачивания установочного пакета на помощь приходит всеми известный сайт https://store.rg-adguard.net. Он позволяет, зная ID страницы, получать временные прямые ссылки на установочные пакеты. Значит, можно распарсить.

$API = "https://store.rg-adguard.net/api/GetFiles"
# HEVC Video Extensions from Device Manufacturer
$ProductURL = "https://www.microsoft.com/store/productId/9n4wgh0z6vhq"

$Body = @{
	"type" = "url"
	"url"  = $ProductURL
	"ring" = "Retail"
	"lang" = "en-US"
}
$Raw = Invoke-RestMethod -Method Post -Uri $API -ContentType 'application/x-www-form-urlencoded' -Body $Body

# Parsing the page
$Raw | Select-String -Pattern '<tr style.*<a href="(?<url>.*)"s.*>(?<text>.*)</a>' -AllMatches | ForEach-Object -Process {$_.Matches} | ForEach-Object -Process {
	$TempURL = $_.Groups[1].Value
	$Package = $_.Groups[2].Value

	if ($Package -like "Microsoft.HEVCVideoExtension_*_x64__8wekyb3d8bbwe.appx")
	{
		[PSCustomObject]@{
			PackageName = $Package
			PackageURL  = $TempURL
		}
	}
}

Дальше уже дело техники сохранить и установить скачанный пакет.

Автопродление имен функций по введённым буквам, содержащимся в названии функции или её аргумента

Это последняя значимая функция, добавленная в версию 5.10. Пользователи попросили добавить автопродление функций и их аргументов с помощью табуляции, вводя буквы, содержащиеся в названии функции или её аргументов.

Проблема в том, что до этого была лишь возможность вручную указывать функции и их аргументы а-ля .Sophia.ps1 -Functions «DiagTrackService -Disable», «DiagnosticDataLevel -Minimal», UninstallUWPApps.

То есть ни о каком автопродлении речи и не шло: пользователю приходилось или запоминать имя функции и её аргумент, или копировать вручную данную комбинацию из пресет-файла. То ли дело сейчас!

Чтобы заработала сия шайтан-машина, пришлось прибегнуть к Register-ArgumentCompleter.

Весь код сосредоточен в отдельном файле, и не получится его поместить в текущий пресет-файл: файл необходимо вызывать с использованием dot sourcing. Одним словом, пришлось в ScriptBlock для argumentcompleter перебирать все возможные варианты конструкций вида «функция-аргумент» и просто «функция», если у последней нет собственного аргумента.

Теперь, чтобы вызвать, допустим, функцию по удалению UWP-приложений, можно ввести (после загрузки Functions.ps1) So<tab> -Fu<tab> uwp<tab>.

Крайне жутко выглядит, но стало гораздо удобнее.

Ну, а закончу рассказ на том, что даже сборка прикрепляемых архивов на странице релизов стала осуществляться с помощью конфига Github Actions. Как можно заметить, для создания архива под версию для PowerShell 7 приходится выкачивать две библиотеки с ресурсов Microsoft, так как загрузить файлы больше 25 МБ в репозиторий невозможно. Автоматизируй автоматизацию!

Итоги

Это были крайне плодотворные полгода. У нас такое ощущение, что мы прошли PowerShell на уровне «Ultra Violence». Ну, а что дальше? Параллельно я прорабатываю вариант, как реализовать, используя текущий паттерн взаимодействия пользователя со скриптом, настройку офлайновых образов WIM. Но главный приоритет для нас сейчас, конечно, — разработка SophiApp.

Цель проекта — показать, как, по нашему мнению, должен выглядеть, чувствоваться и каким функционалом обладать так называемый твикер для Windows 10. Идей — просто огромное количество! Хотя у нас нет опыта в разработке и нас всего лишь двое, а весь код на SophiApp пишет в одиночку Дмитрий, возможно, летом уже появится первый рабочий билд. Но это уже совсем другая история.

Хочу выразить огромную благодарность также пользователям forum.ru-board westlife и iNNOKENTIY21: ребят, без вашей помощи и подсказок, всё было бы по-другому! А логотип нарисовала художница tea_head, за что ей тоже спасибо. Скрины, использованные в материале, взяты из мультфильма Коргот-варвар. Группа в Telegram. Любите Windows 10, настраивайте её с умом и до новых встреч!

А если хотите прокачать себя, например получить навыки пентестера и зарабатывать на уязвимостях, или подтянуть знания алгоритмов и структур данных — приходите учиться в SkillFactory, будет сложно, но интересно! 

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

  • Профессия Data Scientist

  • Профессия Data Analyst

  • Курс по Data Engineering

Другие профессии и курсы

Ускорение работы компьютера с Windows 10 на старом, слабом железе

содержание видео

Покажу пошагово, для начинающих, как ускорить работу Windows 10 за несколько минут, при помощи скрипта PowerShell Sophia.

Скрипт Sophia последняя версия:
https://github.com/farag2/Windows-10-Sophia-Script/releases/latest

Первая команда, разрешающая PowerShell запуск скриптов:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force

Команда запуска скрипта:
.Sophia.ps1
После ввода, нажимаем Enter
Дата: 2021-03-09

Комментарии и отзывы: 10

Евгений здравствуйте… Подскажите в чем может быть причина где копать… У меня майнер работает на виндовс 10 программа майнер работает на отключенной безопасности при работе двух видеокарт стоящих в материнке всё хорошо работает но только я подключаю райзер с ещё одной видеокартой меня выбрасывает на синий экран где сказано что необходимо перезагрузить… Я менял райзер, менял местами видюхи, переустанавливал виндовс 10, менял слоты подключения райзера… Минут через 5 всё также выбрасывает… Просто немогу понять ну что ещё сделать… Где найти причину… И как её устранить

lolwtf
На слабый ноут с таким железом лучше ставить win 7/8.1. Хоть тут и SSD стоит что для Win 10 мастхэв, но слабым звеном будет всегда процессор, будет биться в сотку при любых небольших задачах. Нужно по максимуму отключать неиспользуемые службы в системе, убирать все с автозагрузки/планировщика и не давать 10-ке делать что либо в фоне, в таком случае Win 10 можно будет пользоваться и на слабом ноуте/ПК. Но все таки с HDD, слабым процом и малым кол-вом Гб ОЗУ 10-ку лучше не ставить.

Алексей
Здравствуйте! всегда с удовольствием смотрю Ваши видео, спасибо за Ваш труд! У меня такой вопросик: После обновления Винды эту операцию придётся заново проводить? я так понимаю с обновлением все недостающие файлы догрузятся, а приложения опять включатся

Den
Ну во первых в чем отличие скажем от dism++
либо от того же Win 10 Tweaker XpucT
И ещё справедливо было бы добавить что после этих
манипуляций журнал будет сыпать ошибками и система
тест на целостность вряд ли пройдёт

Йожин
Давно на вас подписан, спасибо вам за ваши труды — многое из того, что вы озвучивали, помогло в критических ситуациях с компьютером и системой. Дай Бог здоровья и удач.

kuzik_kiss
юртаев……поменяй манеру подачи материала……такой нудный….тупой…..и слишком затянутый текст….наверное ты его на очке заучиваешь а потом читаешь по бумажке….))))

Куплимед
Блестяще, Юртаев давайте следующие видео про работу в BIOS. Уверен, видео про BIOS соберёт много просмотров, так как на Ютубе мало видео на эту тему.

Александр
У меня вопрос не по теме. Хотелось бы узнать: нужно ли обновлять БИОС и если да, то как это сделать более безопасным методом?

Станислав
Синий квадрат Гейтса шокирует сильнее, чем Черный Малевича.. Так что, поосторожнее с этими оптимизациями и ускорениями.

Кіріл
Здраствуйте, а как ускорить включение виндовс 10 про? Скажите пожалуйста ваши видео очень помагают спасибо большое!

Чуть больше года назад выкладывал свой скрипт по автоматизации настройки Windows 10. Давеча переписал Windows 10 Sophia Script в виде примитивного модуля на 6 000 строк для одноразового использования.

Основные претензии к предыдущей версии были две:

  1. Никто не хотел лезть в 3 500 строк кода и комментировать тот или иной раздел, чтобы он в дальнейшем не выполнялся;

  2. Если необходимо было откатиться на значение по умолчанию, никто не мог разобраться, что именно надо делать.

Теперь скрипт состоит из 2 файлов: непосредственно файл скрипта и файл пресета к нему. Файл скрипта разбит примерно на 270 функций: как для внесения изменений, так и его «отката».

Теперь можно открыть файл пресета, где будет список из всех имеющихся функций (с подробным описанием каждой), и закомментировать строку с функций с помощью знака #, чтобы эта функция не выполнялась, или, наоборот, убрать знак # перед ней, чтобы функция выполнялась. Повторюсь: практически на каждую функцию есть функция на возврат в состояние по умолчанию, как «из коробки».


Поддерживаемые версии

Windows 10 Sophia Script поддерживает только актуальные версии Windows 10: 2004 (20H1) и 2009 (20H2), x64, так как это по сути одна и та же версия. Возможно, чуть позже можно то же самое провернуть и со скриптом, написанным для LTSC (1809), так как эта версия Windows 10 достаточно популярна. Пока что для прочих версий можно использовать предыдущую версию скрипта 4.x.

Напомню основные функции.

Основные функции

  • Настройка уровня телеметрии и конфиденциальности;

  • Отключить задачи диагностического отслеживания;

  • Настроить интерфейс;

  • Удалить «правильно» OneDrive;

  • Изменить путь переменной среды для %TEMP% на %SystemDrive%Temp

  • Изменить программно расположение пользовательских папок;

    • Рабочий стол;

    • Документы;

    • Загрузки;

    • Музыка;

    • Изображения;

    • Видео;

  • С помощью интерактивного меню с использованием стрелок вверх/вниз и клавиши Enter для подтверждения выбора;

  • Удалить UWP-приложения (со списком исключений), используя всплывающую форму, написанную на WPF;

  • Удалить компоненты Windows;

  • Установить WSL;

  • Отключить дополнительные компоненты Windows, используя всплывающую форму, написанную на WPF;

  • Создать задачу в Планировщике задач по очистке неиспользуемых файлов и обновлений Windows;

  • Создать задачи в Планировщике задач по очистке папок;

    • %SystemRoot%SoftwareDistributionDownload

    • %TEMP%

  • Открепить все ярлыки от начального экрана;

  • Закрепить ярлыки на начальном экране, используя syspin.exe

  • Включить контролируемый доступ к папкам и добавить защищенные папки, используя диалоговое меню;

  • Добавить папку в список исключений сканирования Microsoft Defender, используя диалоговое меню;

  • Добавить файлы в список исключений сканирования Microsoft Defender, используя диалоговое меню;

  • Обновить иконки рабочего стола, переменные среды, панель задач и симулировать нажатие F5 для обновления рабочего стола;

  • Множество твиков проводника, контекстного и прочего.

С полным списком функций можно ознакомиться в файле пресета.

Скриншоты

Работа скрипта в действии


Nota bene

  • Перед выполнением стоит еще раз прочитать раздел на Github «Before running».

Использование

  • Скачайте актуальную версию;

  • Настройте файл пресета под себя, закомментировав или раскомментировав функции;

  • Установите политику выполнения скриптов в PowerShell;

    • Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force

  • Запустите скрипт с помощью;

    • .Preset.ps1


Сторонние обзоры скрипта

Немного устаревшее видео (с привязкой ко времени) от Chris Titus Tech :)

  • comss.ru

  • neowin.net

  • ghacks.net

  • deskmodder.de

Скачать с GitHub

→ Windows 10 Sophia Script

P.S. Для тех, кто хочет пойти дальше: мы ищем человека, знающего C#, чтобы помочь дописать графическую оболочку к модулю. Ранний образец, основанный на скетчах.

Понравилась статья? Поделить с друзьями:
  • Sopcast скачать бесплатно на русском языке для windows 10 торрент
  • Sony xperia программа для компьютера windows 7
  • Sony xperia z3 compact драйвер для windows 7
  • Sony wireless state device windows 10 x64
  • Sony wireless state device driver for 64 bit windows 10