Pull to refresh

Как быстро захватить мир или управление сетью windows компьютеров с помощью OPSI

Reading time14 min
Views12K
Disclaimer:
Автор любит короткие и прямые костыли, а также нежно обожает свободный открытый софт за ту гибкость и масштабируемость, что тот дает. Целью данной статьи является желание попиариться, а также рассказать о незаслуженно неизвестной в русскоязычном интернете системе управления софтом OPSI(Open PC Server Integration).


Я сидел в офисе и попивал себе кофе, когда мне позвонил Илон Маск и на чистом русском языке сообщил мне, что хватит уже это терпеть, пора собрать лучшие умы для борьбы с неким вирусом, а для этого прямо сейчас, через пять минут ко мне в офис привезут 100 компьютеров, на которые мне в срочном порядке нужно будет развернуть windows 10, а завтра с утра в офис приедут ученые со всего мира, чтобы начать работу над антивирусом. Ну что же, разве не этого я ждал всю свою жизнь? Достойный вызов для хорошего инструмента.

Для исполнения плана я буду использовать систему OPSI — Open PC Server Integration.

OPSI написана на питоне в германии и, видимо, там тоже очень любят костыли, бесплатность и масштабируемость.

Базовые возможности системы:

  1. Автоматическое развертывание софта

    Работает это так: анализируешь инсталлятор и из него делаешь пакет opsi, который нужным образом ставит программу. Лучше всего работает с msi пакетами, знает еще несколько форматов, с которыми тоже справляется. Может запустить bat файл или powershell скрипт, да в принципе, любой интерпретатор. Есть встроенные системы работы с реестром, в общем, полный фарш, лучшая часть системы наверное.
  2. Автоматическая установка операционных систем

    Я пользуюсь только установкой из образа, как самой быстрой, но есть варианты с автономной установкой системы с нуля.
  3. Программная и аппаратная инвентаризация

    Здесь можно проводить например софтовую и железячную инвентаризацию при загрузке, но самой большой фичей в этом аспекте является безагентная инвентаризация, когда компы загружаются по сети в линукс, который проводит инвентаризацию и комп перезагружается, загружая со второго раза уже windows. То есть, если вам допустим, нельзя лезть в windows, а инвентаризировать компы надо, вы настраиваете инвентаризацию через сетевую загрузку и получаете что хотели.
  4. Несколько удобных интерфейсов управления с возможностью гибкой интеграции

    Есть программа с графическим интерфейсом, есть http интерфейс, на который можно слать команды, с консоли сервера можно управлять OPSI, встраивать команды в свои скрипты, можно получить доступ к бэкенду из питона, но я, к сожалению, пока такой магией не владею.
  5. Поддержка множественных серверов depot (сервера, содержащие непосредственно софт, с которых идет развертывание).

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

Возможности системы, реализуемые за счет модулей(есть бесплатные модули и платные):

  1. LDAP коннектор (платный)

    Коннектор, соединяющий в одно целое домен и opsi
  2. Управление лицензиями (платный)

    Управление программными лицензиями на администрируемых компах: установка, удаление...
  3. MySQL бекенд (платный)

    Перевод базы OPSI на mysql для больших установок, более 300 клиентов
  4. Nagios коннектор (платный)

    расширенный мониторинг
  5. Установка при выключении (бесплатный)

    По умолчанию, opsi агент выполняет задания при загрузке системы, это можно изменить, перенеся задания на время при выключении.
  6. Локальный бекап в образы (платный)

    Не выяснял как это работает.
  7. Линукс агент (платный)

    ПлАчу горючими слезами, так как попробовать, как это работает было бы очень, очень интересно. Да, я знаю про ansible и puppet, но всё равно горько. Единая система управления linux и windows системами в сети это звучит очаровывающе.
  8. WAN расширение (платный)

    Расширение для работы с удаленными клиентами через медленные соединения, то есть интернет.
  9. Управление пользовательскими профилями (бесплатный)

    Не пробовал
  10. OTRS::ITSM коннектор (платный)

    Тоже не довелось
  11. Софт по запросу (бесплатный)

    Классная штука, вы в общих пакетах выделяете те, которые пользователь может ставить сам и пользователи сами могут ставить любые программы, применять изменения «без регистрации и смс», а главное, без вирусов.

Поподробнее можно узнать здесь

Модель монетизации у них следующая: они продают модули, пока не наберут сумму, чтобы сделать их бесплатными.

Пока ко мне в кабинет заносят компы и собирают их, я устанавливаю сервер AD на виндовс сервере, поднимаю на нем домен domain.local, а также DNS и DHCP.

Устанавливать OPSI можно в рабочей группе и в домене, мы будем ставить в домене, но без привязки к АД(LDAP коннектор).

Развертывать windows 10 на сеть компьютеров мы будем по следующей схеме: подготовим развертываемый образ windows 10 со всеми программами, загрузимся по сети через opsi, с помощью clonezilla автоматически сохраним его в файл, потом выставим всем компам автоматическую установку через opsi, загрузимся по сети и автоматически же разольем этот файл на все компьютеры в широковещательном сегменте сети через tftp.

Для этого на области DHCP сервера зададим параметр номер 66 в ip нашего будущего сервера opsi 192.168.1.229

image

и параметр 67 приведем к виду linux/pxelinux.0

В DNS добавляю opsiserver.domain.local под его статическим адресом 192.168.1.229
Затем создадим виртуальную машину под наш сервер opsi на железе, которое выдержит ваши нагрузки и подойдет вам по скоростям. Ssd и несколько сетевых карт приветствуются.

Opsi поддерживает не все системы, список совместимости можно посмотреть здесь.

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

Мой любимый дистрибутив debian 10 я устанавливаю в минимальной комплектации с именем opsiserver.

После установки и перезагрузки на всякий случай сконфигурируем локали:

dpkg-reconfigure locales

Я выбираю все, где есть de_ en_ и ru_ системной оставляю en_US.UTF8.

Дальнейшая установка есть адаптированный под задачу пересказ этого туториала.

Поменяем имя сервера, если оно отлично от того, что нам нужно:

hostname opsiserver.domain.local

Проверка:

hostname -f

Приведем /etc/hosts к следующему виду:

127.0.0.1 localhost
127.1.1.1 localhost.localdomain
192.168.1.229 opsiserver.domain.local opsiserver

И забудем навсегда о его существовании, так как опси требовательна к содержанию этого файла и при его изменении иногда начинает бунтовать и сыпать ошибками.

Устанавливаем требуемые пакеты:

apt install wget host pigz mc -y

apt install samba samba-common smbclient cifs-utils -y 

Устанавливаем mysql сервер по умолчанию, у меня встает maria-db, он тоже подойдет.

apt install default-mysql-server -y

sudo mysql_secure_installation

Отвечаем на вопросы утвердительно, меняя пароль рут и запоминая его.

Добавляем репозитории OPSI в систему:

echo "deb http://download.opensuse.org/repositories/home:/uibmz:/opsi:/4.1:/stable/Debian_10/ /" > /etc/apt/sources.list.d/opsi.list

wget -nv https://download.opensuse.org/repositories/home:uibmz:opsi:4.1:stable/Debian_10/Release.key -O Release.key
apt-key add - < Release.key

Обновляемся:

apt update

Удаляем tftpd если он есть, так как OPSI будет с ним конфликтовать:

apt remove tftpd

Удаляем поддержку tftp из inetd, так как если она есть, то OPSI будет с ней конфликтовать:

update-inetd --remove tftp
apt install opsi-tftpd-hpa

И непосредственно устанавливаем opsi сервер:

apt install opsi-server

в процессе спросят данные, которые нужны для создания самоподписанного сертификата, который в свою очередь нужен для шифрованного соединения клиентов с сервером.
Устанавливаем поддержку windows:

apt install opsi-windows-support

конфигурируем mysql бекенд:

opsi-setup --configure-mysql

image

Выставляем адрес сервера(localhost), пользователь от которого действуем(root), пароль root в mysql(который запоминали ранее), название бд для opsi(opsi), имя пользователя кто будет работать в этой бд(opsi), пароль этого пользователя(придумываем новый).

Далее для debian 10 надо добавить /usr/sbin в PATH:

PATH=$PATH:/usr/sbin

и эту же строку стоит добавить в .bashrc в вашем домашнем каталоге. Если этого не сделать, на следующем шаге получите ошибку «chpasswd not found».

Инициализируем систему и выставляем нужные права на файлы и директории системы:

opsi-setup --init-current-config
opsi-set-rights

Перезапуск служб:

systemctl restart opsiconfd.service
systemctl restart opsipxeconfd.service

Конфигурируем самбу:

opsi-setup --auto-configure-samba

Клиенты OPSI подключаются к основному серверу через https на порт 4447, при этом если нужно вызвать какую-то установку, то клиенты подмонтируют самба-шару с сервера opsi и с нее ставят софт. Чтобы все это было возможно, мы позволяем OPSI переконфигурировать самбу.

Рестарт самбы:

systemctl restart smbd.service
systemctl restart nmbd.service

Устанавливаем администраторский пароль для системного пользователя pcpatch:

opsi-admin -d task setPcpatchPassword

Теперь создадим пользователя для администрирования системы:

useradd -m -s /bin/bash adminuser

Создадим ему пароль:

passwd adminuser

Теперь пароль для самбы, я создаю такой же, как в системе:

smbpasswd -a adminuser

Добавляем в группу:

usermod -aG pcpatch adminuser

Если мы будет делать что-то с OPSI под рутом то нужно добавить рута в группу:

usermod -aG pcpatch root

Ещё немного костылей:

opsi-setup --patch-sudoers-file

Теперь можно загрузить пакеты в систему, а пока они загружаются, попить кофе.

opsi-package-updater -v install

Впоследствии пакеты можно будет обновить командой:

opsi-package-updater -v update

Теперь заходим на
https://download.uib.de/opsi4.1/misc/helper/, скачиваем и устанавливаем оттуда менеджмент интерфейс opsi-configed для управления сервером

opsi-configed-setup.exe

вводим адрес сервера, нашего пользователя adminuser и его пароль

https://opsiserver.domain.local:4447/

И мы в системе.

На этом этапе сервер установлен!

image

1 — все подключенные к этом серверу клиенты, их можно разбирать по группам, в том числе, вложенным, применять назначение сразу ко всей группе.
2 — вкладка с клиентами, это список тех компов, которые управляется opsi
3 — клиенты списком, здесь их можно выделить в любом порядке, чтобы применить назаначение
4 — «конфигурация продукта» — жертва перевода. На самом деле там те пакеты, что можно ставить в винду, в терминологии opsi — localboot products
5 — Netboot products — это все то, что загружается по сети
6 — opsi-mac-address — мак компа — то, по чему он определяется при сетевой загрузке
7 — opsiHostKey — это «пароль» клиента в системе opsi, если вы удалите с компа клиент opsi, а потом установите заново, то он не будет работать, так как пароль останется старым и не будет подходить. Это и бага и фича. А как бы вы сделали?

Теперь подготовим windows 10 образ, который будем разливать. Clonezilla, которой мы будем пользоваться, не так хороша, как акронис, но она всё же умеет разливать образ с меньшего диска на такой же или больший.

Поставим в систему все нужные нам программы, а также Remote Server Administration Tools for Windows 10. У меня windows 10 1903, я поставил для 1803 и всё что нужно, завелось. Скачать его можно отсюда: https://www.microsoft.com/en-us/download/details.aspx?id=45520
Нам он нужен для утилитки netdom, которая позволяет автоматически ввести комп в домен.

Для этого мы скачиваем файлы отсюда https://github.com/valmont2k/renamejoin в каталог c:\renamejoin. Создаем на контроллере домена администратора домена с возможностью только вводить компьютеры в домен с логином Joinadmin с паролем password1234QWE. Если злоумышленник перехватит этот пароль, то он сможет только навводить компьютеров в наш домен.

Запустим в администраторской консоли полностью подготовленной винды строчку из createtesk.txt, что создаст задачу на запуск при загрузке.

Вся схема будет работать следующим образом:
Когда мы разольем образ по всем компам, при первой загрузке windows запустит задачу C:\renamejoin\step1.cmd, которая переименует комп в win-%random%, перезагрузит комп, удалив C:\renamejoin\step1.cmd и переименуя C:\renamejoin\step2.cmd в C:\renamejoin\step1.cmd. На следующей загрузке windows запустит C:\renamejoin\step1.cmd, который введет этот комп в домен, перезагрузит его и удалит C:\renamejoin\step1.cmd. Потенциально опасную задачу мы сможем удалить с компьютеров домена позже. Через OPSI конечно же!

image

Пришло время подготовленную винду сконвертировать в образ.

Через иконку компьютера с плюсиком добавляем наш компьютер в менеджмент интерфейсе opsi opsi-configed, выставляем его мак-адрес. Сохраняем. Переходим в Netboot продукты, напротив clonezilla ставим «setup». В конфигурации для клиента выставляем все как на скриншоте: название файла и команду, по которой весь диск заливаем в образ. В биосе компьютера с виндой выставляем загрузку из сети. Перезагружаем комп. Если вы всё сделали правильно, то увидите, как винда перетекает в образ без помощи рук.

image

Тем временем, компьютеры собраны, но их нужно добавить как клиенты в opsi вместе в их мак-адресами, добавлять их ручками совсем не боярское дело, верно?

Решение есть:

apt install tcpdump

Запускаете на opsiserver:

tcpdump -n udp -vvvvv -e port 69 > /var/log/tftp

И, выставив в настройках биоса всех компов загрузку по сети(а заодно пробуждение от PCI-E устройств, по сети, позже поймете зачем), загружаем их. Если при загрузке появляется синее окошечко opsi boot menu,

image

то вы всё делаете правильно.

Компьютеры при загрузке обращаются к нашему серверу, tcpdump записывает их мак адреса в файл /var/log/tftp, а с помощью скрипта из репо https://github.com/valmont2k/opsi-hosts-importer который надо запускать на opsiserver после того, как все компы отметятся в opsi и оставят там свои мак-адреса. Этот скрипт использует API opsi вот отсюда https://download.uib.de/opsi4.1/experimental/documentation/html/opsi-api-documentation/opsi_API.html и немного магии. После его запуска у вас появятся клиенты на opsiserver вида win%random32%.domain.local

Следующий этап — разливка образа windows(который уже должен был сделаться), на все компьютеры.

image

Для этого выделяем все компы, на которые надо поставить винду и напротив clonezilla выставляем значения как на скриншоте. Компы выключаете, потом по очереди включаете несколько из них и наблюдаете, как на них полностью автоматически накатывается винда, они сами переименуются и вводятся в домен.

Если есть желание автоматизировать и это, то ставите etherwake и пишете скрипт, который с заданной задержкой берет из файла /tmp/newmacs мак-адреса и будит их хозяев, чтобы они по очереди накатили себе винду. Смотри update 1.

Я сделал жест Роналдо из рекламы шампуня и уже собрался за кофе, когда в мой телефон снова позвонил Илон Маск и добавил:

— Да, я забыл сказать, надо, чтобы завтра на всех компьютерах стояла %program% последней версии, справишься?
— Конечно, завтра всё будет!
Не могу же я расстраивать кумира технократов, значит нужно снова приложить мозги к рукам.

Неплохо бы, чтобы при загрузке компы ставили себе клиент opsi с названием opsi-client-agent. Сделать это можно через групповые политики домена.

Чтобы это происходило без ввода пароля при установке, надо в файле
/var/lib/opsi/depot/opsi-client-agent/files/opsi/cfg/config.ini на opsiserver
добавить как значение service_hidden_password пароль вашего пользователя adminuser в base64

[installation]
service_user=adminuser
service_password=none
service_hidden_password=base64HERE

Дальше добавляем групповую политику в домене setupOPSI и берем скрипт для нее отсюда https://github.com/valmont2k/opsi-install-opsi-client-agent-over-active-directory-domain-policy
Не забудьте вставить свои значения в скрипт.

image

Если вы все сделали правильно, то при первой перезагрузке в домене клиенты будут ставить opsi-client-agent, перезагружаться и появляться под своими именами вида win-%random% в интерфейсе управления OPSI. Старых клиентов с теми же мак-адресами можно удалить.

Теперь можно переходить к установке %program%.

Заходим сюда https://forum.opsi.org/viewtopic.php?f=22&t=7573 и находим ссылку на пакет *.opsi с названием packagebuilder, что-то типа "opsi PackageBuilder Windows (opsi Paket)".

Скачиваем пакет в директорию /var/lib/opsi/workbench на opsiserver

cd /var/lib/opsi/workbench

wget https://opsipackagebuilder.s3.amazonaws.com/opsiPackageBuilder/python/opsipackagebuilder_8.4.4-1.opsi 

и устанавливаем его:

opsi-package-manager -d ALL -i opsipackagebuilder_8.4.4-1.opsi

Теперь в интерфейсе управления opsi нажимаем на кнопочку обновить и видим, что у нас появились новые пакеты opsipackagebuilder и opsi-setup-detector.

Ставим их через интерфейс управления на тестовую машину под виндой.

Когда программы opsipackagebuilder и opsi-setup-detectorустановились, запускаем opsi-setup-detector и натравливаем его на инсталлер программы windirstat, скачанный предварительно с официального сайта программы.

Перед установкой надо настроить параметры программы. Подмонтируем шару на тестовой машине \\opsiserver.domain.local\opsi_workbench как диск z:, впишем свое имя и свою почту в заданные поля:

image

OPSI может делать один пакет, используя 32 и 64 инсталлеры одновременно и ставя их, исходя из разрядности системы, у нас же везде 64 бит, так что нажимаем «Analyze single file...»:

image

Видим, что детектор не понял каталог установки, его мы можем узнать сами, попытавшись установить программу через инсталлер. Зато задетектил тип установщика, версию программы, размер приложения в собранном и развернутом виде, ключ автономной установки, ключ автономного удаления и название uninstaller'a.

image

Вписываем сами каталог установки и жмём Next Step:
image

Здесь можно добавить имя продукта, его ID, описание и выставить версию пакета, то есть поставить ту попытку, которую мы предпринимаем, чтобы собрать пакет(в нашем случае первая попытка):

image

Можно проставить зависимости, это значит, что для установки текущего пакета сами выставятся к установке те пакеты, которые проставлены в требованиях к нашему:

image

Create OPSI package:

image

Мы создали пакет, теперь на opsiserver надо зайти в /var/lib/opsi/workbench/windirstat.

Собрать пакет:

opsi-makepackage

Установить его:

opsi-package-manager -d ALL -i windirstat-1.1.2-1.opsi

Если все прошло хорошо, то в интерфейсе управления opsi-configed нажимаем на кнопочку «обновить» и видим, что у нас появились новый пакет windirstat, который можно установить на выбранные компы в нашей сети.

Бинго! Первый пакет собран!

Усложним себе задачу, при помощи powershell создадим правило в брандмауэре виндовс, дающее доступ к клиенту к порту 4441 и 4447 и сделаем автозагрузку этого приложения для пользователя через твик реестра, как будто это был бы, например, мессенджер.

Открываем opsi package builder:

image

Выбираем открыть пакет и открываем наш пакет с windirstat:

image

OPSI по умолчанию действует следующим образом: при удалении программы из uninstall.opsiscript вызывается delsub.opsiscript, который и удаляет программу. При установке программы из setup.opsiscript вызывается delsub.opsiscript, который удаляет программу, а потом setup.opsiscript устанавливает её. Поэтому правки для создания чего-то делаем в setup.opsiscript, а правки для удаления чего-то — в delsub.opsiscript.

Вся магия этих скриптов отражена в документации https://download.uib.de/opsi4.1/documentation/html/en/opsi-winst-manual/opsi-winst-manual.html

setup.opsiscript можно открыть через значок карандашика, а delsub.opsiscript через Script Tree.

image

Вот полное меню файлов.

image

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

image

Добавляем программу в автозагрузку через opsi, для этого в setup.opsiscript вставим строки:

Registry_changes  /AllNTUserdats /64bit
[Registry_changes]
OpenKey [Software\Microsoft\Windows\CurrentVersion\Run]
Set "WinDirStat" = "C:\Program Files (x86)\WinDirStat\windirstat.exe"

А в delsub.opsiscript вставим строки:

Registry_changes  /AllNTUserdats /64bit
[Registry_changes]
OpenKey [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
;Set "WinDirStat" = "C:\Program Files (x86)\WinDirStat\windirstat.exe"
DeleteVar "WinDirStat"

Добавляем правило в брандмауэр через запуск powershell скрипта, для этого в setup.opsiscript вставим строки:

DosInAnIcon_PowerShell_ExecutionPolicy
ExecWith_PowerShell_NichtPDCAktionen powershell.exe winst /sysnative
[DosInAnIcon_PowerShell_ExecutionPolicy]
echo "powershell set-executionpolicy RemoteSigned ..."
powershell.exe set-executionpolicy RemoteSigned
exit %ERRORLEVEL%

[ExecWith_PowerShell_NichtPDCAktionen]
; hier Dein PS-Code

New-NetFirewallRule -DisplayName 'OPSI-Inbound' -Profile @('Domain', 'Private', 'Public') -Direction Inbound -Action Allow -Protocol TCP -LocalPort @('4441', '4447')

А в delsub.opsiscript вставим строки:

DosInAnIcon_PowerShell_ExecutionPolicy
ExecWith_PowerShell_NichtPDCAktionen powershell.exe winst /sysnative
[DosInAnIcon_PowerShell_ExecutionPolicy]
echo "powershell set-executionpolicy RemoteSigned ..."
powershell.exe set-executionpolicy RemoteSigned
exit %ERRORLEVEL%

[ExecWith_PowerShell_NichtPDCAktionen]
; hier Dein PS-Code
Remove-NetFirewallRule -DisplayName 'OPSI-Inbound'

Полный код можно посмотреть здесь:

https://github.com/valmont2k/WinDirStatOpsiPackageTest

Я уже расслабился, смотря как opsi раскатывает %program% последней версии на всю сеть, как мои размышления о высоком снова прервал Илон.
— На следующей неделе приедут ещё 500 человек, офисы уже сняты, компы завозятся, сетевик есть, нужно развернуть виндовс сеть в шести филиалах по городу, справишься?
— Ну конечно же, это же не рокет саенс — устало отшутился я в ответ.

Клонируем наш сервер opsiserver средствами гипервизора, разворачиваем его в филиале.
Предполагаем, что центральный офис соединен с филиалами через VPN со скоростью хотя бы 10мбит.

Сейчас мы сделаем depot сервер, то есть сервер для хранения пакетов в филиале. Клиенты в филиале будут стучаться по https на основной сервер, а если нужно будет ставить софт, то будут подмонитровать depot сервер в своем филиале и ставиться с него, сделано это в частности для экономии канала интернет между офисом и филиалом.

Настраиваем на филиальном сервере opsiserver-2 статический адрес из местной сети меняя файл /etc/network/interfaces согласно новой сети.

Меняем hostname и hosts:

sed -i 's/opsiserver/opsiserver-2/' /etc/hostname
sed -i 's/opsiserver/opsiserver-2/g' /etc/hosts

в /etc/hosts актуализируем данные, вбивая новый ip адрес

reboot

Переименовываем сервер opsi средствами opsi:

opsi-admin --no-depot -d method host_renameOpsiDepotserver opsiserver.domain.local opsiserver-2.domain.local

С сервера opsiserver-2.domain.local подключаем его к opsiserver.domain.local как depot:

opsi-setup --register-depot

Указываем имя основного сервера, к которому подключаем новый depot, администратора и пароль:

image

Здесь ничего менять не нужно:

image

Проследить, что все сделано правильно, можно в opsi-configed:

image

Далее надо настроить систему так, чтобы клиенты сами выбирали себе сервер depot. Выделяем всех клиентов и выставляем им dynamic depot. По умолчанию клиент смотрит на свой ip адрес и выбирает depot из своей сети.

image

Теперь настраиваем, чтобы все будущие клиенты сразу динамически выбирали depot:

image

Всё, на этом настройка нового сервера depot закончена, устанавливать opsi-client-agent для компьютеров в местной сети можно с него тем же скриптом, что и ранее мы устанавливали в основном офисе, не забыв сменить ip адрес внутри скрипта.

В каждом филиале ставим по контроллеру домена(можно Readonly), делаем свою адресацию сети, делим default-site внутри домена windows на подсайты, каждому из которых делаем свою subnet, свою групповую политику со своим скриптом установки opsi-client-agent.

Потом повторяем в новом филиале.

Я допил кофе и пошёл домой, а светодиод на сетевой карте сигнализировал о том, что новые и новые системы раскатывались под шум кулеров…

Update 1:
Как оказалось, скриптовать не обязательно, opsi-configed позволяет мышкой нащелкать пробуждение клиетов по шедулеру.
Tags:
Hubs:
Total votes 9: ↑9 and ↓0+9
Comments13

Articles