Хотя на тему добавления возможностей к контекстным меню операционной системы Windows уже написан целый ряд статей, она не становится менее актуальной. Контекстным меню пользуемся мы все, причем независимо от того, работаем за классическими либо за планшетными компьютерами. Сегодня я расскажу о том, как при помощи реестра Windows и возможностей групповой политики можно добавить новые пункты в контекстное меню, а также о методе обнаружения разделов и параметров реестра, отвечающих за добавление пунктов, которые можно найти в контекстных меню системы Windows.

Настройки элементов контекстного меню

Как известно, каждый раз, когда пользователь щелкает правой кнопкой мыши по определенному объекту в графическом интерфейсе операционной системы, открывается контекстное меню, включающее в себя список команд, которые конечный пользователь может выбрать для выполнения того или иного действия. Такие команды также известны как элементы контекстного меню, или же глаголы (Verbs). При взаимодействии с объектами вы можете обнаружить как стандартные элементы меню (к которым относятся, например, команды «Вырезать», «Вставить», «Удалить»), так и специальные команды, к которым пользователь получает доступ при взаимодействии с определенными типами файлов (например, для медиафайлов это могут быть команды, связанные с воспроизведением, а для текстовых файлов — команды печати либо редактирования содержимого файла). Ввиду того что все типы файлов регистрируются в системном реестре операционной системы, если вы попробуете вызвать меню для незарегистрированного типа файла (например, *.abc123), вам будут предоставлены лишь стандартные элементы меню.

Обратите внимание на то, что каждая команда в контекстном меню должна быть идентифицирована в системном реестре при помощи определенного глагола, который в свою очередь используется функцией ShellExecuteEx для запуска конкретного приложения. Этот глагол представляет собой обыкновенную текстовую строку, используемую оболочкой Shell для идентификации связанной команды. Каждый такой глагол соответствует команде, запускаемой в командной строке консоли или пакетному файлу с расширением bat.

Как и в случае с использованием командной строки, если какой-либо элемент для добавляемого вами объекта контекстного меню содержит пробелы, он должен быть заключен в кавычки. В противном случае, если элемент содержит пробел, но не заключен в кавычки, он будет обрабатываться неправильно. Например, если указать в качестве пути к приложению, скажем, «New Application.exe», приложение будет выполнено корректно. Но если вы укажете в качестве пути New Application.exe без кавычек, то операционная система попытается запустить несуществующую программу New с Application.exe в качестве первого параметра. А ввиду того что имя выполняющегося процесса может быть не самым информативным (вспомним в качестве примера файл «powershell.exe» и его отображаемое имя «Windows PowerShell»), выполнить такую задачу не удастся. Кстати, глаголы могут еще включать в себя имя, которое будет отображаться уже в самом контекстном меню, так что эти имена также следует указывать в кавычках.

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

Эта процедура по умолчанию, в сущности, выполняет две основные задачи:

  • определение того, как приложение должно запускаться для открытия произвольного типа файла;
  • определение дополнительных уникальных характеристик для типа файла, к которым можно отнести элементы контекстного меню и ярлыки.

Вернемся теперь к настройкам элементов контекстного меню и рассмотрим, где в реестре размещаются параметры, отвечающие за эти элементы. Вся информация, которую операционная система Windows использует при работе с файлами, заключена в ветви реестра HKEY_CLASSES_ROOT. Другими словами, если вы в «Проводнике Windows» открываете какой-то документ, в этот момент операционная система Windows запускает программу, которая при помощи процедуры по умолчанию связана с этим документом. Информация о тех функциях системы, о которых говорилось выше, включая расширения файлов, их взаимодействие с программами, печать, значки для зарегистрированных типов документов и многое другое, хранится в ветви HKEY_CLASSES_ROOT.

Беглое изучение разделов этой ветви реестра показывает, что здесь можно найти практически все возможные типы файлов. Огромное количество типов файлов регистрируется в операционной системе в процессе установки. К таким типам файлов можно отнести JPG, DOCX и другие. В свою очередь, некоторые специальные типы файлов появятся в системном реестре только после установки соответствующих приложений. К таким типам файлов можно отнести, например, VSDX после установки продукта Microsoft Office Visio.

В ветви реестра HKEY_CLASSES_ROOT для каждого зарегистрированного типа файлов отведено два специальных раздела. Имя первого такого раздела совпадает с расширением файла (например,. mkv) и содержит идентификатор (в данном случае — WMP11.AssocFile.MKV). А вот уже в разделе WMP11.AssocFile.MKV вы найдете дополнительную информацию о выбранном типе файлов. К такой информации можно отнести определение этого типа файлов, его значок, действия, которые должны выполняться при его использовании и многое другое. Все эти нюансы мы рассмотрим ниже.

Помимо упомянутых двух разделов для редактирования различных пунктов контекстного меню, вам еще могут пригодиться следующие ключевые подразделы ветви HKEY_CLASSES_ROOT:

  • *. Этот подраздел отвечает за все файлы, хранящиеся на компьютере, причем независимо от того, зарегистрирован выбранный тип файла или нет.
  • AllFileSystemObjects. В этом разделе реестра хранится информация, связанная со всеми файлами и папками. По сути, если вы хотите внести изменения в эту категорию, то лучше всего изменять параметры именно в данном разделе.
  • Folder. Изменив содержимое этого раздела, вы сможете управлять пунктами контекстного меню для выбранной в проводнике папки.
  • Directory. В данном случае изменениям подвергнутся все файлы, находящиеся внутри открытой пользователем папки.
  • Directory\Background. Изменив содержимое этого раздела, вы сможете добавить, изменить или удалить пункты контекстного меню для фоновой области папки «Проводника Windows» (когда вы вызываете контекстное меню внутри какой-то папки, при этом не выделяя ни одного файла).
  • DesktopBackground. Здесь нам предоставляется возможность изменить контекстное меню для рабочего стола операционной системы Windows.
  • Drive. Если вы внесете изменения в реестр для этого подраздела, то ваши действия повлекут за собой изменения, связанные с дисками в «Проводнике Windows».
  • Network. Внутри данного раздела вы можете вносить изменения в контекстное меню объектов, связанных с сетевым окружением.
  • Network\Type\#. Данные подразделы позволяют вам вносить изменения в объекты типа #, где «#» — это код типа сетевого провайдера, указанный в десятичном формате.
  • Printers. Здесь можно получить доступ к пунктам контекстного меню, связанного с принтерами.

Кроме того, можно выделить несколько канонических глаголов, которые вы найдете почти в каждом разделе Shell идентификатора типа файлов. К таким глаголам относятся:

  • Open. Элемент, отвечающий за открытие файла или папки.
  • Opennew. Открытие файла или папки в новом окне.
  • Print. Печать файла.
  • Explore. Открытие «Проводника Windows» для выбранной папки.
  • Find. Открытие диалогового окна системного поиска с папкой, заданной в качестве расположения поиска, установленного по умолчанию.
  • Openas. Отвечает за диалоговое окно «Открыть с помощью».
  • Properties. Открытие диалогового окна свойств выделенного объекта.

Создаем свой элемент контекстного меню

Итак, с теоретической частью мы закончили и теперь можем перейти к практическим шагам. Перед тем как создавать новые элементы контекстного меню, давайте разберем строение существующих. Для примера рассмотрим раздел «HKEY_CLASSES_ROOT\.gif», который отвечает за файлы типа gif. При выборе указанного раздела в качестве значения параметра по умолчанию, как уже говорилось выше, можно обнаружить идентификатор — «giffile». К этому разделу и следует перейти для изменения и добавления различных параметров.

Выбрав раздел «HKEY_CLASSES_ROOT\giffile», вы сразу обратите внимание на значение этого раздела по умолчанию: оно представляет собой описание выбранного вами типа файлов — «GIF Image». Это означает, что данный идентификатор отвечает за изображения типа GIF. Также в корневом разделе идентификаторов присутствуют дополнительные параметры. Рассмотрим некоторые из них.

  • EditFlags. Представляет собой двоичное значение длиной в 4 байт, которое может применяться для того, чтобы пользователи не могли при помощи контекстного меню задействовать определенные команды для выбранных ассоциаций файлов. В некоторых случаях этот параметр реестра может быть как типа REG_DWORD, так и REG_BINARY. Также стоит обратить внимание на то, что данный параметр может присутствовать и в подразделах shell, предопределяя наложенные ограничения корневого параметра.
  • FriendlyTypeName. В этот параметр реестра записывается отображаемое имя для идентификатора. Таким образом, значение данного параметра должно содержать те же данные, что и запись по умолчанию. Эта запись может представляться типом REG_SZ или REG_EXPAND_SZ, но она обязательно должна быть отформатирована как косвенная строка (это полное имя файла и значение ресурса, которым предшествует символ @), например @%SystemRoot%\System32\shell32.dll,-30595, как в данном случае.

Поскольку GIF является зарегистрированным типом файлов, в основном разделе идентификатора вы можете найти раздел «DefaultIcon», в котором существует параметр @, отвечающий за расположение ярлыка, который будет сопоставляться выбранному типу файла, в данном случае GIF. Как правило, за системные значки файлов отвечает библиотека imageres.dll и данный случай — не исключение.

Следующий раздел, Shell, имеет, пожалуй, основное значение для нас. А считается он важнейшим из разделов этой категории по той причине, что операционная система именно отсюда вытягивает сведения о том, какие действия должны выполняться при двойном щелчке на выбранном файле данного типа или же других возможных операциях. Как правило, этот раздел включает в себя несколько глаголов. К стандартным глаголам можно отнести такие глаголы, как edit, open и print, что в графическом интерфейсе пользователя эквивалентно командам контекстного меню «Изменить», «Открыть» и «Печать». Каждый такой глагол должен включать подраздел command, в котором в параметре по умолчанию необходимо добавить команду, запускаемую из командной строки и определяющую выполняемое действие.

Более того, наряду с приложением, указанным в кавычках, необходимо использовать такой параметр, как «%1», например, как показано на экране 1; при работе с файлами gif на данном компьютере должен открыться Microsoft Internet Explorer. Что же означает эта единица? При запуске браузера Internet Explorer параметр %1 будет заменяться именем выбранного файла. Иными словами, когда пользователь попробует открыть файл funnygif.gif, который находится на диске D, операционная система запустит программу C:\Program Files\Internet Explorer\iexplore.exe с файлом D:\funnygif.gif.

 

Значение команды «Открыть» для GIF-файлов
Экран 1. Значение команды «Открыть» для GIF-файлов

 

Если внимательно посмотреть на различные разделы для типов файлов, можно обнаружить, что помимо Shell, можно еще встретить такой раздел, как Shellex. А в чем разница между разделами Shell и Shellex? Здесь все просто. В случае с Shell вы можете применять статические глаголы, которые будут использоваться методом ShellExecute, а также контекстными меню для различных типов файлов. Как вы уже заметили, они достаточно просты в реализации, так как представляют собой, по сути, лишь определенную команду, выполняемую в командной строке. Однако в случае необходимости глаголы могут быть расширены дополнительными COM-объектами.

В свою очередь, раздел Shellex предназначен для управления расширениями shell, к которым как раз и относятся различные COM-объекты. Например, перейдя к разделу Drive, вы можете в разделе shellex найти такие подразделы как ContextMenuHandlers, Drag­DropHandlers, Folder­Extensions и PropertySheetHandlers, которые, собственно, и считаются расширениями для обычного раздела Shell.

Теперь перейдем непосредственно к созданию нового элемента контекстного меню. На примере я покажу, как можно добавить в контекстное меню папки пункт «Открыть Windows PowerShell здесь». Для того чтобы этот элемент был доступен при щелчке правой кнопкой мыши как по папке, так и по свободной фоновой области внутри папки, параметры реестра будут изменяться внутри уже существующих разделов Directory и Directory\Background. Обратите внимание, что в случае с изменением параметров внутри разделов Directory и Background вам необходимо сменить для этих разделов владельца и предоставить группе администраторов полные права на изменение содержимого внутри разделов PowerShell.

Это простой пример, поскольку контекстное меню папок уже обладает данным параметром, однако его можно вызвать только при помощи расширенного контекстного меню (в комбинации с нажатой клавишей Shift). За пункты из расширенного контекстного меню отвечает параметр «Extended», поэтому для решения данной задачи нам достаточно удалить текущий параметр из соответствующих разделов реестра, а все остальные параметры можно оставить без изменений. Содержимое файла reg будет выглядеть так, как показано в листинге 1.

Как мы видим на экране 2, теперь в контекстном меню появился соответствующий элемент.

 

Новый элемент контекстного меню
Экран 2. Новый элемент контекстного меню

 

Возьмем другой пример, предполагающий добавление новых разделов и параметров реестра — добавление пункта «Скрыть выделенные» в контекстное меню выбранного файла. При помощи этой функции можно скрыть все выбранные файлы одним лишь нажатием клавиши мыши из контекстного меню выделенных объектов. В данном случае нам понадобится вносить изменения в раздел AllFilesystemObjects, так как действия должны выполняться при выборе любого объекта проводника Windows. Кроме того, поскольку операция, можно сказать, штатная, для реализации этой задачи будет использоваться системная функция ShellExecute. Сразу обращаю ваше внимание на то, что ввиду применения функции ShellExecute, в данном разделе не создается подраздел Command.

Должны быть выполнены следующие операции:

  1. Внутри раздела HKEY_CLASSES_ROOT\AllFilesystemObjects\shell создается дочерний раздел Windows.HideSelected.
  2. Добавляется строковый параметр «Description» со значением «@shell32.dll,-37575»;
  3. Добавляется строковый параметр «ExplorerCommandHandler» со значением «{0947c622-f98a-48a5-9df7-60e5fe202e07}».
  4. Добавляется строковый параметр «Icon» со значением «imageres.dll,-5314».
  5. Добавляется строковый параметр «MUIVerb» со значением «@shell32.dll,-37574».

Получаемый reg-файл будет выглядеть так, как показано в листинге 2.

На экране 3 видно, что нам дали выполненные изменения в реестре.

 

Элемент «Скрыть выбранные элементы» в контекстном меню при выборе файла
Экран 3. Элемент «Скрыть выбранные элементы» в контекстном меню при выборе файла

 

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

Добавляем элементы в контекстное меню средствами GPO

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

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

  1. Для начала откроем оснастку «Управление групповой политикой». В ней нужно создать новый или выбрать существующий объект групповой политики. Так как большинство изменяемых параметров реестра входит в раздел из «HKEY_CLASSES_ROOT», данный объект следует связать с подразделением, к которому относятся целевые компьютеры. Затем следует открыть для данного объекта редактор управления GPME. Так, в нашем примере создается объект GPO «Контекстные меню» и он привязывается ко всему домену. Открываем для этого объекта редактор политик.
  2. Поскольку для подраздела PowerShell из раздела реестра Directory необходимо сменить владельцев, для начала следует предоставить пользователям разрешения на изменение параметров в разделах реестра. Для этого переходим к разделу «Конфигурация компьютера»\«Политики»\«Конфигурация» Windows\«Параметры безопасности»\«Реестр». В области действий вызываем контекстное меню и выбираем пункт добавления раздела. В открывшемся диалоговом окне следует перейти к разделу реестра CLASSES_ROOT\Directory\shell\Powershell. Далее в диалоговом окне дополнительных параметров безопасности в разделе изменений владельца выбирается группа безопасности, для которой будут предоставлены полные права (учтите, что предоставлять такие права для группы пользователей в большинстве случаев рискованно и распределять права следует с осторожностью). Включите флажок наследования. Кроме того, добавьте для выбранной группы разрешения, включающие полный доступ к разделу. В открывшемся диалоговом окне добавления проекта оставляем переключатель на режиме распространения наследуемых разрешений на все подразделы и вносим изменения. В случае добавления идентичных пунктов для свободного пространства «Проводника Windows» предоставьте соответствующие разрешения еще и для раздела Directory\Background.
  3. Теперь при помощи предпочтений групповой политики из раздела HKEY_CLASSES_ROOT\Directory\shell\Powershell будет удаляться параметр «Extended». Для этого следует развернуть узел «Конфигурация компьютера», а затем перейти к узлу «Настройка»\«Конфигурация Windows». Щелкните в области сведений правой кнопкой мыши и из контекстного меню последовательно выберите команды «Создать» и «Элемент реестра». Поскольку у нас будет удаляться параметр реестра, выберите из раскрывающегося списка «Действие» пункт «Удалить». В раскрывающемся списке «Куст» (Hive) выберите ветвь реестра «HKEY_CLASSES_ROOT». После этого при помощи браузера элементов реестра укажите параметр «Extended». Элемент предпочтения реестра готов. Можно сохранять изменения. Диалоговое окно элемента предпочтений групповой политики показано на экране 4.
  4. Теперь осталось создать раздел реестра с соответствующими параметрами для добавления в контекстное меню второго пункта. В принципе, так как требуется добавить четыре параметра, все эти действия можно выполнить при помощи элементов предпочтения реестра, но если операция предполагает добавление большого количества параметров, то можно воспользоваться возможностями сценариев автозагрузки. Для этого перейдите в раздел «Конфигурация компьютера»\«Политики»\«Конфигурация» Windows\«Сценарии (запуск/завершение)» и откройте диалоговое окно свойств параметра политики «Автозагрузка». В диалоговом окне «Свойства: Автозагрузка» нажмите на кнопку «Добавить» и при помощи кнопки обзора поместите требуемый Reg-файл (например, файл AddHideItem.reg) в папку сценариев автозагрузки. После этого укажите в поле «Имя сценария» значение «regedit.exe», а в текстовом поле «Параметры сценария» значение «/s и имя файла», как показано на экране 5.
  5. После этого можно обновлять параметры политики на целевых компьютерах и проверять выполненные действия.

 

Создание элемента предпочтения реестра
Экран 4. Создание элемента предпочтения реестра

 

 

Добавление сценария автозагрузки
Экран 5. Добавление сценария автозагрузки

 

Теперь вы знаете, из каких компонентов состоят контекстные меню операционных систем Windows и как можно добавить в различные контекстные меню свои уникальные пункты. Мы рассмотрели основные подразделы реестра, отвечающие за пункты контекстных меню. На нескольких примерах были продемонстрированы методы добавления новых пунктов в контекстное меню как вручную, так и централизованно, при помощи групповой политики. Я надеюсь, что благодаря данной статье вы сможете с легкостью настроить контекстные меню своих рабочих систем под конкретные потребности.

Листинг 1. Пример содержимого реестра 
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\shell\Powershell]
@="@shell32.dll,-8508"
"Extended"=-
"NoWorkingDirectory"=""
"ShowBasedOnVelocityId"=dword:00639bc8
[HKEY_CLASSES_ROOT\Directory\shell\Powershell\command]
@="powershell.exe -noexit -command Set-Location -literalPath ‘%V’"
[HKEY_CLASSES_ROOT\Directory\Background\shell\Powershell]
@="@shell32.dll,-8508"
"Extended"=-
"NoWorkingDirectory"=""
"ShowBasedOnVelocityId"=dword:00639bc8
[HKEY_CLASSES_ROOT\Directory\Background\shell\Powershell\command]
@="powershell.exe -noexit -command Set-Location -literalPath ‘%V’"
Листинг 2. Параметры реестра для добавления пункта "Скрыть выделенные" в контекстное меню 
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\Windows.HideSelected]
"Description"="@shell32.dll,-37575"
"ExplorerCommandHandler"="{0947 c622-f98 a-48 a5-9 df7-60 e5 fe202 e07}"
"Icon"="imageres.dll, —5314"
"MUIVerb"="@shell32.dll, —37574"