вторник, 30 декабря 2014 г.

PsExec + ключи тихой установки = тихая установка программ в локальной сети

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

  • Active Directory (GPSI)
  • Сторонние программы (WPKG)
  • Внутренние механизмы обновления программ
  • Использование PsExec и «тихой установки».

Active Directory (GPSI)

Использование GPSI – наверное самый популярный вариант, но он не лишен недостатков. Возможно, самый весомый – возможность установки только msi-пакетов. Существует много способов преобразовать .exe-установщик в msi-пакет (например, Orca), но все они нетривиальны.

WPKG

Из сторонних программ интересен проект WPKG. WPKG использует клиент-серверную архитектуру (у пользователя устанавливается клиентская часть) и позволяет автоматически обновлять программы у пользователя в соответствии с заранее заданным списком. Можно, например, задать обновление определенной программы только для конкретного отдела в организации, что очень удобно в том случае, если программой пользуется только один отдел.
Больше информации здесь
Недостаток данной программы — довольно запутанная настройка инсталляционных пакетов. Кроме того, WPKG устанавливает новые версии программы не сразу после обновления дистрибутива, а через некоторое время (впрочем, это время можно настраивать).

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


PsExec + тихая установка

В качестве компромиссного решения предлагаю использовать связку PsExec + ключи тихой установки.
PsExec – это бесплатная консольная утилита  от Sysinternals (подразделение Microsoft) позволяющая запускать программы на удаленных компьютерах. PsExec позволяет перенаправить вывод консольных команд с удаленной системы на локальную, то есть можно видеть на своей машине результат выполнения консольной команды на удаленной системе.
Скачать утилиту можно здесь (в составе пакета PsTools).

Тихая установка — это опция инсталлятора, позволяющая производить установку программы без участия пользователя и без вывода информации на экран.
Плюсы и минусы данного подхода будут в конце описания.

Установка PsExec, запуск программ через PsExec на удаленных системах
PsExec нужно устанавливать только на «серверную» сторону, то есть на компьютер, с которого будут рассылаться команды на установку (компьютер администратора, например).
Установка PsExec заключается в распаковке архива PsTools в удобную папку. После этого можно добавить эту папку в переменную окружения PATH, для того, чтобы вызывать PsExec из командной строки не по полному пути, а только по имени файла.

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

То есть если нужно запустить на удаленной системе программу, которая не использует сетевые ресурсы, можно использовать учетные данные любого пользователя, для которого возможен доступ к общему ресурсу Admin$ на этой системе.
Если же нужно, чтобы программа на удаленной системе взаимодействовала с сетевыми ресурсами, нужно указывать пользователя, явно созданного на данной удаленной системе.
Для того, чтобы иметь возможность запускать PsExec на нескольких системах пакетно, нужно создать на этих системах локального пользователя с правами администратора, причем так, чтобы имя пользователя и пароль на каждой системе были одинаковыми.

Схема автоматической тихой установки с использованием PsExec и ключей тихой установки включает в себя следующие компоненты:
1. Дистрибутив (установочный файл) необходимой программы. Для примера назовем установочный файл program_install.exe.
2. Скрипт, создающий подключение к сетевому диску, запускающий удаление предыдущей версии программы и установку новой. Далее — скрипт установки, program.unattended.bat.
3.  Скрипт, запускающий скрипт установки на списке удаленных систем (через PsExec), с указанием имени пользователя и пароля на удаленной системе. Далее — скрипт PsExec, program.psexec.bat
4. Файл, содержащий список имен удаленных систем, на которых нужно выполнить скрипт PsExec. Далее — список имён, list.txt

Работа системы выглядит следующим образом:
1. Администратор запускает скрипт PsExec (program.psexec.bat).
2. Скрипт PsExec читает список имён list.txt, и для каждой системы из списка открывает в отдельной консоли экземпляр PsExec c последующим запуском на удаленной системе скрипта установки program.unattended.bat.
3. На удаленной машине скрипт установки создает  сетевой диск, ссылающийся на ресурс, на котором располагается дистрибутив  program_install.exe и производит тихое удаление и тихую установку новой версии программы.

Создание скрипта тихой установки
Создание скрипта тихой установки для конкретной программы — самая долгая и сложная часть работы. В качестве примера разберу скрипт тихой установки конкретной программы:

net use Q: /DELETE
net use Q: "\\SoftShare\Soft\program\"
taskkill /F /T /IM  program.exe
"C:\Program Files\RMO\unins000.exe" /SILENT
RMDIR /S/Q "C:\Program Files\program"
"Q:\new\program_install.exe" /VERYSILENT /NORESTART /TASKS="desktopicon"
xcopy "Q:\new\workspace" "C:\Program files\program\workspace" /E /H /I
xcopy "C:\Documents and Settings\InstallUser\Рабочий стол\program.lnk" "C:\Documents and Settings\All users\Рабочий стол" /Y
net use Q: /DELETE

Для создания подключения к сетевому ресурсу используется диск Q:. Естественно, можно выбрать любую другую букву диска. Стоит сказать, что поскольку все действия в скрипте выполняются  для специально созданного локального пользователя (назовем его InstallUser), данный диск не будет виден человеку, который работает на данной удаленной системе.

В первой строке диск Q: удаляется из списка сетевых дисков пользователя InstallUser . Вообще-то делать это необязательно, по большей части это перестраховка от того случая, если вдруг у пользователя   InstallUser окажется есть диск с таким именем.
Во второй строке происходит подключение ресурса \\SoftShare\Soft\Program (папка с программой, которая будет устанавливаться) в качестве диска Q:
Третья строка нужна для завершения экземпляра программы, которая будет устанавливаться.  Ключ /F означает принудительное завершение процесса, /T – завершение также дочерних процессов, /IM program.exe – определяет, что завершить надо процесс с именем program.exe. Для других программ имя процесса будет, естественно, отличаться.
4-я строка вызывает тихое удаление существующей версии программы. Ключ /SILENT означает как раз тихое удаление. Подробнее о ключах тихого удаления и установки — чуть позже.
5-я строка удаляет папку, в которой находилась программа, а также все её подкаталоги (ключ /S), без запроса подтверждения на удаление (/Q)
6-я строка наконец-то устанавливает нужную программу.  Подробнее о ключах тихой установки и удаления будет ниже. Ключ /VERYSILENT в данном случае вызывает установку без вывода какой-либо информации на экран, в каталог по умолчанию. Ключ /NORESTART подавляет перезагрузку компьютера после установки. Ключ /TASKS="desktopicon" дает указание на то, что необходимо создать ярлык программы на рабочем столе.
7-я строка в данном случае была нужна для того, чтобы скопировать определенные конфигурационные файлы, используемые в программе для того, чтобы после переустановки программы не сбивались определенные настройки. В конкретном случае копирование конфигурационных файлов может понадобиться, а в каких-то случаях можно обойтись и без этого.
8-я строка нужна копирует ярлык программы из рабочего стола InstallUser в рабочий стол всех пользователей. В данном случае это действие нужно из-за того, что по умолчанию программа устанавливается для того пользователя, который вызывает установку (в данном случае это InstallUser), соответственно ярлык создается только для этого пользователя.
В 9-й строке подключение к диску Q: удаляется из списка подключений InstallUser.

Несмотря на объемное описание, процедура установки довольно проста, и в упрощенном виде может быть представлена следующим образом:
1. Создать подключение к папке с дистрибутивом
2. Удалить предыдущую версию программы
3. Установить новую версию программы
4. При необходимости произвести дополнительные действия (скопировать файл конфигурации, ярлык программы и т. д.)
5. Удалить подключение к папке с дистрибутивом

Как можно увидеть, самая сложная часть при создании данного файла — правильно прописать ключи тихой установки для конкретной программы. Сложность заключается в том, что для конкретных установщиков эти ключи очень сильно отличаются, и ключи, подходящие для одной программы, далеко не всегда подходят для другой.
Для облегчения поиска ключей тихой установки советую отличный сайт ITNinja. Сайт содержит информацию о способах тихой установки популярных программ. Достаточно ввести название программы, и будут выведены способы тихой установки для данной программы.
Кроме того, поиск облегчает тот факт, что большинство программ используют одинаковые установщики, для которых ключи установки заранее известны. Наиболее популярные установщики:

  • Пакет MSI
  • InstallShield
  • Inno Setup
  • NSIS


Информацию о ключах установки для популярных установщиков можно найти здесь

Создание скрипта PsExec
Создание скрипта PsExec – довольно простая задача. Приведу пример скрипта PsExec для установки программы, описанной выше:

@echo off
echo Внимание! будет произведена автоматическая
echo установка program.exe на следующие компьютеры:
echo ----------------------------------
for /F %%i in (list.txt) do echo %%i
echo ----------------------------------
echo Предыдущая версия program.exe на данных компьютерах будет удалена
echo Все запущенные экземпляры program.exe будут закрыты без уведомления
set /p cont=Продолжить? (Д\Н)
set /p username=Введите имя пользователя:
set /p userpass=Введите пароль:
if %cont% == Д for /F %%i in (list.txt) do start cmd /K "psexec -u %username% -p %userpass% -c \\%%i program.unattended.bat"


Первые 9 строк нужны только для того, чтобы обратить внимание администратора на то, что он собирается сделать. Команда на 5-й строке выводит список компьютеров, на которые будет устанавливаться программа. Список компьютеров хранится в файле list.txt, о котором будет сказано позднее.
Строки 10 и 11 принимают имя пользователя и пароль. В данном случае нужно будет ввести имя пользователя InstallUser и пароль данного пользователя.
Данный текст будет виден только человеку, запустившему скрипт. Пользователи на удаленных компьютерах текста не увидят.
Всё основное действие заключено в последней строке, начиная с for. Данная конструкция для каждой строки из list.txt (как уже было сказано, данный файл содержит список компьютеров, на которые будет устанавливаться программа)  вызывает отдельное окно с командной строкой , в которое передается команда "psexec -u %username% -p %userpass% -c \\%%i program.unattended.bat".

Разберём, какие действия выполняет данная команда. Данная команда вызывает программу psexec, в качестве имени пользователя (-u) используется имя, введенное с клавиатуры, в качестве пароля (-p) используется  пароль, введенный с клавиатуры.  В качестве имени удаленной системы берется параметр %%i, который означает строку, взятую из файла list.txt. Параметр -с указывает на то, что необходимо скопировать вызываемый файл на удаленную систему.
В качестве исполняемого файла используется файл  program.unattended.bat — это тот самый скрипт тихой установки, который был рассмотрен выше.

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

Создание списка имён
Список имен представляет собой обычный текстовый файл, в каждой строке которого находится имя или ip-адрес удаленного компьютера, на который будет производиться установка программы. Единственные  требования к файлу — на каждой строке должно находиться только одно имя или один ip-адрес, без слешей, в конце строки не должно быть никаких символов, кроме перевода строки.
Пример списка имён:
192.168.1.171
192.168.1.172
192.168.1.173
192.168.1.175
192.168.1.190
PC_PUPKINA
PC_IVANOV
PC_PETROV

В результате в папке с дистрибутивом программы будет находиться как минимум 4 объекта:
1. Папка с дистрибутивом программы, из которой будет производиться установка (в данном примере папка new)
2. Скрипт PsExec (файл program.psexec.bat) – тот файл, который запускает администратор
3. Скрипт установки (файл program.unattended.bat) – тот файл, который запускает на удаленной системе.
4. Список имён (файл list.txt)
Дополнительные файлы\папки могут использоваться или не использоваться в каждом конкретном случае.

О хранении и передаче пароля
В скрипте PsExec имя пользователя и пароль не хранятся из соображений безопасности. В случае, если нужно  указать имя пользователя и пароль явно (например, при запуске установки в ночное время, когда некому будет ввести логин и пароль), нужно удалить строки запроса имени пользователя и пароля и заменить переменные username и userpass на конкретные значения.  Однако безопасность в этом случае сильно страдает.
В интернете есть много сообщений о том, что при передаче запроса PsExec на подключение к удаленной системе пароль передается в открытом виде. Однако как я ни старался, при помощи анализатора трафика мне не удалось найти никаких следов пароля (использовал Wireshark). Возможно, это замечание относится только к старым версиям PsExec. Однако  если безопасность передачи пароля важна, возможно, стоит применить дополнительные методы защиты соединений.

Плюсы и минусы данного метода установки
Попробую дать оценку данному методу установки.
К плюсам метода можно отнести:

  • Возможность работы с любыми типами установщиков (в отличие от GPSI, который поддерживает только msi пакеты)
  • Сравнительная простота создания установки для конкретного дистрибутива. Единственная сложность заключается в правильном использовании ключей тихой установки. После создания установщика для конкретного дистрибутива установка сводится к запуску скрипта и вводу имени пользователя и пароля.
  • Незаметность для конечного пользователя. Вся установка протекает незаметно для пользователя и не отвлекает его от работы. Никаких действий от пользователя не требуется.


Минусы метода:
  • «Заточенность» под конкретный сценарий использования. Данный метод удобно использовать для сценария, когда есть большое количество машин, на которых периодически нужно обновлять определенные программы. При других сценариях — например, когда есть один или несколько «новых» компьютеров, на которые нужно установить пакетно большое количество программ — данный метод использовать тоже можно, но придется вносить некоторые изменения.
  • Невозможность отложенной установки. Может возникнуть ситуация, когда конечный пользователь в настоящий момент использует данную программу и обновлять ее прямо сейчас нежелательно. При использовании данного метода открытый экземпляр программы будет закрыт и программа обновится вне зависимости от желания пользователя. Если необходимо посылать пользователю предложение об установке программы (чтобы пользователь мог сам решить, устанавливать программу или нет), возможно, стоит использовать другие системы, например WPKG.
  • Большая нагрузка на хранилище. При использовании данного метода все пользователи начинают скачивать дистрибутив устанавливаемой программы одновременно, что может привести к большим нагрузкам на сетевое хранилище (в особенности, если пользователей много и дистрибутив большого размера). Возможное решение проблемы — небольшая модификация  скрипта PsExec.
Если вместо
for /F %%i in (list.txt) do start cmd /K "psexec -u %username% -p %userpass% -c \\%%i program.unattended.bat"
написать
psexec -u %username% -p %userpass% -c @list.txt program.unattended.bat
Удаленные системы запустят скрипт установки не одновременно, а одна за другой.

Таким образом, мне кажется, что данный метод установки применим в тех случаях, когда в небольшой  локальной сети (порядка 100 машин) нужно периодически обновлять программное обеспечение (самописное и сторонних разработчиков) сразу же после выхода новой версии одновременно всем сотрудникам.

четверг, 11 декабря 2014 г.

Maria Linnemann - Canzone d'Amore: ноты

Еще одна интересная композиция для гитары от Марии Линнеманн. Исполнение:
Ноты в интернете найти можно, но обычно это сканы не очень хорошего качества.
Выкладываю свою подборку (в качестве источника использовался один из таких сканов):
Ноты в формате PDF - здесь
Ноты в формате mscz (для нотного редактора MuseScore) - здесь 

За точность подбора не ручаюсь.