На текущий момент, когда многие зарубежные компании приостановили свою деятельность в России, всё более актуальным становится вопрос автоматизации рутинных рабочих процессов подручными доступными бесплатными средствами.
Предлагаю вашему вниманию статью об удалённой установке программ штатными средствами Windows 10 и бесплатными консольными утилитами.
Рассмотрим установку двух наиболее часто встречающихся типа установочных файлов .exe и .msi, на примере всеми любимого бесплатного архиватора 7-zip и браузера Google Chrome
Для начала нам потребуются актуальные дистрибутивы, которые можно скачать с официальных сайтов:
На момент написания статьи актуальной версией 7-zip являлась 21.07 (64х битный установщик для Windows)
-
Google Chrome будем качать в виде установочного пакеты MSI, на момент написания статьи актуальная версия 102.0.5005.63 (скачать msi установщик)
#Обратите внимание что, что сам установщик упакован в архив, с расширением .zip, и для его извлечение предварительно необходимо будет установить ранее скачанный архиватор 7-zip.
Так же нам понадобится утилита psexec, которая входит в комплект PsTools, скачать их можно тут.
Теперь скачанные нами файлы установки и утилиту psexec необходимо поместить в одну папку, пусть для удобства это будет D:\silent\7z и D:\silent\chrome
#После распаковки архива с дистрибутивом Chrome нужный нам файл будет лежать в папке \Installers\ GoogleChromeStandaloneEnterprise64.msi
##Т.к. большинство современных установок Windows 64-х разрядные, мы будем использовать файл PsExec64.exe
Теперь можно используя командную строку Windows приступить к установке программ на удалённый компьютер
#Нажимаем комбинацию клавиш wir+R, вводим CMD и жмём OK
Перейдём в каталог со скачанным 7-zip выполнив команду
c:\>cd d:\silent\7z
Расскажу подробнее как работает утилита PsExec.
В простейшем случает синтаксис нашей команды будет таким:
psexec \\компьютер [-u пользователь [-p пароль]] программа [аргументы]
Где:
\\компьютер – имя удалённого компьютера, на который мы будем устанавливать наш архиватор(у нас это user_pc)
[-u пользователь [-p пароль]] – необязательные параметры, если у вашей учётной записи есть права на установку программ или права администратора в домене. Если нет – эти параметры помогают указать имя и пароль пользователя, который обладает достаточными правами.
программа – имя исполняемого файла, (7z2107-x64.exe)
аргументы – параметры установки программы, влияющие на сам процесс установки. Ещё аргументы называют ключами.
#Например, аргумент /S - будет означать тихую установку программы, без участия пользователя на удалённом компьютере. Ключей тихой установки может быть множество, и для разных программ они могут отличаться. Подобрать их можно изучив документацию к программе, но как правило большинство из них являются универсальными.
Таким образом наша конечная команда будет выглядеть так:
PsExec64.exe \\user_pc –c 7z2107-x64.exe /S
ключ –с копирует 7z2107-x64.exe на удалённый компьютер для последующего запуска
В случае успешной установки программы в окне командной строки мы должны увидеть следующее:
7z2107-x64.exe exited on user_pc with error code 0.
error code 0 означает что программа установлена успешно.
В случае успешной установки программы в окне командной строки мы должны увидеть следующее:
7z2107-x64.exe exited on user_pc with error code 0.
error code 0 означает что программа установлена успешно.
Всё! Пользователь работающий на user_pc абсолютно незаметно для себя самого стал счастливым обладателем архиватора 7zip.
Теперь приступим к удалённой установке браузера Google Chrome, который мы скачали в виде установочного файла с расширением .msi.
Для установки MSI пакетов в windows используется утилита msiexec, которая уже установлена в операционной системе. Как правило утилита эта находится в каталоге c:\Windows\system32\msiexec.exe.
Удобнее и быстрее будет если предварительно установочный файл скопировать на целевой компьютер и запускать его оттуда удалённо. В этом нам поможет встроенная в Windows утилита xcopy. У неё очень простой синтаксис в стиле:
xcopy что_копируем куда_копируем параметры_копирования
xcopy D:\silent\Chrome\GoogleChromeStandaloneEnterprise64.msi \\user_pc\c$\Windows\Temp\ /s /e
Где:
D:\silent\Chrome\GoogleChromeStandaloneEnterprise64.msi – полный пусть к файлу установки на нашем компьютере
\\user_pc\c$\Windows\Temp\ - путь назначения для копируемого файла на удалённом компьютере
/s /e - Копирование каталогов с подкаталогами, включая пустые.
Теперь всё готово для запуска удалённой установки программы.
psexec64.exe \\user_pc c:\Windows\system32\msiexec.exe /i c:\Windows\Temp\GoogleChromeStandaloneEnterprise64.msi /qn /quiet /norestart
В первой части команды мы указываем утилите psexec64.exe имя удалённого компьютера \\user_pc и место расположение утилиты отвечающей за установку .msi файлов c:\Windows\system32\msiexec.exe (как правило она всегда находится по этому пути), далее идёт ключ /i, который означает что будет производиться именно установка программы (install), после чего мы указываем полный пусть исполняемого файла на удалённом компьютере c:\Windows\Temp\GoogleChromeStandaloneEnterprise64.msi и в конце указываем несколько ключей тихой установки:
/qn – полностью скрывает процесс установки от пользователя
/quiet - тихий режим без взаимодействия с пользователем. Все окна будут скрыты. Если после обновления понадобиться перезагрузка, то она будет произведена.
/norestart – отменяет перезагрузку, если она необходима после установки программы.
Таким образом, после запуска нашей команды тихой удалённой установки браузера Google Chrome, пользователь на удалённом компьютере ничего не заметит ровно до того момента, когда ярлык браузера появится у него на рабочем столе.
�
А если в вашей сети есть 100 компьютеров, на которые необходимо установить тот же браузер Google Chrome? Можно делать это вручную, запуская команды копирования и установки для каждого компьютера отдельно – это долгий и трудоёмкий процесс, а можно автоматизировать, написав простой скрипт и подсунув ему файл со списком компьютеров для установки.
Скрип будем писать в виде .bat файла, в котором будут последовательно исполняться команды.
В папке D:\silent\chrome создадим файлы install.txt и userspc.txt и откроем их в блокноте.
�
В файл userspc.txt заносим список ПК, на которые планируем установить Chrome, в файле не должно быть ни каких лишних символов, кроме имён ПК и символа переноса строки. Так же вместо имён можно использовать IP-адреса компьютеров. После этого файл можно сохранить и закрыть.
Теперь хорошо бы знать на какие компьютеры браузер установился успешно и на какие установка не произошла (например, компьютер мог быть выключен на момент запуска скрипта). Для этого в папке chrome создадим папку log которой создадим два файла install-good.txt и install-bad.txt, в которые скрипт будет заносить имена компьютеров с (не)успешной установкой.
�
В файле install.txt пишем следующее:
for /f %%i in (d:\silent\Chrome\userspc.txt) do (
mkdir \\%%i\c$\Windows\Temp\Chrome
xcopy D:\silent\Chrome\googlechromestandaloneenterprise64.msi \\%%i\c$\Windows\Temp\Chrome /s /e
psexec64 \\%%i c:\Windows\system32\msiexec.exe /i c:\Windows\Temp\Chrome\googlechromestandaloneenterprise64.msi /qn /quiet /norestart
�
if errorlevel 1 (
echo %%i >>D:\silent\Chrome\log\install-bad.txt
) ELSE (
echo %%i >>D:\silent\Chrome\log\install-good.txt
)
rmdir /s /q \\%%i\c$\Windows\Temp\Chrome
)
pause
Разберём построчно команды и алгоритм работы данного скрипта:
Алгоритм прост, в цикле считываем из файла userspc.txt построчно имена компьютеров, каждое имя присваивается переменной \\%%i, далее выполняются раннее составленные нами команды копирования и тихой установки Google Chrome. В конце скрипт проверяет код возвращаемой скриптом ошибки. Если скрипт вернул 0, в файл install-good.txt заноситься имя текущего компьютера, на котором была попытка установки программы. Если код ошибки другой, то компьютер заноситься в файл install-bad.txt.
�
for /f %%i in (d:\silent\Chrome\userspc.txt) do (
…
)
Цикл for предназначен для выполнения повторяющихся однотипных команд,
Рассмотрим его работу более детально. %%i – переменная, которая является счётчиком шагов цикла, писать её надо именно так, как в примере используя двойной знак процента и букву английского алфавита, одну. На каждом шаге цикла выполняются команды, записанные после слова do. Ключ /f указывает на то, что цикл будет работать с файлами. После слова in указан путь к файлу, где хранятся имена компьютеров.
Этот блок программы построчно считывает имена компьютеров и для каждого из них выполняет указанные в скобках команды.
mkdir \\%%i\c$\Windows\Temp\Chrome
mkdir – команда, предназначенная для создания каталогов. В нашем случае мы создаём папку Chrome на удалённом компьютер в папке \Windows\Temp\. Напомню, что текущее имя удалённого компьютера храниться в переменной %%i.
Как работает xcopy было рассмотрено ранее в статье, по этому на ней заострять внимание не будем.
�
psexec64 \\%%i c:\Windows\system32\msiexec.exe /i c:\Windows\Temp\Chrome\googlechromestandaloneenterprise64.msi /qn /quiet /norestart
– запускает установку Chrome на каждом отдельно взятом компьютере.
if errorlevel 1 (
echo %%i >>D:\silent\Chrome\log\install-bad.txt
) ELSE (
echo %%i >>D:\silent\Chrome\log\install-good.txt
)
if – команда, обрабатывающая какое-то логическое условие, она же оператор ветвления. Т.е. если условие заданное после if выполняется, то будет выполнена команда, следующая за условием. В противном случае будут выполнены команды следующие за оператором ELSE. Завершив работу программа возвращает код завершения, с помощью errorlevel их можно использовать в качестве условия.
echo %%i >>D:\silent\Chrome\log\install-bad.txt
echo – команда, выводящая в окно командной строки какой-то текст, так же вывод команды можно перенаправить в файл используя оператор >>. В нашем случае этой командой имена компьютеров с (не)успешной установкой заносятся в файлы логов install-bad.txt и install-good.txt.
rmdir /s /q \\%%i\c$\Windows\Temp\Chrome - действие этой команды обратно mkdir, т.е. она удалит ранее созданный нами каталог Chrome на пользовательском ПК, тем самым наведёт порядок и не оставит лишних установочных файлов забивающих собой дисковое пространство.
pause – просто оставит висеть окно командной строки, и не даст ему закрыться автоматически после завершения работы нашего скрипта.
Как видите, всё просто.
Дополнительно про типы инсталляторов и ключи тихой установки можно почитать тут.
Про тонкости работы команды xcopy тут.
Попробуйте написать самостоятельно скрипт для установки 7-zip.
Если остались вопросы с удовольствием отвечу на них в комментариях.
Комментарии (30)
drdead
09.07.2022 19:52Почему не PowerShell?
avelor
09.07.2022 20:38+2Нуу, если winrm не вклучен, то psexec может быть старым-верным способом. Хотя и странне для 2к22:)
Ожидал набора интересных вариантов, кроме psexec - wmi (wmic, для олдскульщиков без вин11), gpo, более модный сторонний софт типа uem решений, от касперского до sccm, ну и чиф/паппет/ансибль
Ssandarss
11.07.2022 07:29А ансибль на виндах разве раскатает, там же просто запуск шелла будет не?
А с такой заковыкой что каспер блочит psexec в случае массовой установки не сталкивался?
avelor
11.07.2022 09:22Есть и обмазка https://docs.ansible.com/ansible/latest/collections/ansible/windows/win_package_module.html
лично - нет, но охотно верю что Каспер может блочить что угодно:) хороший антивирус, но иногда вреда больше чем пользы приносит, нуждается в настройке. Но при корп использовании его менеджмент центр вполне может и приложения катать. Видел, что использовали менеджмент центр без антивируса - чисто для управления компами:)
ElvenSailor
11.07.2022 17:38только возможность эта требует отдельный пункт в лицензии. Без него не заработает.
IVELESI Автор
12.07.2022 10:30Для этого на сервер администрирования каспера необходимо создать разрешающе правило для psexec.
mc2
09.07.2022 20:30+1Если 100 машин, значит скорее всего есть домен. Если есть домен, то нафиг ручное самоуправление, если есть sccm?
avelor
09.07.2022 20:32+3sccm деняк стоит, а вот установка через gpo - неть (если домен есть уже)
IVELESI Автор
12.07.2022 10:38Тихая установка через psexec очень быстрый вариант, по сравнению с тем же sccm выигрывает в скорости в 2-3 раза, иногда это критично. К тому же для использования sccm, создания пакета, развёртывания его на коллекцию устройств, например, необходимо иметь опыт работы в этой системе или пройти обучение (не дешевое, кстати). В моей статье psexec рассматривает именно как "подручное" средство, не требующее дополнительных вложений денег и времени.
FSA
09.07.2022 21:10psexec? Подобную штуку я использовал последний раз минимум 6 лет назад, когда ещё не уехал из своего города. Тогда у меня был зоопарк древних компьютеров компьютеров на Windows XP и Windows 7, где 4 гигабайта оперативки - это шик. Ставил через эту фигню VNC, а потом уже через удалённый доступ накатывал то, что нужно.
Harliff
09.07.2022 22:25Если речь идёт про 7zip, то я с большой благодарностью отнесусь к рецепту по автоматической ассоциации его с архивами для всех пользователей. Я начинал этим заниматься, но не доделал решение.
mltk
10.07.2022 09:22+1В скрипте через ftype и assoc
assoc .zip=7-Zip.zip .zip=7-Zip.zip ftype 7-Zip.zip=C:\Program Files\7-Zip\7zFM.exe 7-Zip.zip=C:\Program Files\7-Zip\7zFM.exe
Sergey-S-Kovalev
09.07.2022 23:12+2Ухх. Флешбеки из начала 2000чных. Вроде и лампово, но делать такое в современном мире есть извращение великое.
temnikov_vasiliy
10.07.2022 00:03зачем всё это ? когда есть вот это - https://wpkg.org/ ?
mltk
10.07.2022 09:10+1Вы правда его используете? С каким парком? WPKG с 2014 года не развивается и даже про Win10 ничего не знает.
Есть ещё схожий и так же заброшенный в 2018-м проект Local Update Publisher (формирование и установка своих пакетов через WSUS)
Не думаю, что WPKG или LUP стоит истользовать в 2022 :)
alex_mayak
10.07.2022 00:51А WMI не позволяет устанавливать ПО на удаленной машине?
если я правильно помню это самая мощное средство администратораavelor
12.07.2022 11:09можно. что-то типа
Invoke-CimMethod -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation='\\AppSrv\dsp\NewPackage.msi'}
r0ck3r
10.07.2022 12:22Вроде ещё официальный winget есть
oldbie
10.07.2022 15:31Пока лучше забыть, стрёмно, глючно и сыро, его еще допиливать и допиливать.
Кроме того, ИМХО, у вингета есть архитектурный "фатальный недостаток" -- пакеты лежат на стороне, и если MS не начнут распространять их своими силами, то этот сервис умрет не успев толком "начаться".
VXP
11.07.2022 00:34Может лучше не ERRORLEVEL 1 проверять, а наоборот - ERRORLEVEL 0? Мало ли какой эррорлевел вернёт приложуха
victor-homyakov
12.07.2022 09:21if ERRORLEVEL 1
проверяет не на равенство, а на>=
. То есть на C-образных языках было быif (ERRORLEVEL >= 1)
.
ilyailyailya
11.07.2022 07:25Для решения описанных в статье задач советую изучить две утилиты, через них же и обновлять уже установленные версии ПО:
winget - встроенный менеджер пакетов и приложений, для Win10 предварительно установить AppInstaller из MS Store
choco
Veter44k
12.07.2022 09:34для работы psexec нужно иметь открытый общий ресурс $admin, а это ой как не безопасно)
kavabangaungava
12.07.2022 09:36Подскажите, при выполнении:
psexec64.exe \\user_pc c:\Windows\system32\msiexec.exe /i c:\Windows\Temp\GoogleChromeStandaloneEnterprise64.msi /qn /quiet /norestart
Получаю ошибку msiexec.exe error code 1619
GoogleChromeStandaloneEnterprise64.msi прекрасно скопировался xcopy, и доступен по unc пути
IVELESI Автор
12.07.2022 10:20Код ошибки 1619 обычно говорит о том, что установочный пакет повреждён.
LAG_LAGbI4
А с авокадом это прокатит? А если сотрудники в офисе не бывают, а только по впн подключаются?
GypsyBand
ну если канал , как раньше говорили, толщиной с руку, то возможно. CAD по сети то не быстро устанавливается ;)