модифікація дистрибутивів
на основі Windows Installer
Можливість модифікації дистрибутивів на основі Windows Installer завжди приваблювала системних адміністраторів і фахівців системної підтримки. Розглянемо один з компонентів Windows Installer Resource Kit - orca.exe. Ця утиліта спеціально розроблена для вирішення завдань такого роду.
Рішення задач автоматичної установки програмного забезпечення не обмежується використанням ключів системи інсталяції Windows Installer. Отримавши можливість змінити пакет інсталяції, доступ до бази даних всіх параметрів дистрибутива, адміністратор може створювати пакети для автоматичної установки, не використовуючи зовнішні файли, що містять різні настройки.
Приділимо увагу програмному управлінню базою даних, що зберігається в msi-файлах.
Це сервіс установки і конфігурації програмних продуктів, який входить до складу операційної системи. Також він може встановлюватися як пакет поновлення або окремий дистрибутив.
Windows Installer, як і будь-яка інша швидке виправлення, підтримує ряд ключів командного рядка, які забезпечують управління автоматичною установкою пакета:
- / Norestart - НЕ перезавантажувати комп'ютер після установки оновлення;
- / Queit - виконати установку в «тихому» режимі;
- / Help - висновок довідки на екран, що містить ключі і їх короткий опис.
Подвійним клацанням миші по файлу з розширенням * .msi здійснюється запуск утиліти:
% SystemRoot% System32msiexec.exe / i * .msi
У таблиці 1 наведено список часто використовуваних параметрів командного рядка, що забезпечують автоматичну установку додатка.
Таблиця 1. Параметри командного рядка msiexec.exe
Доступ до msi-файлів програмним способом
Для забезпечення програмного управління базою даних, що зберігається в msi-файлі, використовується шаблон, наведений у лістингу 1. Необхідно відзначити, що шаблон читання даних відрізняється від шаблону корекції даних. Про нього буде розказано окремо.
Лістинг 1. Шаблон доступу до бази в msi-файлі
Set obj = CreateObject ( "WindowsInstaller.Installer")
Set base = obj.OpenDatabase (MSI, Mode)
У наведеному шаблоні в першому рядку здійснюється підключення до COM-об'єкту, за допомогою якого здійснюється доступ до бази даних.
На наступному рядку здійснюється підключення до бази даних за допомогою методу OpenDatabase, який має два аргументи. Перший з них - ім'я бази, яким є повний шлях до msi-файлу. Другий - режим доступу до бази даних:
На третій - реалізовано виконання задається запиту. SQL-запит задається за допомогою методу OpenView, а виконання запиту - за допомогою методу Execute.
Нагадаємо, що в SQL-запиті регістр назви полів і імен таблиць має значення.
В останньому рядку здійснюється запис зроблених змін в базі за допомогою команди Commit.
Робота з таблицями в orca.exe
З полями таблиць баз можна здійснювати наступні дії:
- читання існуючих полів;
- створювати нові поля;
- видаляти поля;
- змінювати поля.
Читання існуючих полів
Для реалізації шаблону пошуку використовується шаблон (див. Лістинг 2), відмінний від наведеного в лістингу 1. Це пояснюється тим, що запис, видалення, заміна здійснюються у одиничного поля, а висновок на екран здійснюється для всіх полів.
Трансформація лістингу здійснюється в третьому рядку лістингу 1. Вона розбивається на дві підрядка - це рядки 3 і 4 в лістингу 2. Тут розносяться методи OpenView і Execute.
Далі здійснюється читання масиву рядків. Зверніть увагу на те, що в запиті SELECT поля можуть бути перераховані тільки по іменах. Значення «*» в даному випадку не працює. А під час читання даних необхідно вказувати нумерацію полів (Record.StringData (1)), починаючи з одиниці (1).
У лістингу 2 наведено приклад читання всіх полів (Property, Value) таблиці Property файлу ACDSee 10 Photo Manager.msi:
Лістинг 2. Читання полів у зазначеній таблиці
Set obj = CreateObject ( "WindowsInstaller.Installer")
Set ob = obj.OpenDatabase ( "C: ACDSeeACDSee 10 Photo Manager.msi", 0)
set View = ob.OpenView ( "SELECT Property, Value FROM Property")
Set Record = View.Fetch
If Record Is Nothing Then Exit Do
Wscript.Echo Record.StringData (1) + vbTab + vbTab + Record.StringData (2)
Set View = Nothing
Створення нових полів
Створення нових полів використовується досить часто, наприклад, для того щоб записати в дистрибутив програми її серійний номер. Для цього необхідно додати в таблицю Property поле PIDKEY з відповідним значенням, що містить серійним номер продукту. Щоб додати нове поле, необхідно встановити курсор на потрібну таблицю (див. Рис. 3) і, натиснувши в довільній її частини праву кнопку миші, вибрати пункт Add Row або натиснути комбінацію клавіш. У діалоговому вікні буде наведено список доступних полів. Необхідні значення можна привласнити в цьому ж вікні.
Малюнок 3. Зміна параметра
Аналогічну операцію можна виконати програмним способом (див. Лістинг 3). Для цього необхідно викликати об'єкт WindowsInstaller.Installer. На основі шаблону, наведеного в лістингу 1, сформуємо лістинг 3. В якості другого параметра методу OpenDatabase необхідно вказати 1, оскільки виконується операція запису даних.
Найскладнішим в даному лістингу правильно сформувати запит. Особливість запиту INSERT INFO полягає в тому, що в перших за рахунком дужках, в яких вказується назва полів, ім'я поля має бути задано з батьком. Всі імена параметрів в запиті вказуються без лапок; все що привласнюються значення - в лапках і, нарешті, назви полів і таблиць чутливі до регістру.
Лістинг 3. Створення нового атрибута в таблиці
Set a = CreateObject ( "WindowsInstaller.Installer")
Set b = a.OpenDatabase ( "C: acdseeACDSee 10 Photo Manager.msi", 1)
b.OpenView ( "INSERT INTO Property.
(Property.Property, Property.Value) VALUES ( "PIDKEY", "1234567890") "). Execute
Видалення існуючих полів з таблиці
Видалення будь-якого поля здійснюється у відповідності з наступним алгоритмом:
- встановити курсор на таблицю, в якій необхідно видалити параметр;
- встановити курсор на видаляється параметр в таблиці;
- натиснути кнопку на клавіатурі або праву кнопку миші, а в контекстному меню - DELETE;
- підтвердити намір видалити параметр.
Цю ж задачу можна вирішити програмним способом (див. Лістинг 4), використовуючи шаблон 1. Для забезпечення можливості запису в таблиці необхідно встановити другий параметр методу OpenDatabase рівним одиниці (1).
Лістинг 4. Видалення існуючого атрибуту в таблиці
Set a = CreateObject ( "WindowsInstaller.Installer")
Set b = a.OpenDatabase ( "C: acdseeACDSee 10 Photo Manager.msi", 1)
b.OpenView ( "DELETE FROM Property WHERE" PIDKEY "=" 1234567890 ")"). Execute
Зміна значень існуючих полів
Зміна значення здійснюється шляхом установки курсору в необхідну осередок подвійним клацанням лівої кнопки миші (див. Рис. 3).
Програмне зміна властивості здійснюється за тими самими правилами. У порівнянні з попередніми двома випадками, змінюється тільки запит.
У лістингу 5 здійснюється відключення компонента Device Detector.
Лістинг 5. Зміна значень існуючих полів таблиці
Set a = CreateObject ( "WindowsInstaller.Installer")
Set b = a.OpenDatabase ( "C: acdseeACDSee 10 Photo Manager.msi", 1)
b.OpenView ( "UPDATE Feature SET Level =" 0 "WHERE Feature =" DevDetect ""). Execute
Уважно вивчивши запропонований варіант, читач легко зможе або за допомогою сценарію на VBScript, або за допомогою програми orca.exe значно полегшити собі завдання масової установки програмного забезпечення, що дозволить заощадити масу часу і сил.