Иногда нужно для пользователей програмно закрепить определенные приложения или ярлыки на папки в панели задач (таскбаре) Windows. От версии к версии Windows архитектура управления закрепленными приложениями в панели задач менялась. В частности, мы столкнулись с тем, что большинство ранее используемых скриптов для закрепления/открепления иконок приложений в панели задач, которые работали в предыдущих версиях, не работают в Windows 11. В этой статье мы рассмотрим, несколько PowerShell скриптов, которые позволяют закрепить или открепить ярлыки в таскбаре Windows 11 25H2.
shell:::{4234d49b-0245-4df3-b780-3893943456e1}
через интерфейс Shell COM (доступен во всех версиях Windows и содержит все элементы, доступные для закрепления/открепления в панели задач). По этому пути можно даже перейти в проводнике. Однако в Windows 11 его можно использовать только для открепления ярлыков (см. ниже).Также ранее можно было скопировать нужные ярлыки в каталог
%AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
, чтобы они закрепились на панели задач. В Windows 11 ручное копирование ярлыков в User Pinned\TaskBar также не работает (хотя фактически в этой папке хранятся ярлыки закреплённых приложений).
Такое ощущение, что Microsoft целенаправленно закрывает все возможные программные способы закрепления ярлыков в панели задач без ведома пользователей. Предполагается, что пользователь должен сам вручную назначать закрепленные приложения.

Закрепляем приложение в панели задач Windows с помощью PowerShell
Для централизованной настройки макета закрепленных приложений в панели задач Windows 11 можно использовать специальный
LayoutModification.xml
файл. Применить такой XML файл, который описывает закрепленные ярлыки можно через групповую политику. Однако такой подход не удобен и не гибок, когда вам нужно, к примеру, после развертывания закрепить одно приложение в таскбаре конкретного пользователя.

Следующий PowerShell скрипт создает ярлык (.lnk) на целевое приложение в меню Пуск (это может быть как любое установленное, так и portable приложение). После этого скрипт генерирует временный XML макет для таскбара в разметке LayoutModificationTemplate с ярлыком на приложение и сохраняет его в пользовательский профиль (
%AppData%\Microsoft\Windows\Shell\LayoutModification.xml
). Проводник Windows после перезапуска считывает и применяет макет панели задач из XML файла.
После применения макета панели задач сбрасывается кэш шаблонов, а исходный XML удаляется, что разблокирует макет панели задач.
$AppName = "tcpview64"
$ExePath = "C:\Tools\tcpview64.exe"
$lnkPath = "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\$AppName.lnk"
if (-not (Test-Path $lnkPath)) {
$WshShell = New-Object -Com WScript.Shell
$shortcut = $WshShell.CreateShortcut($lnkPath)
$shortcut.TargetPath = $ExePath
$shortcut.WorkingDirectory = Split-Path $ExePath
$shortcut.IconLocation = $ExePath
$shortcut.Save()
}
$xml = @"
<?xml version="1.0" encoding="utf-8"?>
<LayoutModificationTemplate xmlns:defaultlayout="http://schemas.microsoft.com/Start/2014/FullDefaultLayout"
xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout"
xmlns:taskbar="http://schemas.microsoft.com/Start/2014/TaskbarLayout"
xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification"
Version="1">
<CustomTaskbarLayoutCollection PinListPlacement="Replace">
<defaultlayout:TaskbarLayout>
<taskbar:TaskbarPinList>
<taskbar:DesktopApp DesktopApplicationLinkPath="$lnkPath"/>
</taskbar:TaskbarPinList>
</defaultlayout:TaskbarLayout>
</CustomTaskbarLayoutCollection>
</LayoutModificationTemplate>
"@
$xmlPath = "$env:LOCALAPPDATA\Microsoft\Windows\Shell\LayoutModification.xml"
$xml | Out-File -FilePath $xmlPath -Encoding UTF8 -NoNewline
Remove-Item "$env:LOCALAPPDATA\Microsoft\Windows\Shell\DefaultLayouts" -Recurse -Force -ErrorAction SilentlyContinue
Stop-Process -Name explorer -Force
Start-Sleep 5
Remove-Item $xmlPath -Force -ErrorAction SilentlyContinue

Такой способ закрепления позволяет уйти от жёсткой фиксации ярлыка приложения в таскбаре (как при использовании GPO). Пользователи могут самостоятельно открепить приложение, если оно им не нужно, и оно не вернется в панель задач при следующем входе.
В зависимости от типа закрепляемого приложения, в XML файле нужно использовать определенный синтаксис:
- Для классических Win32 приложений —
<taskbar:DesktopApp>(можно указать как путь к приложению, так и его AppID из результатов Get-StartApps) - Для приложений Microsoft Store (UWP):
<taskbar:UWA>, вместо пути к приложению указывает его имя
Чтобы закрепить UWP приложение, нужно получить его имя:
Get-AppxPackage -AllUsers| select PackageFamilyName
Укажите имя и ID приложения в переменных (в этом примере мы закрепляем Windows Terminal):
$AppName = "Windows Terminal"
$AUMID = "Microsoft.WindowsTerminal_8wekyb3d8bbwe!App"
Чтобы закрепить UWP приложение, замените в XML строку
<taskbar:DesktopApp>
на:
<taskbar:UWA AppUserModelID="$AUMID"/>
Открепить приложение в панели задач Windows 11
Открепить приложение намного проще. Прежде всего нужно получить список зарегистрированных приложений, консолей управления и Microsoft Store приложений, доступных для закрепления в панели задач:
$shell = New-Object -Com Shell.Application
$shell.Namespace('shell:::{4234d49b-0245-4df3-b780-3893943456e1}').Items() | Select Name

Скопируйте короткое имя приложения. Теперь, чтобы программно открепить приложение из панели задач, выполните такой PowerShell скрипт:
$appname = "tcpview64"
((New-Object -Com Shell.Application).NameSpace('shell:::{4234d49b-0245-4df3-b780-3893943456e1}').Items() | ?{$_.Name -eq $appname}).Verbs() | ?{$_.Name.replace('&','') -match 'Unpin from taskbar'} | %{$_.DoIt(); $exec = $true}
Как вы видите, закрепленное приложение исчезло из панели задач.


