В операционной системе Windows
Vista представлено множество средств решения вопросов безопасности,
и управление учетными записями пользователей (UAC) — одно из самых
значительных. При использовании UAC даже пользователи с правами
администратора выполняют большинство приложений с правами обычного
пользователя, но обладают “потенциалом повышения прав” для
выполнения определенных административных задач и
функций
приложений. После использования Windows Vista™ в течение нескольких
месяцев повышение прав (при необходимости) задач или приложений
становится привычкой. Однако когда я попытался повысить права
некоторых типов задач в Windows Vista, я столкнулся с множеством
проблем. Эти неудачи меня очень разочаровали.
Поэтому я, в духе старых
средств Windows® PowerToy, создал
несколько новых инструментов PowerToy для запуска сценариев с
повышенными правами. Найти все средства, о которых я собираюсь
рассказать, можно в материалах для загрузки по адресу technetmagazine
.com/code07.aspx. А почитать о том, как работает UAC, можно в
статье “Мечта о работе с правами обычного пользователя достигается с
помощью UAC”, написанной в ноябре 2006 г. Алексом Хитоном (Alex
Heaton) (см. колонку “Дополнительные материалы”).
Средство Elevate Command
PowerToy
Первым неудобством было
отсутствие способа повысить права приложения из командной строки или
из диалогового окна “Запуск программы”. Поспрашивав людей в
Майкрософт, я нашел сценарий, написанный Джоном Стивенсом (John
Stephens), инженером по разработке программного обеспечения
корпорации Майкрософт. В сценарии я обнаружил то, что мне было
нужно. Оказывается, если передать команду “runas” API-функции
ShellExecute или ее COM-эквиваленту, методу ShellExecute объекта
Shell.Application, запущенное приложение выведет запрос на повышение
прав (подробнее см. в боковой панели). Это позволило мне создать
первое средство PowerToy для повышения прав — Elevate Command
PowerToy.
Это средство (состоящее из
файлов ElevateCommand.inf, elevate.cmd и elevate.vbs) добавляет в
систему команду elevate. Это позволяет из командной строки, сценария
или диалогового окна “Запуск программы” запускать приложения с
запросом на повышение прав. Например, следующая команда открывает
файл Win.ini в Блокноте (после вывода запроса на повышение
прав):
elevate notepad c:\Windows\Win.ini
При использовании команды
elevate с сервером сценариев Windows (WSH), оболочкой Windows
PowerShell™ или другими сценариями необходимо в качестве
запускаемого приложения указать исполняемый файл сервера сценариев
(например wscript, cscript или powershell). Так, для запуска
VBS-файла нужно использовать такой код:
elevate wscript “C:\windows\system32\
slmgr.vbs” –dli
Объяснение можно найти в
тексте справки. Для его просмотра используйте команду elevate с
параметром -? или без параметров вообще.
Запуск сценариев от имени администратора
Следующим неудобством было
отсутствие для большинства типов сценариев Windows пункта
контекстного меню “Запустить от имени администратора” (при щелчке
файла правой кнопкой мыши в проводнике). Единственным исключением
были сценарии командной оболочки (расширения BAT и CMD). Я приступил
к исследованию этого вопроса. Управление многими пунктами
контекстного меню для различных типов файлов осуществляется с
помощью разделов “command” для каждого типа файлов в разделе реестра
HKEY_CLASSES_ROOT (подробнее см. в колонке “Команды и сопоставление
файлов”). Оказывается, что если раздел команды имеет имя “runas”, то
вызванная команда выведет запрос на повышение прав. Это позволило
мне создать следующие средства PowerToy:
- PowerToy для повышения прав приложений HTML (ElevateHTA.inf);
- PowerToy для повышения прав сценариев Windows PowerShell
(ElevatePowerShellScript.inf);
- PowerToy для повышения прав WSH-сценариев
(ElevateWSHScript.inf, elevate.cmd, elevate.vbs).
Данные средства добавляют в
контекстное меню пункт “Run As Administrator” (запуск от имени
администратора, рис.1) для типов файлов
HTA, Windows PowerShell и сервера сценариев Windows соответственно.
Файл ElevateWSHScript.inf также добавляет пункт “Run as
Administrator with Command Prompt” (запуск от имени администратора в
командной строке). (Перед выполнением установки прочитайте
примечание в ElevatePowerShellScript.inf.)
Рис.
1 Пункты контекстного меню
“Запустить от имени администратора”
Повышение прав других типов файлов
Механизм использования
команды runas можно применять практически к любому типу файла.
Например, установщик Windows в Windows Vista “знает, что делать”,
если для установки пакета потребуется повышение прав. Однако
некоторые плохо построенные пакеты (в которых, например,
пользовательские действия не обозначены должным образом) не будут
правильно устанавливаться с включенным UAC, если только для
установки файл msiexec.exe не будет запущен из командной строки с
повышенными правами.
Чтобы было можно осуществлять
такой запуск прямо из проводника, я создал средство ElevateMSI.inf.
Оно копирует действия по умолчанию для пакетов (MSI) и исправлений
(MSP) установщика Windows, добавляя пункт контекстного меню “Install
as Administrator” (установить от имени администратора) для пакетов и
“Apply Patch as Administrator” (применить исправление от имени
администратора) для исправлений.
CMD Prompt Here as Administrator и PowerShell
Prompt Here as Administrator
Одно из самых популярных
средств Windows PowerToy — достославная Command (или CMD) Prompt
Here. После ее установки можно щелкнуть правой кнопкой мыши папку
или диск в проводнике и в контекстном меню выбрать пункт “CMD Prompt
Here”. В результате запустится командная строка с выбранной папкой в
качестве текущей.
Это настолько удобно, что я
использую это средство PowerToy много раз каждый день. Пытаясь
научиться использовать Windows PowerShell, я обнаружил, что мне не
хватает этой возможности и там. Поэтому я и создал средство PowerToy
“PowerShell Prompt Here” (см. колонку “Старая игрушка опять
пригодилась”).
Но и этого мне было мало:
очень часто открывать командную строку оболочки требовалось с
повышенными правами. Это привело к созданию последних двух средств
PowerToy: CMD Prompt Here as Administrator (CmdHereAsAdmin.inf) и
PowerShell Prompt Here as Administrator (PowerShellHereAsAdmin.inf,
elevate.cmd, elevate.vbs) , показанных на рис.
2.Оба средства работают таким же образом, как их аналоги без
повышенных прав (которые для вашего удобства тоже включены в
материалы для загрузки).
Рис.
2 Командные строки с повышенными
правами
Установка и
реализация
Для установки этих средств
PowerToy щелкните правой кнопкой мыши файл INF, выберите
“Установить” и подтвердите повышение прав. Для удаления используйте
пункт панели управления “Программы и компоненты”.
Если вы будете изучать файлы
INF более подробно и заинтересуетесь, почему три средства PowerToy
устанавливают файлы elevate.cmd и elevate.vbs в разные места,
поясняю. Большинство средств PowerToy реализуются путем добавления
подраздела runas в раздел HKEY_CLASSES_ROOT\objecttype\Shell для
типа объекта в реестре.
Однако для некоторых средств
PowerToy существовали типы объектов, в которых я хотел использовать
два пункта контекстного меню, которые вызывают повышение прав (“CMD
Prompt Here as Administrator” и “PowerShell Prompt Here as
Administrator” для типов объектов Drive и Directory; “Run as
Administrator” и “Run as Administrator with Command Prompt” для всех
типов объектов WSH). Так как у каждого типа объекта может быть
только один подраздел runas, для вызова команды elevate я должен был
реализовать второе действие. Но так как я хотел, чтобы каждый файл
INF можно было устанавливать и удалять независимо, я должен был
разместить соответствующие копии elevate.cmd и elevate.vbs в разных
местах. (Увеличивать значения счетчиков использования файлов из
простого файла INF невозможно. Конечно, лучше было бы использовать
MSI-установщики, но я хотел иметь такие, которые можно создавать и
изменять с помощью текстового редактора.) Одним из побочных эффектов
является тот факт, что значок защиты будут содержать только пункты
контекстного меню, реализованные с помощью подраздела
runas.
Заключение
Я надеюсь, что эти средства
будут полезными для вас и улучшат впечатление от использования UAC.
Возможно, они вдохновят вас на создание собственных средств
PowerToy. (Те, кто использует в Windows Vista другие языки
сценариев, например Perl или Python, также легко смогут создать
PowerToy для повышения прав сценария и с помощью этих языков.) Как и
все средства PowerToy, они не поддерживаются: это средства “на свой
страх и риск”. В любом случае, не скучайте, повышая права!