Совет недели (2014-04-3): Закрепляем приложения на панели задач

Панель задач и PowerShellКак вы знаете, относительно недавно корпорация Microsoft официально «похоронила» одну из самых популярных операционных систем, а именно систему Windows XP. Это событие поспособствовало переходу многих корпоративных рабочих станций на Windows 8.1. Ну а одна из ключевых проблем, с которой сейчас сталкиваются пользователи, – это возможность быстрого вызова того или иного приложения. Меню «Пуск» ведь пропало, а начальный экран очень многих приводит в замешательство. Следовательно, нужно каким-то образом помочь пользователям как можно быстрее получать доступ к самым важным приложениям.

К одному из таких методов можно отнести размещение ярлыков для необходимых приложений на рабочем столе, однако практика показывает, что в последнее время пользователи все реже переходят к рабочему столу. Что остается? Остается панель задач, о которой и пойдет далее в этой статье речь.

Предварительные этапы и неудачные попытки

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

Казалось бы, «что нам стоит поместить иконки на панель задач?». Если посмотреть на то, как можно управлять ярлыками, расположенными на рабочем столе или на начальном экране, то там все до боли просто. Например, часть ярлыков, которые находятся на рабочем столе, располагаются в папке C:\Users\Public\Desktop, а ярлыки, которые можно найти на начальном экране, «живут» в папке C:\ProgramData\Microsoft\Windows\Start Menu\Programs, и об этом знают почти все. Чтобы поместить ярлык на рабочий стол или на начальный экран, достаточно лишь скопировать lnk-файл в требуемую папку, и все будет хорошо. Удаляются ярлыки точно так же. Просто удаляем из папки файл и все – ярлыка уже нет. Но вот с панелью задач все иначе и гораздо менее радужно.

После беглого «ресерчинга» можно обнаружить, что все закрепленные на панели задач элементы находятся в папке %UserProfile%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar, но с ними не все так просто. Если мы скопируем в эту папку ярлык, ничего не произойдет. То есть в папке просто будет находиться новый файл, но никакого визуального эффекта заметно не будет.

Далее можно попробовать через инструменты, позволяющие выполнять мониторинг системного реестра, локализовать раздел и параметры, отвечающие за закрепленные на панели задач элементы. Таким разделом реестра будет выступать раздел HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband, где находятся пять параметров. Но в этом разделе вы не найдете параметров, которые явным образом отвечают за тот или иной ярлык, который вы могли бы добавить, изменить или удалить. Здесь находится информация о точном «слепке» всех закрепленных элементов. Получается, путем экспорта этих параметров вы можете лишь воссоздать свои закрепленные элементы и все. А для централизованного пользования этот вариант не подойдет, т.к. у каждого пользователя, скорее всего, хоть чем-то да будут отличаться закрепленные на панели задач элементы.

Выходит, что простое копирование файлов или изменение конкретных параметров системного реестра в этом случае ничего не дадут. Следовательно, для централизованного закрепления элементов на панели задач не получится ни воспользоваться ни предустановленными административными шаблонами, ни элементами предпочтений реестра, ярлыков или же файлов. Нужно искать «обходные пути».

Решение 1 – скриптовое

Как я люблю всем говорить, «то, что не удается реализовать при помощи системного реестра, можно осуществить средствами Windows PowerShell», и эта задача не является исключением. Как очевидно, для решения такой задачи не существует предустановленного командлета, который бы позволил вам закрепить на панели задач свои элементы. Поэтому нужно будет создать такой командлет.

Чтобы не изобретать велосипед, можно посмотреть на скрипт, написанный норвежским MVP по PowerShell Jan Egil Ring. Этот скрипт создает новый командлет Set-PinnedApplication с параметрами Action и FilePath, позволяющими указать требуемое действие (закрепление или изъятие программы из панели задач), а также путь к целевому ярлыку. Последней строкой в этом скрипте просто укажем само выполнение командлета для закрепления на панели задач определенной программы, например, в данном случае это будет Microsoft Outlook 2013. Скрипт выглядит следующим образом:

function Set-PinnedApplication
{
   	[CmdletBinding()]
   	param(
      [Parameter(Mandatory=$true)][string]$Action, 
	  [Parameter(Mandatory=$true)][string]$FilePath
   	)
   	if(-not (test-path $FilePath)) { 
   		throw "FilePath does not exist."  
	}
   	function InvokeVerb {
   		param([string]$FilePath,$verb)
		$verb = $verb.Replace("&","")
		$path= split-path $FilePath
		$shell=new-object -com "Shell.Application" 
		$folder=$shell.Namespace($path)   
		$item = $folder.Parsename((split-path $FilePath -leaf))
		$itemVerb = $item.Verbs() | ? {$_.Name.Replace("&","") -eq $verb}
		if($itemVerb -eq $null){
			throw "Verb $verb not found."			
		} else {
			$itemVerb.DoIt()
		}
   	}
	function GetVerb {
		param([int]$verbId)
		try {
			$t = [type]"CosmosKey.Util.MuiHelper"
		} catch {
			$def = [Text.StringBuilder]""
			[void]$def.AppendLine('[DllImport("user32.dll")]')
			[void]$def.AppendLine('public static extern int LoadString(IntPtr h,uint id, System.Text.StringBuilder sb,int maxBuffer);')
			[void]$def.AppendLine('[DllImport("kernel32.dll")]')
			[void]$def.AppendLine('public static extern IntPtr LoadLibrary(string s);')
			add-type -MemberDefinition $def.ToString() -name MuiHelper -namespace CosmosKey.Util			
		}
		if($global:CosmosKey_Utils_MuiHelper_Shell32 -eq $null){		
			$global:CosmosKey_Utils_MuiHelper_Shell32 = [CosmosKey.Util.MuiHelper]::LoadLibrary("shell32.dll")
		}
		$maxVerbLength=255
		$verbBuilder = new-object Text.StringBuilder "",$maxVerbLength
		[void][CosmosKey.Util.MuiHelper]::LoadString($CosmosKey_Utils_MuiHelper_Shell32,$verbId,$verbBuilder,$maxVerbLength)
		return $verbBuilder.ToString()
	}
	$verbs = @{ 
		"PintoTaskbar"=5386
		"UnpinfromTaskbar"=5387
	}
	if($verbs.$Action -eq $null){
   		Throw "Action $action not supported`nSupported actions are:`n`tPintoTaskbar`n`tUnpinfromTaskbar"
	}
	InvokeVerb -FilePath $FilePath -Verb $(GetVerb -VerbId $verbs.$action)
}
Set-PinnedApplication -Action PintoTaskbar -FilePath 'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Office 2013\Outlook 2013.lnk' 

После выполнения скрипта у пользователя на панели задач будет закреплен Outlook.

Теперь посмотрим, как же можно выполнить такой скрипт централизованно на нескольких компьютерах компании.

  1. В оснастке «Управление групповой политикой» (Group Policy Management) создается новый объект групповой политики, скажем, «Taskbar_Pinned_Items_PowerShell», и для него вызывается редактор GPME;
  2. Находясь в оснастке редактора управления групповыми политиками, перейдите к узлу Конфигурация компьютера\Политики\Конфигурация Windows\Сценарии (запуск/завершение) (Computer Configuration/Windows Settings/Scripts (Startup/Shutdown)), а затем дважды щелкните по параметру политики «Автозагрузка» (Startup);
  3. В отобразившемся диалоговом окне свойств параметра политики, так как будет внедряться скрипт PowerShell, перейдите ко вкладке «Сценарии PowerShell» (PowerShell Scripts), где нужно будет добавить свой скрипт. Как вы знаете, дабы упростить процесс выбора файла, такой файл заранее желательно скопировать в буфер обмена, а после чего достаточно будет нажать на кнопку «Добавить» (Add), затем в новом диалоговом окне нажать на кнопку «Обзор» (Browse) и вставить из буфера обмена в окно обзора ваш файл со скриптом. Должна получиться такая вкладка:

    Настроенный параметр политики

    Рис. 1. Настроенный параметр политики

  4. Теперь можно обновлять параметры политики и перезагружать целевую машину.

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

Решение 2 – GUI и сторонние утилиты

Решение, о котором вы узнаете из этого раздела, позволяет закреплять различные компоненты операционной системы и ярлыка для обычных приложений на панели задач последних операционных систем от корпорации Microsoft. Для решения средствами графического интерфейса вы можете воспользоваться утилитой «Pin to 8», которая написана Сергеем Ткаченко.

Утилита отлично отрабатывает как на клиентских, так и на серверных операционных системах за исключением того, что под Windows 8.1 вы не сможете корректно закреплять ярлыки на панели задач, которые размещаются в папке с элементами начального экрана. Как видно на следующей иллюстрации, утилита очень проста в использовании, и сразу же после первого открытия вы с ней разберетесь. При помощи этой утилиты вы сможете закрепить на панели задач любой файл, папку, существующую на компьютере библиотеку или же некоторые специальный системные элементы. Опять же, как видно ниже, по нажатию на тайлы «Pin a Library» или «Pin Special Item» вам предоставляется перечень добавляемых компонентов. В общем, все просто и удобно:

Внешний вид утилиты Pin to 8

Рис. 2. Внешний вид утилиты Pin to 8

Отдельно хотелось бы отметить возможности работы утилиты непосредственно из командной строки. Для этого вам нужно указать путь к утилите, параметр /t, отвечающий за закрепление элемента на панели задач, а также ввести путь к закрепляемому приложению. Например, как можно найти на странице загрузки утилиты, «Pin to 8.exe» /t c:\DWM\DWMLoader.exe.

Ну а чтобы единожды закрепить приложение на панели задач при помощи этой утилиты, вы можете при помощи предпочтений групповой политики скопировать ее на целевые компьютеры, а после этого средствами элемента предпочтения назначенных заданий запустить ее один раз, установив флажок «Применить один раз и не применять повторно» (Apply once and do not reapply) на вкладке «Общие параметры» (Common Options) вашего элемента предпочтения, а в качестве триггера выбрать, скажем, выполнение задачи во время входа пользователем в систему.

Получается, решить заданную в сегодняшней статье задачу вполне реально. Главное определиться, каким именно методом вы будете закреплять элементы на своих панелях задач. До встреч!

VN:F [1.9.22_1171]
Rating: 8.1/10 (11 votes cast)
Совет недели (2014-04-3): Закрепляем приложения на панели задач, 8.1 out of 10 based on 11 ratings

15 комментариев

  1. Интересная тема, только возникает еще вопрос, как убрать стандартно закрепленные приложения? Причем интересны были бы два способа: какое-то конкретно и все разом.

    В той же 7ке — проводник и медиаплеер.

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
    1. Убрать конкретное приложение можно и при помощи этого скрипта. Для этого в последней строке Вам нужно будет в качестве значения параметра -Action прописать UnpinfromTaskbar 😉

      VN:F [1.9.22_1171]
      Rating: +2 (from 2 votes)
  2. При этом где должен «лежать» ярлык «Outlook 2013.lnk», в папке с политикой или он берётся локально с компа где отрабатывается данная политика? На Windows 7 это сработает?

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
    1. Смотрите, ярлык мы находим по пути ‘C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Office 2013\Outlook 2013.lnk’. Это содержимое папки начального экрана (менрю Пуск в пред версиях). Если там есть ярлык — он появится на таскбаре. Работать должно как под 8-кой, так и под 7-кой.

      VN:F [1.9.22_1171]
      Rating: 0 (from 0 votes)
  3. Изменил путь в скрипте на такой «C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Office 2013\Outlook 2013.lnk» для добавления его на панель задач. Физически ярлык по этому пути на машине есть. Политика не отработала, ярлык не появился. Есть подозрения что на это повлияли другие GPO, которые ограничивают изменение панели задач. Попробую их отключить, проверить. И ещё вопрос, если мне нужно добавить «пачку» ярлыков, в конце скрипта нужно «размножить» последнюю строку, изменив в каждой имя добавляемого ярлыка? Ах да, всё это в среде Windows 7.

    p.s. Отличный сайт, очень много нашёл для себя здесь. Спасибо за труды. Кстати, давно не было новых статей 🙂

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
    1. Чтобы добавить сразу несколько ярлыков, нужно продублировать последнюю строку (которая с новым командлетом Set-PinnedApplication). Затем, проверьте, выполнится ли корректно скрипт на любой машине без использования GPO. Грубо говоря, ручками скрипт запустить.
      Новые статьи будут публиковаться уже со следующей недели 🙂

      VN:F [1.9.22_1171]
      Rating: 0 (from 0 votes)
  4. тоесть на такой путь «C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Office\Microsoft Office Word 2003.lnk»

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  5. Под локальным админом отратало на ура, но, перед этим нужно было включить выполнение скриптов. В доменной учётке пользователя, скрипт не отрабатывает. Когда я включил выполнение скриптов из локального админа, эта настройка применилась только к локальному адмнину? В доменной учётке пытался включить выполнение скриптов, выдало ошибку, мол нет прав в HKML вертку для включения данного функционала.

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  6. Дал права на требуемую ветку, выполнение скриптов стало доступно доменному пользователю, но скрипт не отрабатывает, выдаёт ошибку в строке 20 знак 9.

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
    1. Специально по подписям скриптов скоро будет статья. Надеюсь, что поможет для большинства ситуаций

      VN:F [1.9.22_1171]
      Rating: 0 (from 0 votes)
  7. Отключил большинство политик для данного пользователя, скрипт не отработал при рестарте машины, но, он отработал когда я запустил повершелл, и подкинул в него скрипт. В принципе понимаю где собака зарыта, но не понимаю почему при загрузке компа и входе доменной учётки скрипт не отрабатывает. Добавлен он в:
    Конфигурация компьютера (включено)
    Политики
    Конфигурация Windows
    Сценарии
    Автозагрузка
    Сценарии PowerShell

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  8. У меня кстати такая же проблема, скрипт подписан, в гпо разрешено выполнение. Добавляю скрипт — при входе не выполняется, запускаю вручную — пожалуйста

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  9. Есть ощущение, что я не правильно понял данную тему.
    Я понял так: то, что тут пытаются сделать с помощью каких-то скриптов, свободно делается используя лазейку Windows, которая тянется еще с XP — закрепляешь любой элемент в панель задач, заходишь в папку «TaskBar», переименовываешь ярлык на «Подключение по локальной сети — ярлык», копируешь/перемещаешь с заменой ярлык к элементу подключение по локальной сети. Управление Ethernet-адаптером у тебя под носом.

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  10. Скрипт нужно запускать не в разделе компьютер — автозагрузка, а в ветке пользователя — логон. Вам ярлык ведь нужен пользователю

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *