Windows 10: Скрипт для удаления лишних плиток меню Пуск

Статья не полная!

Данный скрипт удалил все (кроме Магазина) modern-приложения (так называемые «метро»-приложения) для текущего пользователя:

Powerhell
Get-AppXPackage | where-object {$_.name –notlike '*store*'} | Remove-AppxPackage

Однако после запуска скрипта, в меню Пуск всё ещё были ярлыки на приложения Офис (Outlook, Word, Excel и PowerPoint). При детальном «осмотре» оказалось, что это ярлыки на вэб-ресурс. Например, для Word ярлык был таким:

https://word.office.com

Таким образом, приложения хоть и удалились, но рекламные ярлыки к ним остались.
Windows 10: Скрипт для удаления лишних плиток меню Пуск
Если раскрыть такую группу, то там будут ссылки на соответствующие продукты online:
Windows 10: Скрипт для удаления лишних плиток меню Пуск
Я решил разобраться, как же можно вычистить и этот мусор тоже.

Структура меню Пуск

В Windows 10 меню Пуск состоит как бы из двук частей.

Первая — это классический Пуск с иерархией в виде ярлыков или папок. Здесь для большей части ярлыков приложений будут доступны такие опции контекстного меню:

  • Pin to Start
  • More (Pin to taskbar, Run as administrator, Open file location)
  • Uninstall

Вторая часть — это пространство с плитками. В этой части у ярлыков есть такие общие команды:

  • Unpin from Start
  • Resize
  • More (Pin to taskbar, Run as administrator, Open file location)
  • Uninstall

Так вот для ярлыков-плиток офиса были доступны только такие варианты:

  • Unpin from Start
  • Resize
  • More (Turn Live Tile on)

«Классическая» часть меню Пуск генерируется из списка файлов и папок, которые находятся в общем профиле пользователя:

C:\Users\All Users\Microsoft\Windows\Start Menu\Programs

Это то же самое, что и такая папка:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs

Плюс личные ярлыки пользователя:

C:\Users\<USER>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

В этом случае вложенные папки могут быть, но отображатся в Пуске будет только родительская папка, минуя вложенные папки.
Например, вы откроете в Проводнике папку C:\Users\<USER>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell.
В ней создадите вложенные папки x86 и x64.
Затем туда поместите ярлыки Windows PowerShell (x86) и Windows PowerShell соответственно, то в Пуске всё равно будет видна только ОДНА папка Windows PowerShell, в ней будут объединены ярлыки из двух вложенных папок. При этом в Пуске не будет видно вложенных папок.
«Плиточная» часть меню Пуск генерируется из xml-таблицы. Она хранится где-то в памяти, но эту структуру можно сохранить в файл:

PowerShell
Export-StartLayout -UseDesktopApplicationID -Path $Env:TEMP\startlayout.xml

В данном примере плитки и их расположение будут сохранены в файл во временной папке:

C:\Users\<USER>\AppData\Local\Temp\startlayout.xml

Структура файла startlayout.xml

Сохранённый файл будет таким:

<LayoutModificationTemplate xmlns:defaultlayout="http://schemas.microsoft.com/Start/2014/FullDefaultLayout" xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout" Version="1" xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification">
  <LayoutOptions StartTileGroupCellWidth="6" />
  <DefaultLayoutOverride>
    <StartLayoutCollection>
      <defaultlayout:StartLayout GroupCellWidth="6">
        <start:Group Name="Productivity">
          <start:Folder Name="" Size="2x2" Column="2" Row="0">
            <start:SecondaryTile AppUserModelID="Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge" TileID="38975140460" DisplayName="" Size="2x2" Column="2" Row="2" Arguments="-contentTile -url 0 https://powerpoint.office.com" Square71x71LogoUri="ms-appdata:///local/PinnedTiles/38975140460/tinytile.png" Square150x150LogoUri="ms-appdata:///local/PinnedTiles/38975140460/squaretile.png" Wide310x150LogoUri="ms-appx:///" Square310x310LogoUri="ms-appx:///" ShowNameOnSquare150x150Logo="true" ShowNameOnWide310x150Logo="false" BackgroundColor="#ff8f2d15" ForegroundText="light" />
            <start:SecondaryTile AppUserModelID="Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge" TileID="6501008900" DisplayName="" Size="2x2" Column="4" Row="0" Arguments="-contentTile -url 0 https://excel.office.com" Square71x71LogoUri="ms-appdata:///local/PinnedTiles/6501008900/tinytile.png" Square150x150LogoUri="ms-appdata:///local/PinnedTiles/6501008900/squaretile.png" Wide310x150LogoUri="ms-appx:///" Square310x310LogoUri="ms-appx:///" ShowNameOnSquare150x150Logo="true" ShowNameOnWide310x150Logo="false" BackgroundColor="#ff104026" ForegroundText="light" />
            <start:SecondaryTile AppUserModelID="Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge" TileID="26310719480" DisplayName="" Size="2x2" Column="0" Row="0" Arguments="-contentTile -url 0 https://outlook.com" Square71x71LogoUri="ms-appdata:///local/PinnedTiles/26310719480/tinytile.png" Square150x150LogoUri="ms-appdata:///local/PinnedTiles/26310719480/squaretile.png" Wide310x150LogoUri="ms-appx:///" Square310x310LogoUri="ms-appx:///" ShowNameOnSquare150x150Logo="true" ShowNameOnWide310x150Logo="false" BackgroundColor="#ff06417a" ForegroundText="light" />
            <start:SecondaryTile AppUserModelID="Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge" TileID="7603651830" DisplayName="" Size="2x2" Column="2" Row="0" Arguments="-contentTile -url 0 https://word.office.com" Square71x71LogoUri="ms-appdata:///local/PinnedTiles/7603651830/tinytile.png" Square150x150LogoUri="ms-appdata:///local/PinnedTiles/7603651830/squaretile.png" Wide310x150LogoUri="ms-appx:///" Square310x310LogoUri="ms-appx:///" ShowNameOnSquare150x150Logo="true" ShowNameOnWide310x150Logo="false" BackgroundColor="#ff15366b" ForegroundText="light" />
         </start:Folder>
         <start:Tile Size="2x2" Column="4" Row="0" AppUserModelID="Microsoft.WindowsStore_8wekyb3d8bbwe!App" />
         <start:Tile Size="2x2" Column="0" Row="0" AppUserModelID="Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge" />
       </start:Group>
     </defaultlayout:StartLayout>
   </StartLayoutCollection>
  </DefaultLayoutOverride>
</LayoutModificationTemplate>

Применение файла с экспортированной конфигурацией расположения плиток меню Пуск

Как было сказано выше, Export-StartLayout экспортирует настройки расположения плиток меню Пуск для текущего пользователя. Нам это подошло, поэтому мы использовали данный командлет. По логике, для импортирования сохранённых ранее настроек, нам может потребоваться Import-StartLayout. Однако тут есть проблема — данная операция импортирует настройки для примонтированного образа Windows. Т.е. не для текущего пользователя, а для дефолтового. Нам это не нужно. После продолжительного копания, выяснилось, что эти настройки можно применить через групповые политики, запустив gpedit.msc (здесь нам нужны настройки только на уровне пользователя, а не всей машины, поэтому выбираем User Configuration).
Полный путь будет такой:
gpedit.mscUser ConfigurationAdministrative TemplatesStart Menu and TaskbarStart Layout:
Windows 10: Скрипт для удаления лишних плиток меню Пуск
Здесь нам нужно включить эту политику (Enabled) и вписать путь для «Start Layout File» — это тот самый .XML-файл, в который мы экспортировали конфигурацию расположения плиток.

Данный путь нужно указывать без двойных кавычек!

 

После изменения этой политики нужно завершить сеанс пользователя, либо перезагрузить компьютер.


При применении данной политики возникает ещё одна проблема — часть меню Пуск с плитками становится доступной только для чтения! Пользователь уже не может добавить свой набор значков на область с плитками.

 

Для решения этой проблемы нам пригодится элемент <DefaultLayoutOverride>. Нам необходимо заменить его на такую строчку:

<DefaultLayoutOverride LayoutCustomizationRestrictionType="OnlySpecifiedGroups">

Применив данный файл шаблона, в начале названия группы плиток появится значок замочка. Он означает, что данная группа заблокирована для редактирования пользователем. При этом всё остальное пространство для плиток можно настраивать пользователю как ему удобно!
Windows 10: Скрипт для удаления лишних плиток меню Пуск

Место расположения файла DefaultLayouts.xml в этой папке профиля пользователя:
C:\Users\<USER>\AppData\Local\Microsoft\Windows\Shell\

Текущие настройки расположения плиток хранятся в реестре в состоянии каши где-то здесь (хотя я не уверен, т.к. просто нарыл эту инфу в инете без ссылки на первоисточник):
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\Cache\DefaultAccount
Поскольку всё это в двоичном виде, то можно это лишь копировать и восстанавливать. Но изменять, увы, нельзя. По крайней мере я не знаю алгоритма.
Значит будем править и восстанавливать через политики.

 

Изменение конфигурации расположения плиток меню Пуск через реестр

Через политики нам получилось изменить расположение плиток, но нужно сделать этот как-то через скрипт. Данную политику можно записать напрямую в реестр (необходимы права админа), путь будет таким:
HKCU\Software\Policies\Microsoft\Windows\Explorer
Сам путь будет хранится в ключе StartLayoutFile, хотя напрямую нам это мало поможет, т.к. данное значение будет в формате REG_EXPAND_SZ:

A null-terminated string that contains unexpanded references to environment variables (for example, «%PATH%»). It will be a Unicode or ANSI string depending on whether you use the Unicode or ANSI functions. To expand the environment variable references, use the ExpandEnvironmentStrings function.

 

То есть эта строка для нас практически нечитаема:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Explorer]
"LockedStartLayout"=dword:00000001
"StartLayoutFile"=hex(2):43,00,3a,00,5c,00,55,00,73,00,65,00,72,00,73,00,5c,00,\
  44,00,65,00,6e,00,69,00,73,00,5c,00,44,00,6f,00,63,00,75,00,6d,00,65,00,6e,\
  00,74,00,73,00,5c,00,73,00,74,00,61,00,72,00,74,00,6c,00,61,00,79,00,6f,00,\
  75,00,74,00,2d,00,73,00,68,00,6f,00,72,00,74,00,2e,00,78,00,6d,00,6c,00,00,\
  00

В данном случае для нас это не такая большая проблема, т.к. мы планируем использовать скрипт.



Подписаться
Уведомление о
guest
4 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Екатерина

Добрый вечер!
Помогите, пожалуйста написать скрипт (Удалить лишние программы из меню пуск) PowerShell, чтобы он отрабатывал через GPO

Екатерина

У меня есть список:
# .Net methods for hiding/showing the console in the background
Add-Type -Name Window -Namespace Console -MemberDefinition ‘
[DllImport(«Kernel32.dll»)]
public static extern IntPtr GetConsoleWindow();

[DllImport(«user32.dll»)]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);

function Hide-Console
{
   $consolePtr = [Console.Window]::GetConsoleWindow()
   #0 hide
   [Console.Window]::ShowWindow($consolePtr, 0)
}
Hide-Console
Get-AppxPackage *solitairecollection* | Remove-AppxPackage
Get-AppxPackage *WindowsStore* -AllUsers | Remove-AppxPackage
Get-AppxPackage *Xbox* -AllUsers | Remove-AppxPackage
Get-AppxPackage *WindowsAlarms* -AllUsers | Remove-AppxPackage
Get-AppxPackage *YourPhone* -AllUsers | Remove-AppxPackage
Get-AppxPackage *WindowsSoundRecorder* -AllUsers | Remove-AppxPackage
Get-AppxPackage *WindowsCamera* -AllUsers | Remove-AppxPackage
Get-AppxPackage *WindowsMaps* -AllUsers | Remove-AppxPackage
Get-AppxPackage *ZuneVideo* -AllUsers | Remove-AppxPackage
Get-AppxPackage *People* -AllUsers | Remove-AppxPackage
Get-AppxPackage *ZuneMusic* -AllUsers | Remove-AppxPackage
Get-AppxPackage *ScreenSketch* -AllUsers | Remove-AppxPackage
Get-AppxPackage *BingWeather* -AllUsers | Remove-AppxPackage
Get-AppxPackage *MixedReality* -AllUsers | Remove-AppxPackage
Get-AppxPackage *OneConnect* -AllUsers | Remove-AppxPackage
Get-AppxPackage *Getstarted* -AllUsers | Remove-AppxPackage
Get-AppxPackage *Messaging* -AllUsers | Remove-AppxPackage
Get-AppxPackage *GetHelp* -AllUsers | Remove-AppxPackage
Get-AppxPackage *Windows.Photos* -AllUsers | Remove-AppxPackage
Get-AppxPackage *FeedbackHub* -AllUsers | Remove-AppxPackage
Get-appxpackage -allusers Microsoft.549981C3F5F10 | Remove-AppxPackage