Выполнение команд

Выполнение команд

Существует еще одна интересная возможность, которую можно использовать при разработке файлов сценариев, — выполнение команд, записанных в ветви реестра. Для этого применяются функции библиотеки ADVPACK.dll. Например, после выполнения команды rundll32.exe ADVPACK.dll, UserInstStubWrapper «подраздел» система выполнит строку, содержащуюся в параметре строкового типа RealStubPath, расположенном в ветви реестра HKEY_LOCAL_MACHINE SOFTWAREMicrosoftActive SetupInstalled Components«подраздел» (по умолчанию параметр отсутствует). Одновременно плюсом и минусом данной команды является то, что программа, которую вы запустите после обработки содержимого параметра RealStubPath, будет запущена как процесс, то есть ей будет отказано во взаимодействии с Рабочим столом и она не сможет отобразить свое окно. Минус этого ясен, а плюс можно определить на примере. Если указать в параметре RealStubPath ветви системного реестра HKEY_LOCAL_MACHINESOFTWAREMicrosoftActive SetupInstalled Componentspara следующую команду: rundll32.exe amovie.ocx, RunDll /play /close e:musicB-2волки.wma, которая уже была описана в гл. 1, то после вызова команды rundll32.exe ADVPACK.dll, UserInstStubWrapper para будет воспроизведен данный музыкальный файл. При этом проигрывание данного файла можно будет прекратить только выгрузкой из памяти процесса rundll32.exe, который породил это воспроизведение, ведь никакого окна индикации открытого файла отображено не будет.

Можно также воспользоваться разновидностью приведенной выше команды — rundll32.exe ADVPACK.dll, UserUnInstStubWrapper «подкаталог». После ее вызова будет выполнена строка параметра RealStubPath, расположенного в ветви реестра HKEY_LOCAL_MACHINESOFTWAREMicrosoftActive SetupInstalled Components«подкаталог».Restore. Например, выполнение команды rundll32.exe ADVPACK.dll, UserUnInstStubWrapper para будет использовать параметр из ветви реестра HKEY_LOCAL_MACHINESOFTWARE MicrosoftActive SetupInstalled Componentspara.Restore.

Кроме функций библиотеки ADVPACK.dll, существует еще одна возможность запуска команд из реестра — использование ветви реестра HKEY_CURRENT_USER SoftwareMicrosoftWindowsCurrentVersionRunOnceEx (данная ветвь присутствует и в корневом разделе HKEY_LOCAL_MACHINE). По умолчанию ее содержимое выполняется только при следующем входе пользователя в систему, хотя существует возможность сказать системе, чтобы она обработала содержимое этой ветви немедленно. При этом все команды из ветви после своего выполнения автоматически удаляются. Следует также учитывать одну особенность ветви — если в ней будет определено несколько запусков программ, то все они будут запускаться последовательно. Сначала запустится первая программа, после того, как пользователь ее закроет, запустится вторая программа и т.д.

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

Чтобы лучше понять формат данной ветви реестра, рассмотрим один пример. Ниже в листинге приведен пример записей ветви реестра HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunOnceEx, экспортированных в REG-файл.

 Листинг 2.1. Пример содержимого раздела реестра RunOnceEx

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunOnceEx1]

@="Запуск cmd.exe и calc.exe"

"cmd"="cmd.exe"

"calc"="calc.exe"

[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunOnceEx2]

@="Запуск блокнотика"

"notepad.exe"="notepad.exe"

Допустим, содержимое приведенного листинга находится в реестре. Теперь нужно ввести команду rundll32.exe IERNONCE.dll, RunOnceExProcess. Она указывает системе, что та должна обработать содержимое ветви системного реестра HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunOnceEx. Результат обработки данной ветви можно увидеть на рис. 2.5. 

Рис. 2.5. Способ работы запуска команд из ветви реестра HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunOnceEx

Как видно на рисунке, при запуске команды rundll32.exe появляется диалог индикации, в котором указано, какой шаг установки сейчас выполняется. При этом был запущен Калькулятор, так как при сортировке между названиями параметров в разделе 1 Калькулятор, судя по названию параметра, запускается первым. После того как вы закроете окно Калькулятора, будет открыто окно командного процессора. При этом индикатор будет все еще указывать на первый шаг, ведь еще не началась обработка содержимого следующего раздела ветви (раздела 2). После того как вы закроете окно командного процессора, будет запущен Блокнот, и при этом индикатор начнет указывать на второй шаг операции установки.

Если вы не укажете значений параметров по умолчанию ни в одном из разделов данной ветви реестра, то индикатор установки отображаться не будет. Тем не менее сами команды будут выполняться.