Буфер обмена и PowerShell ускорят, но не ослепят.
Использовать GPP для добавления файлов реестра жутко и неудобно — все эти ветки реестра, тип ключа, значения… Особенно если веток и значений изрядно. Но есть пара лайфхаков, которые могут значительно ускорить работу с групповыми политиками.
Можно, конечно, повесить logon-скрипт с командой импорта ветки реестра. Но это же не наш метод.
Способ первый. Слегка сложный
Первым вариантом можно создать свой шаблон GPO. Такой способ особенно удобен, если нужно изменять параметры значений в зависимости от пользователя. Если не хочется изучать принципы формирования шаблонов, то можно просто экспортировать «правильный» reg-файл и конвертировать его в файл шаблона при помощи скрипта REG_2_ADMXL.vbs, опубликованного в галерее скриптов Technet.
Предположим, мы хотим облегчить жизнь пользователям, прикрутив к Internet Explorer несколько поисковых машин следующим образом:
- при вводе в адресной строке «g текст запроса» запрос искался бы в Google;
- «y текст запроса» — в Яндексе;
- а «w текст запроса» — в русской Википедии.
Для этого достаточно подготовить файл реестра:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\SearchUrl\W]
@="http://ru.wikipedia.org/wiki/Служебная:Search?search=%s"
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\SearchUrl\Y]
@="http://www.yandex.ru/yandsearch?rpt=rad&text=%s"
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\SearchUrl\G]
@="http://www.google.com/search?q=%s"
Конвертируем его в шаблон следующей командой:
cscript REG_2_ADMXL.vbs IE-search.reg Ru-ru IE-search.admx
Получившийся шаблон и папку с языковым файлом закинем в каталог с шаблонами. Теперь наша политика появится в оснастке управления GPO.
Установленный шаблон.
Механизм не очень удобен в плане обслуживания, но в принципе работает. И не надо вручную ничего вбивать.
Другим вариантом будет использование командлетов PowerShell для работы с GPO. Например, для восстановления у пользователей пункта контекстного меню «Отправить» набор командлетов будет следующий:
Import-module -Name GroupPolicy
New-GPO -Name SendTo
Set-GPRegistryValue -Name "SendTo" -key "Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" -ValueName SendTo -Type ExpandString -value "C:\Users\Default\AppData\Roaming\Microsoft\Windows\SendTo"
Set-GPLink -Name SendTo -Target "ou=Users,dc=domain,dc=com" -LinkEnabled Yes
Так выглядит вариант только для одного ключа. Если ключей много, то для удобства придется изобретать велосипед и опять же конвертировать файл реестра в набор командлетов PowerShell.
Подробнее о работе с групповыми политиками и автоматизации всего этого можно почитать в одной из предыдущих статей «Погружение в шаблоны и приручение GPO Windows». Ну, а я расскажу о моем любимом способе.
Способ второй. Копировать — Вставить (почти)
Как вы могли заметить (я так заметил очень не сразу), в оснастке управления групповыми политиками доступны действия над объектами, в том числе и стандартные операции буфера обмена.
Контекстное меню в параметрах реестра GPP.
Если скопировать объект в буфер обмена и вставить его, то окажется, что этот объект представляет собой файл в формате xml. Это значит, что файл можно предварительно сформировать и добавить в оснастку без заполнения полей вручную.
Для этого Malcolm McCaffery написал специальный скрипт. Он формирует файл xml на основе экспортированного файла реестра. Скрипт можно взять в блоге автора.
В скрипте у автора присутствуют лишние вызовы функции Convert-Reg2Xml и лишний блок параметров. Эти ошибки легко исправить при тестовом запуске через PowerShell ISE. Тем не менее я на всякий случай закинул исправленную версию на pastebin. Также существует и форк этого скрипта на github, и даже онлайн-сервис, который делает то же самое.
Использование скрипта предельно простое.
Convert-Reg2Xml -regPath input.reg -xmlPath output.xml
Получившийся xml можно даже просто перетащить в поле для параметров реестра.
Разберем конкретный пример. Для начала экспортируем «правильную» ветку реестра. В этом примере мы сделаем политику для включения отображения скрытых файлов, папок, расширений и заодно сделаем автозапуск ctfmon.exe для беспроблемной смены раскладки.
Файл реестра получился такой:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"Hidden"=dword:00000001
"HideFileExt"=dword:00000000
"ShowSuperHidden"=dword:00000001
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
"Language Bar"=""ctfmon”=”CTFMON.EXE”
Преобразуем его в xml. Если посмотреть в получившийся файл, он уже будет таким:
<?xml version="1.0" encoding="utf-8"?>
<Collection clsid="{53B533F5-224C-47e3-B01B-CA3B3F3FF4BF}" name="HKEY_CURRENT_USER">
<Collection clsid="{53B533F5-224C-47e3-B01B-CA3B3F3FF4BF}" name="Software">
<Collection clsid="{53B533F5-224C-47e3-B01B-CA3B3F3FF4BF}" name="Microsoft">
<Collection clsid="{53B533F5-224C-47e3-B01B-CA3B3F3FF4BF}" name="Windows">
<Collection clsid="{53B533F5-224C-47e3-B01B-CA3B3F3FF4BF}" name="CurrentVersion">
<Collection clsid="{53B533F5-224C-47e3-B01B-CA3B3F3FF4BF}" name="Explorer">
<Collection clsid="{53B533F5-224C-47e3-B01B-CA3B3F3FF4BF}" name="Advanced">
<Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="Hidden" descr="Imported Reg File" image="17">
<Properties action="U" hive="HKEY_CURRENT_USER" key="Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" name="Hidden" default="0" type="REG_DWORD" displayDecimal="0" value="00000001" />
</Registry>
<Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="HideFileExt" descr="Imported Reg File" image="17">
<Properties action="U" hive="HKEY_CURRENT_USER" key="Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" name="HideFileExt" default="0" type="REG_DWORD" displayDecimal="0" value="00000000" />
</Registry>
<Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="ShowSuperHidden" descr="Imported Reg File" image="17">
<Properties action="U" hive="HKEY_CURRENT_USER" key="Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" name="ShowSuperHidden" default="0" type="REG_DWORD" displayDecimal="0" value="00000001" />
</Registry>
</Collection>
</Collection>
<Collection clsid="{53B533F5-224C-47e3-B01B-CA3B3F3FF4BF}" name="Run">
<Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="Language Bar" descr="Imported Reg File" image="7">
<Properties action="U" hive="HKEY_CURRENT_USER" key="Software\Microsoft\Windows\CurrentVersion\Run" name="Language Bar" default="0" type="REG_SZ" displayDecimal="0" value=""ctfmon”=”CTFMON.EXE”" />
</Registry>
</Collection>
</Collection>
</Collection>
</Collection>
</Collection>
</Collection>
Теперь можно просто вставить его в поле настройки параметров реестра. Получится такая красота:
Настроенная политика.
При должной сноровке процесс занимает меньше времени, чем чтение этого текста.
Для повышенного удобства можно добавить пункт для файлов реестра в контекстном меню, чтобы конвертировать файлы вообще в два клика.
Достаточно будет создать новый тип действия для объектов типа regfile и прописать путь к нужному скрипту. Для вашего удобства я скомпоновал это, конечно же, в файл реестра:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\regfile\shell\convert2xml]
@="convert2xml"
[HKEY_CURRENT_USER\Software\Classes\regfile\shell\convert2xml\command]
@="powershell.exe -File C:\\temp\\script.ps1 %1"
Путь к скрипту задается в последней строке.
Чтобы скрипт отрабатывал такое, необходимо добавить в него следующие строки:
$output=(Split-Path -Path $args[0]) + "\output.xml"
Convert-Reg2Xml -regPath $args[0] -xmlPath $output
Теперь при вызове контекстного меню отобразится еще один пункт, при нажатии на который рядом с файлом реестра появится нужный нам файл xml.
Новый пункт контекстного меню.
Конечно, для внесения простых изменений в реестр пользователей и компьютеров такие механизмы — лишнее. А вот для настройки большого количества параметров эти лайфхаки весьма удобны.