На текущий момент, когда многие зарубежные компании приостановили свою деятельность в России, всё более актуальным становится вопрос автоматизации рутинных рабочих процессов подручными доступными бесплатными средствами.

Предлагаю вашему вниманию статью об удалённой установке программ штатными средствами Windows 10 и бесплатными консольными утилитами.

Рассмотрим установку двух наиболее часто встречающихся типа установочных файлов .exe и .msi, на примере всеми любимого бесплатного архиватора 7-zip и браузера Google Chrome

Для начала нам потребуются актуальные дистрибутивы, которые можно скачать с официальных сайтов:

  1. На момент написания статьи актуальной версией 7-zip являлась 21.07 (64х битный установщик для Windows)

  2. 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)


  1. LAG_LAGbI4
    09.07.2022 18:54
    +1

    А с авокадом это прокатит? А если сотрудники в офисе не бывают, а только по впн подключаются?


    1. GypsyBand
      11.07.2022 07:21

      ну если канал , как раньше говорили, толщиной с руку, то возможно. CAD по сети то не быстро устанавливается ;)


  1. drdead
    09.07.2022 19:52

    Почему не PowerShell?


    1. avelor
      09.07.2022 20:38
      +2

      Нуу, если winrm не вклучен, то psexec может быть старым-верным способом. Хотя и странне для 2к22:)

      Ожидал набора интересных вариантов, кроме psexec - wmi (wmic, для олдскульщиков без вин11), gpo, более модный сторонний софт типа uem решений, от касперского до sccm, ну и чиф/паппет/ансибль


      1. Ssandarss
        11.07.2022 07:29

        А ансибль на виндах разве раскатает, там же просто запуск шелла будет не?

        А с такой заковыкой что каспер блочит psexec в случае массовой установки не сталкивался?


        1. avelor
          11.07.2022 09:22

          Есть и обмазка https://docs.ansible.com/ansible/latest/collections/ansible/windows/win_package_module.html

          лично - нет, но охотно верю что Каспер может блочить что угодно:) хороший антивирус, но иногда вреда больше чем пользы приносит, нуждается в настройке. Но при корп использовании его менеджмент центр вполне может и приложения катать. Видел, что использовали менеджмент центр без антивируса - чисто для управления компами:)


          1. ElvenSailor
            11.07.2022 17:38

            только возможность эта требует отдельный пункт в лицензии. Без него не заработает.


        1. IVELESI Автор
          12.07.2022 10:30

          Для этого на сервер администрирования каспера необходимо создать разрешающе правило для psexec.


    1. IVELESI Автор
      12.07.2022 10:28

      В большой доменной сети могут ограничения на запуск PoSh-скриптов.


  1. mc2
    09.07.2022 20:30
    +1

    Если 100 машин, значит скорее всего есть домен. Если есть домен, то нафиг ручное самоуправление, если есть sccm?


    1. avelor
      09.07.2022 20:32
      +3

      sccm деняк стоит, а вот установка через gpo - неть (если домен есть уже)


      1. IVELESI Автор
        12.07.2022 10:38

        Тихая установка через psexec очень быстрый вариант, по сравнению с тем же sccm выигрывает в скорости в 2-3 раза, иногда это критично. К тому же для использования sccm, создания пакета, развёртывания его на коллекцию устройств, например, необходимо иметь опыт работы в этой системе или пройти обучение (не дешевое, кстати). В моей статье psexec рассматривает именно как "подручное" средство, не требующее дополнительных вложений денег и времени.


  1. FSA
    09.07.2022 21:10

    psexec? Подобную штуку я использовал последний раз минимум 6 лет назад, когда ещё не уехал из своего города. Тогда у меня был зоопарк древних компьютеров компьютеров на Windows XP и Windows 7, где 4 гигабайта оперативки - это шик. Ставил через эту фигню VNC, а потом уже через удалённый доступ накатывал то, что нужно.


  1. Harliff
    09.07.2022 22:25

    Если речь идёт про 7zip, то я с большой благодарностью отнесусь к рецепту по автоматической ассоциации его с архивами для всех пользователей. Я начинал этим заниматься, но не доделал решение.


    1. 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


  1. Sergey-S-Kovalev
    09.07.2022 23:12
    +2

    Ухх. Флешбеки из начала 2000чных. Вроде и лампово, но делать такое в современном мире есть извращение великое.


  1. temnikov_vasiliy
    10.07.2022 00:03

    зачем всё это ? когда есть вот это - https://wpkg.org/ ?


    1. mltk
      10.07.2022 09:10
      +1

      Вы правда его используете? С каким парком? WPKG с 2014 года не развивается и даже про Win10 ничего не знает.

      Есть ещё схожий и так же заброшенный в 2018-м проект Local Update Publisher (формирование и установка своих пакетов через WSUS)

      Не думаю, что WPKG или LUP стоит истользовать в 2022 :)


  1. alex_mayak
    10.07.2022 00:51

    А WMI не позволяет устанавливать ПО на удаленной машине?
    если я правильно помню это самая мощное средство администратора


    1. IVELESI Автор
      12.07.2022 10:39

      Использование WMI достойно отдельной статьи)


    1. avelor
      12.07.2022 11:09

      можно. что-то типа

      Invoke-CimMethod -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation='\\AppSrv\dsp\NewPackage.msi'}


  1. r0ck3r
    10.07.2022 12:22

    Вроде ещё официальный winget есть


    1. oldbie
      10.07.2022 15:31

      Пока лучше забыть, стрёмно, глючно и сыро, его еще допиливать и допиливать.

      Кроме того, ИМХО, у вингета есть архитектурный "фатальный недостаток" -- пакеты лежат на стороне, и если MS не начнут распространять их своими силами, то этот сервис умрет не успев толком "начаться".


  1. VXP
    11.07.2022 00:34

    Может лучше не ERRORLEVEL 1 проверять, а наоборот - ERRORLEVEL 0? Мало ли какой эррорлевел вернёт приложуха


    1. victor-homyakov
      12.07.2022 09:21

      if ERRORLEVEL 1 проверяет не на равенство, а на >=. То есть на C-образных языках было бы if (ERRORLEVEL >= 1).


  1. ilyailyailya
    11.07.2022 07:25

    Для решения описанных в статье задач советую изучить две утилиты, через них же и обновлять уже установленные версии ПО:

    1. winget - встроенный менеджер пакетов и приложений, для Win10 предварительно установить AppInstaller из MS Store

    2. choco


  1. riomenx
    11.07.2022 13:55

    1000 компов. Используем KSC. Безапасно


  1. Veter44k
    12.07.2022 09:34

    для работы psexec нужно иметь открытый общий ресурс $admin, а это ой как не безопасно)


  1. 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 пути


    1. IVELESI Автор
      12.07.2022 10:20

      Код ошибки 1619 обычно говорит о том, что установочный пакет повреждён.