Сообщество - Лига Сисадминов

Лига Сисадминов

2 408 постов 18 930 подписчиков

Популярные теги в сообществе:

23

Российские ЦОД - отставание на поколение или куда ставить NVIDIA Grace Blackwell NVLink72

Для лиги лени: Презентованные еще в 2024 году системы для ИИ NVIDIA Grace Blackwell NVLink72 физически некуда ставить, да и не нужно, это не техника для среднего бизнеса.

Перед тем как перейти к NVIDIA Grace Blackwell NVLink72, начну, как всегда, слишком издалека.

Две недели назад вышло минимум две статьи:
РБК, за пейволлом: iKS-Consulting: в первом полугодии строительство дата-центров в России упало в три раза
Infox: Причины падения числа новых проектов ЦОД в России при росте спроса
И до того:
27.06.2025 Ведомости Данные отдаляются от центра
30.06.2025 Servernews: В деревню, в глушь, на север: московский регион страдает от дефицита мощностей ЦОД, но скоро операторы могут уйти в провинцию

Словарь
ЦОД: центр обработки данных. Специализированное здание, куда поставили действительно много компьютеров
Стойка, она же рек. Она же Rack Enclosure. Шкаф стандартной ширины в 19 дюймов для телекоммуникационного оборудования. Бывает разной высоты, в ЦОД ставят высотой 42 или 48 юнитов, и разной глубины – от 800 до 1400-1600 мм.
Есть еще стандарт Open Rack V3 — модульная система серверных стоек, разработанная в рамках Open Compute Project (OCP)
Юнит, он же монтажная единица -  типовой размер высоты для единицы оборудования  44,45 мм(1,75 дюйма). Оборудование бывает высотой 1,2, 3 .. и так далее юнитов. Для удобства монтажа высота унифицирована. Считайте как крепеж под полки в шкафу высверлен заранее.

История российских ЦОД, центров обработки данных

Исторически российские ЦОД начинались как три независимых направления.
Центры суперкомпьютеров. Это вычислительные центры немирного атома, ракетной техники, и вот этого всего. Потом к ним, ВНЕЗАПНО, подключилась и нефтяная отрасль, а потом и гидрометео и все остальные.

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

Гражданские узлы связи, то есть автоматические телефонные станции, АТС.

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

АТС изначально строились для достаточно «горячих» нагрузок, но ключевой момент не только в питании, но и в охлаждении.
С охлаждением все достаточно интересно. Воздух достаточно плохой теплоноситель, теплоемкость мала. У охлаждения водой есть свои минусы, прежде всего это сложность монтажа и демонтажа, протечки, требования к воде. Использовать хоть воду, хоть жидкий азот (как в серийных суперкомпьютерах Cray-2) для единичных проектов можно, для массовых неудобно (хотя IBM справляется).
Есть разница между сборкой водяного охлаждения "1 штука, дома" и "1 тысяча штук на ряд".

Поэтому если речь идет про массовые и дешевые АТС, и массовые и дешевые телекоммуникационные системы, выбор охлаждения воздухом очевиден.

Но при вменяемой скорости воздушного потока, когда воздух еще не отрывает детали и радиаторы от платы, и при вменяемом охлаждении воздуха на входе, или без дополнительного охлаждения воздуха, кубическим метром воздуха при его нагреве от +20 до +70 можно снять..
Посчитаем.

Теплоемкость кубометра воздуха составляет приблизительно 1,25 кДж/°С.
Сечение шкафа возьмем как квадратный метр, при фактических 482,6 мм на 1867 мм – 0.9 квадратного метра.
50 градусов на 1.25 Кдж на градус даст 62.5 кДж. 62 килоджоуля в секунду, это 62 киловатта снимаемой тепловой нагрузки на 42 юнита или примерно 1.5 киловатта на юнит при скорости потока 1 метр в секунду.
Только надо учитывать, что внутри сервера не все сечение занято «ничем», есть ограничения по размерам радиаторов, есть сами платы, конденсаторы, прочие элементы.
И есть ограничения по тепловому потоку микросхема – радиатор, радиатор – воздух.
70 градусов на выходе это достаточно горячо, потому что есть ограничения по температуре самого кремния. При температуре 100-120 градусов, для простых структур до 150 градусов Цельсия, проводниковые свойства кремния начинают меняться настолько, что для процессора это означает выход процессора из строя. При этом не надо забывать, что процессор имеет некоторую толщину, и теплопроводность самого кремния имеет пределы, и тепло нужно отводить из самого центра кристалла. Поэтому промышленность остановилась на лимите «90-95 градусов это предел для ядра». Физический предел чуть выше.
В итоге всех ограничений «для воздушного охлаждения» получается предел охлаждения около 500-700 ватт, может 1 киловатт, на средний сервер в 2 юнита высотой. Может чуть больше, если очень нужно.

Предел охлаждения воздухом может быть и в пару киловатт на юнит, но фактический предел существенно ниже.
Производители прямо пишут: предел для 2 процессорных систем для одного процессора – не более 190 ватт на сокет, сокетов в 2 сервере в 2 юнита обычно 2.
В итоге приходим к цифре около 0.5. 0.7 киловатт х 2 сервер в юнита х шкаф 48 юнитов – 12 киловатт.
У некоторых производителей  (вроде, та же Nvidia) были готовые шкафы «на 15 киловатт».
Существует 6 юнитовый ASrock 6U8X-EGS2 H100 и H200, на 4+4 блока питания по 3000 ватт
Внутри стоят NVIDIA® HGX H200 8-GPU with NVIDIA® NVSwitch™ - 8 штук по 350 ватт, 2.8 киловатта только на видеокарты. Получается киловатт примерно 6, на 6 юнитов.

Производители идут на разные ухищрения. Тут и подача воздуха чуть-чуть под давлением, и межстоечные кондиционеры, вдобавок к подаче холодного воздуха снизу, и снижение температуры воздух на входе, и подготовка воздуха до нужной влажности. Но слишком сухой воздух тоже вреден из-за накопления статики, и не только.
10-15 киловатт на шкаф остается разумным пределом. Больше можно, только шумно, не надежно (высокоскоростные вентиляторы стоят дорого, а ресурс не так велик), есть пределы скорости потока, есть ограничения по подключению пилотов Power Distribution Unit (PDU) внутри шкафа.

Вступает в силу «унаследованная архитектура» и экономика

Экономика говорит, что не все заказчики стоек в ЦОД требуют полной нагрузки, на все 10 киловатт.
А раз так, то можно ориентироваться на требования ГОСТ, который говорит, что есть ряд типовых сечений проводов и автоматом выключения, в частности 25, 32 и 40 ампер.
25 ампер при 230 вольтах – 5.7 киловатт
32 ампера при 230 вольтах – 7.3 киловатта
40 ампер при 230 вольтах – 9.2 киловатт

Поэтому часть стоек в ЦОД проектируют под «5 киловатт как  у дедов на шагово-координатных АТС», часть (значительно меньшую) под 10 киловатт.
Если у вас какое-то тяжелое (по мощности) оборудование, типа тяжелой IBM, то перед ее установкой поставщик проводит предварительное обследование – выдержат ли перекрытия эти 1.5 – 2 тонны, выдержат ли пути доставки (его еще и наклонять нельзя), что там с электропитанием и так далее. Про это давным-давно много и интересно писал Господин Инженер, кто хочет – почитает.

А раз так, то можно и нужно отводить не 10-12 киловатт тепла с стойки (а стоек на ЦОД может быть 2-3 тысячи), а 4-5. Это другие кондиционеры, другие системы, и все другое.
Разумеется, можно сразу планировать «на побольше», но выйдет «подороже». Там одного этиленгликоля 20-30 тонн на ЦОД, если не больше. Плюс электрическая мощность «на работу самих кондиционеров и насосов», плюс сами кабеля, Плюс стоимость подключения двух независимых веток внешнего питания, плюс стоимость батарей и инверторов для резервирования до пуска дизелей, плюс стоимость дизелей. Это все стоит денег, это все надо планировать, и для обычного ЦОД какой-то баланс необходим.

Ничего плохого в этом нет, обычная экономика и экономическое обоснование окупаемости.

В игру вступает NVIDIA Grace Blackwell NVLink72

Если посмотреть на документ от Supermicro NVIDIA GB200 NVL72 SuperCluster, страницу 4,
NVIDIA GB200 NVL72 Rack-Scale Configuration

то там все написано:
Сверху - 10 Compute Trays • 4x NVIDIA Blackwell GPUs per tray
В середине - Интерконнект
Внизу - 8 Compute Trays• 4x NVIDIA Blackwell GPUs per tray

Итого 18 по 4 - 72 GPUs -
GPUs 72x NVIDIA Blackwell B200 GPUs
CPUs 36x NVIDIA 72-core Grace Arm Neoverse V2
Supermicro 250kW capacity coolant distribution unit (CDU) with redundant PSU and dual hot-swap pumps
1.3MW capacity in-row CDU

В документе Supermicro NVIDIA GB200 NVL72 Datasheet указано и потребление. От 125 до 135 киловатт на стойку. Что не удивительно для 72 супер горячих GPU.

Есть решения попроще и постарше, например NVIDIA DGX B200. Потребление, а значит и нагрев, 14.3 киловатта на 10 юнитов.
Есть решение поновее, NVIDIA DGX B300. Те же 14 киловатт.

Есть и прочее горячее оборудование

Современные корпоративные SSD тоже греются, и греются весьма серьезно.
В ряде решений по хранению данных для расчета софт-рейда SSD нужна видеокарта. Греется.
Современные сетевые карты на 100\200\400 G греются.
Современные 100\200\400 G коммутаторы греются еще больше.

В общей массе "нагрузки вообще" таких конфигураций не так много, но они есть.
Ситуация осложняется тем, что заказчик иногда смотрит не на данные по стойке на PDU, особенно если у него не управляемые PDU, и не на показания из BMC сервера по потребляемой мощности, а на маркировку блока питания. На которой написано 1500 W, а таких блоков там два. Все, сервер потребляет 3000 ватт, при фактически потребляемых 300 ватт.

Некоторое теоретические отступление

С ростом технологий по поколениям, от паровой машины до лунного модуля Аполлон, требовала все более развитой стендовой базы.
Околозвуковые и сверхзвуковые самолеты потребовали сверхзвуковых аэродинамических труб.
Следующее поколение самолетов и двигателей к ним потребовало численного моделирования потока воздуха вокруг крыла, потока воздуха вокруг лопаток и прочего числового моделирования поведения газов, постройки вычислительных кластеров.

Технологии следующего поколения (это я про цикл про поколения техники) требуют вот таких монстров. Ничего, кстати, особенного - Cray-2 потреблял 200 киловатт.

И конечно это не техника для малого и среднего бизнеса и среднего ЦОД – в США ориентировочная стоимость комплекта была:

The estimates suggest a fully-loaded GB200 NVL72 server with 72 GB200 Superchips could fetch around $3 million

В РФ предлагают за 6.5 миллионов долларов.

Можно ли жить без такой техники?
Конечно можно.

Можно и пешком или на лошади спокойно добраться из Лефортово в Хамовники, как Гиляровский.
Можно долететь на кукурузнике (Ан-2) из Москвы в Владивосток? Можно, дальность Ан-2 в зависимости от нагрузки от 900 до 1200 км. Не так быстро и комфортно, как на Боинг или Эйрбас, но можно.
Можно ли считать газовую динамику, траекторию до Луны (и посадку в Луну с литосферным торможением) на технике из 70х-80х? Можно.

Немного математики или мнение про реальные причины низкого спроса на ЦОД

Сейчас 2025 год. 15 лет назад я убирал из стойки 6 (или 8?) юнитовый сервер IBM из 2000 года или около того. 2 процессора, целых 128 МЕГАБАЙТ памяти.
Заменял я его на виртуальную машину с 256 мегабайтами, а всего на физическом сервере было, кажется, 2 гигабайта.
На технике, которую коллеги и я ставили в 2020, было, кажется, уже по 768 Гб памяти. И это был «обычный такой сервер». 24 слота по 32 Гб памяти.
Сейчас есть и модули 128GB DDR4 ECC REG, и модули 256 ГБ DDR5 ECC RDIMM.
То, что в 2020 занимало две стойки, в 2025 занимает половину стойки. При цене аренды стойки в 100-150 тысяч рублей, или почти 2 миллиона в год, и жизненном цикле техники 5-7 лет, проще при следующей замене перейти (при определенном масштабе, конечно), от выделенной СХД на гиперскейлеры, поставить процессоры «подороже», и повысить плотность размещения на стойку раза в два. За 3 года окупится. Но такая техника требует уже не 5, а 7 киловатт, если плотно набивать, и таких стойко мест, и спроса на них не так много.

Литература
Supermicro NVIDIA GB200 NVL72 SuperCluster
Supermicro NVIDIA GB200 NVL72 Datasheet
NVIDIA DGX B200
NVIDIA DGX B300
Статистика и ЦОД: откуда берутся 5 кВт на стойку и почему это немало

Показать полностью
47

SSSD или приключения Linux в домене Windows (MS AD)

Для лиги лени: не все так просто и легко

Примечание: пост отличается особо мразотным и нечитаемым оформлением. Даже на уровне меня.

Часть 1. Немного теории или как работает Microsoft Windows Active Directory Domain Services (MS AD DS)
Часть 2. К практике. Подготовка
Часть 3. К практике. Начинаем медленно вводить. В домен
Часть 4. Но зачем это все, или возврат к теории
Часть 5. Лось Пользователь, просто пользователь

Часть 1. Немного теории или как работает Microsoft Windows Active Directory Domain Services (MS AD DS) и почему так.

Если пропустить все подпункты про открытые закрытые сертификаты, структуру хранения и репликации базы данных, роли, схемы, доверие, расширение схемы, атрибуты и так далее, вплоть до LDS, Extensible Storage Engine (ESE) и Joint Engine Technology (JET), то, для целей статьи, можно сократить описание до следующего:

В базе данных AD хранятся учетные записи и необратимо (или обратимо) зашифрованные пароли от учетных записей:

1. Пользователей

2. Компьютеров – членов домена. Мозгом домена являются контроллеры домена, Мегамозгом – носители ролей, Гипермегамозгом – носитель роли PDC.

И там же, в базе, хранятся все остальные сущности.

При добавлении компьютера в домен на нем магией Kerberos (или NTLM) для учетной записи SYSTEMOFTHISCOMPUTERNAME создается логин, пароль и дальше уже по учебнику.

Централизованная архитектура, вот это все.

Растет это все из принципа «все централизовано, все под контролем».

В противоположность этому, Linux вырастал из концепции «тут есть только я», то есть никакой централизации «из коробки», и есть только один root. Как следствие, в Linux из коробки управление пользователями и правами весьма отличается от Windows. Впрочем, для большей части задач этого достаточно, особенно если права пользователя в исполняемом приложении не те же самые, что права пользователя Linux.

Однако в некоторых сценариях возникает необходимость централизованного управления не только права внутри приложений, но и правами в самой ОС, и тут на помощь приходят SSSD, Winbind, realmd.

Раньше был Identity management for Unix/NIS, но он закончился.ся.

За деньги были PowerBroker Identity Services, Centrify Server Suite, Quest Authentication Services.

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

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

Ansible в чистом виде эту задачу не решает, FreeIPA не то чтоб популярна, хотя можно и ее использовать, если вы любите боль (и унижение), да и смысла в замена MS AD нет, если только не совсем угнетаться. Потому что Windows Standard стоит около 1100 $ на 16 ядер, и около 6200$ на Datacenter, что для организации не так дорого. Если у вас работники не за еду работают, конечно.

То есть проще купить, да и глобально Microsoft не так пристально следит за лицензированием, как Broadcom. Можно сказать, что вообще не следит, учитывая работу доменного центра лицензирования, когда ты, фактически, даешь Microsoft честное слово, что у тебя не будет намного больше того количества, что ты лицензировал. Software Assurance это просто удобно. Но, конечно, никто не мешает делать «только Linux», хотя так чаще говорят те, кто цены на RHEL \ Oracle Linux не видел.

Часть 2. К практике. Подготовка

Я развернул домен Windows Server 2025, это делается так же просто и легко, методом далее далее готово. Мне бы снапшот сделать, перед установкой, ну да переживу. На 2 ядрах и 6 Гб оперативки Windows 2025 + AD как-то живет, но немного грустит.

Развернул рядом новый Debian 12 с длинным именем Linux-with-long-name-199 и .. и сразу уперся в мелкие проблемы, которые на Windows давно решены из коробки, в том числе:

Для работы нужен ntp, но инсталлятор Debian предлагает при установке установить Gnome, KDE, ssh, web – но не предлагает выбрать ntp клиент. Из коробки стоит systemd-timesyncd, что видно по

timedatectl status, но sssd не предлагает сконфигурировать службу времени для работы с контроллером домена, надо конфигурировать вручную. Или опять Ansible (предпочтительнее, но это не предмет данной статьи)

Но пока вручную, отредактируем
nano /etc/apt/sources.list
и
nano /etc/network/interfaces

Эмуляция легаси в Linux

Создам юзера AlexanderPushkin, приделаю к нему сертификат, зайду в него, чтобы профиль точно был, и положу в профиль текстовый файл.
/usr/sbin/useradd -m AlexanderPushkin
Обожаю дебиан, что там пути по умолчанию в версии 12 так и не поправили.
passwd AlexanderPushkin
chown -R AlexanderPushkin:AlexanderPushkin AlexanderPushkin/.ssh/

прописываем ключи, не забывая (я постоянно забываю, еще один повод это делать в Ansible)
НЕ в формате ---- BEGIN SSH2 PUBLIC KEY ----
а в формате ssh-rsa (ключ)

Как же раздражает после перерыва то, что по умолчанию -
echo $SHELL == /bin/sh
вместо /bin/bash
и что надо делать
chsh -s /bin/bash
А то не будет ничего из .bashrc, ни echo $HISTSIZE, ни echo $HISTFILESIZE, ни echo $HISTFILE
Бесит, что надо как-то так.
/usr/sbin/useradd -m -s /bin/bash AlexanderPushkinTheSecond
passwd AlexanderPushkinTheSecond
mkdir /home/AlexanderPushkinTheSecond/.ssh
touch /home/AlexanderPushkinTheSecond/.ssh/authorized_keys
chown -R AlexanderPushkinTheSecond:AlexanderPushkinTheSecond /home/AlexanderPushkinTheSecond/.ssh
Или что-то такое, поправьте меня, если вдруг чего спутал.

Часть 3. К практике. Начинаем медленно вводить. В домен.

У нас есть два пользователя, AlexanderPushkin и AlexanderPushkinTheSecond
Можем ли мы создать пользователей с такими именами в AD?
AlexanderPushkin. Длина имени 16 символов, создается без вопросов.
AlexanderPushkinTheSecond. Длина имени 25 символов, и это длиннее SAM-Account-Name, у которого длина 20 символов.
Из AlexanderPushkinTheSecond получился SAM-Account-Name AlexanderPushkinTheS
Сомнительно ,но окей.

Начинаем подготовку к вводу в домен самого Linux сервера.

В всяких инструкциях прописана тонна всяких пакетов, но никакой расшифровки к ним. Список включает, но не ограничивается:realmd sssd sssd-tools libnss-sss libpam-sss adcli
или
realmd sssd-tools samba-common-bin samba-libs krb5-user adcli
или
realmd sssd-tools sssd libnss-sss libpam-sss adcli packagekit
или
realmd sssd sssd-tools libnss-sss libpam-sss packagekit oddjob oddjob-mkhomedir krb5-user adcli

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

Описания пакетов сделаны в том же самом виде, что и в классике, например, цитата:

PackageKit allows performing simple software management tasks over a DBus interface e.g. refreshing the cache, updating, installing and removing software packages or searching for multimedia codecs and file handlers.

Напомнило

«СЕПУЛЬКИ — важный элемент цивилизации ардритов (см.) с планеты Энтеропия (см.). См. СЕПУЛЬКАРИИ».

«СЕПУЛЬКАРИИ — устройства для сепуления (см.)».

Я пойду другим путем, вообще ничего ставить не буду!

Найти детальное описание «что нужно сейчас и почему», это подвиг сложнее, чем накормить кота таблеткой.

realmd как интерфейс к sssd понятен. sssd-tools – уже не так понятен. krb5-user понятно, но его перечисляют не везде.

Подготовительные работы

В первую очередь необходимо вручную заменить thishostname на hostname.mydomain.domain
или, в моем случае,
hostname Linux-with-long-name-199.win2025.mydomain
Затем поправить /etc/hosts , и наконец сделать
apt install realmd

И проверить что вышло
Делаю realm discover и получаю bash: realm: command not found

КАК ЭТО ВОТ ТАК ? Проклятый Debian, почему там пути то не прописали.
/usr/sbin/realm discover работает, с сообщением realm: No default realm discovered
realm discover win2025.mydomain –verbose выдает realm: No such realm found

Почему?
потому что я не настраивал DNS, а в /etc/resolv.conf прописался DHCP сервер еще с момента установки.
dig @192.168.122.250 win2025.mydomain – работает, но в целом работа службы DNS в Linux, или в Debian, в случае если первый сервер сказал «ну я даже и не знаю», без попытки спросить второй сервер в списке тоже с непривычки может вызывать ряд проблем.

Если все настроить правильно, то команда
/usr/sbin/realm discover win2025.mydomain

Должна вернуть список пакетов:
win2025.mydomain
type: Kerberos
realm-name: WIN2025.MYDOMAIN
domain-name: win2025.mydomain
configured: no
server-software: active-directory
client-software: sssd
required-package: sssd-tools
required-package: sssd
required-package: libnss-sss
required-package: libpam-sss
required-package: adcli
required-package: samba-common-bin

Значит,

apt install realmd sssd sssd-tools libnss-sss libpam-sss adcli samba-common-bin

Пакета krb5-user в списке нет, и это странновато.

Отредактируем /etc/realmd.conf
nano /etc/realmd.conf

И внесем туда
[active-directory]
os-name = Debian GNU/Linux/PikabuTest
os-version = 12.0 (Bookworm)/or Windows
computer-ou = ou=LinuxServer,DC= win2025,DC=example

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

Пробуем.
/usr/sbin/realm --verbose join win2025.mydomain -U Administrator

И пааалучаем воооот такую на воротник!
realm: Couldn't join realm: Necessary packages are not installed: sssd-tools sssd libnss-sss libpam-sss adcli

Эта же ошибка была в Ubuntu 16, сколько лет прошло.

Делаем
/usr/sbin/realm --verbose join win2025.mydomain -U Administrator --install=/
запускаем, получаем на воротник еще раз:
Failed to join the domain
realm: Couldn't join realm: Failed to join the domain

При этом, не смотря на прописанный в /etc/realmd.conf параметр для OU, учетная запись все равно создалась в OU по умолчанию, COMPUTERS в моем случае, да еще и с именем LINUX-WITH-LONG

15 символов для PC name, это лимиты Netbios, и не болейте.
DNS имя при этом правильное, linux-with-long-name-109.win2025. mydomain
И остальные параметры взяты из файла правильно. Только OU не тот.

При этом, если бы я, как нормальный человек, сделал отдельную учетную запись для ввода в домен с правом создания компьютеров только в этом OU, то получил бы и ошибку, и крики «да у нас все настроено правильно», со стороны «средней» Linux команды.

К счастью, на текущем месте работу у нас вменяемая и команда CI\CD, и команда Linux, и команда windows.

Точнее, это одна команда со специализациями внутри команды.

Давайте разбираться.

В примере выше я написал:

computer-ou = ou=LinuxServer,DC= win2025,DC=example
Это, конечно, неправильно -
computer-ou = ou=LinuxServer,DC= win2025,DC= mydomain

В конфиге я это исправил (а в тексте – нет), но зато в конфиге я сделал другую ошибку. В читаемом тексте это так сразу и не видно, но там
computer-ou = ou=LinuxServer,DC=(пробел)win2025,DC= mydomain

Окей,
realm leave ad.example.com -U 'AD.EXAMPLE.COM\user' то есть
realm leave win2025. mydomain -U ' win2025. mydomain\Administrator'

Напоминаю, что учетную запись администратора домена для таких задач в рабочей среде использовать нельзя, необходимо создать отдельную учетную запись и делегировать ей права на создание и удаление записей в выделенной OU. Исключения: МТС и Аэрофлот, там все равно делают что угодно, кроме безопасности.

Но с точки зрения Linux – она не в домене, хотя УЗ сервера и создалась. Поэтому просто удалю созданную УЗ в домене, поправлю /etc/realmd.conf, создам УЗ в с правом создания УЗ типа компьютер в этой OU (как надо было с самого начала) и попробую еще раз.

делегирование сложности не составляет, даже ссылку не буду приводить, сделал один раз из GUI, с результатом:

They have the following permissions: Full Control
For the following object types: Computer

Пометка. Я всего один раз видел как ЭТО переведено, и навсегда отказался иметь дело с русифицированным Windows.

Снова делаю
/usr/sbin/realm --verbose join
Иииии вижу

Found well known computer container at: CN=Computers, DC=win2025,DC= mydomain
и, очевидно, получаю опять на воротник!

Insufficient permissions to join the domain
realm: Couldn't join realm: Insufficient permissions to join the domain

Параметр OU (Organizational Unit или specified subtree в терминах RH) можно указать и в командной строке:

--computer-ou="ou=Linux Computers,dc=domain,dc=com", и я так и попробую, но хотелось бы разобраться, что не так.

/usr/sbin/realm --verbose join win2025.mydomain -U LinuxAdmin --install=/ --computer-ou=" ou=LinuxServer,DC=win2025,DC= mydomain

Calculated computer account: CN=LINUX-WITH-LONG,OU=LinuxServer,DC=win2025,DC=mydomain

И все заработало, вот только что это – ВСЕ ?

Попробую для начала удалить это все штатно:
/usr/sbin/realm --verbose leave
И Linux 5 минут висит на операции:
Sending NetLogon ping to domain controller
и еще 5 минут на операции:
Couldn't perform discovery search: Can't contact LDAP server
Received NetLogon info from:dc1.win2025.mydomain

И в итоге:
Process was terminated with signal: 13
Successfully unenrolled machine from realm

Но запись в AD осталась. Вот такой успешный успех.
Удалил из AD руками, что еще сделать остается.

Исправляю ошибку в конфиге выше
Еще одна не замеченная ошибка. В каком-то примере (вот в этом - realmd) настройка в /etc/realmd.conf  приведена как:

[active-directory]
default-client = sssd
и вот в этой статье (Подключение Debian GNU/Linux 12 (Bookworm) к домену Active Directory с помощью SSSD и настройка PAM для доменной аутентификации и авторизации в SSHD) схоже.
У RH в то же время эта настройка приведена как
[ad.example.com]
а в статье Подключаемся к Active Directory с помощью realmd – как
[example.org]
Надо было не читать статьи по верхам, а читать документацию. Читать Debian Manpages  REALMD.CONF(5) если быть точнее.

Почему так? Потому что надо было не читать статьи по верхам, а читать документацию. Читать Debian Manpages REALMD.CONF(5) если быть точнее.

Опция [active-directory]
These options should go in an [active-directory] section:
default-client
use-ldaps
os-name
os-version

Опция [domain.example.com]
For example for the domain.example.com domain the section would be called [domain.example.com]
computer-ou
computer-name
user-principal
automatic-join
automatic-id-mapping
manage-system

И в таком виде оно работает

[active-directory]
os-name = Debian GNU/Linux/PikabuTest
os-version = 12.0 (Bookworm)/or Windows

[win2025.mydomain]
computer-ou = OU=LinuxServer,DC=win2025,DC=mydomain

Часть 4. Но зачем это все, или возврат к теории

Для чего надо вводить компьютер в домен?
С точки зрения домена Windows – чтобы управлять объектом «компьютер» через Desired State Configuration (DSC), и (или) через Group Policy.
С точки зрения управления пользователями – чтобы иметь единую базу конфигураций пользователей, и использовать хотя бы систему account, global, domain local – AGDLP.
Но тут мы пропустим пре-авторизацию в AD(Kerberos Pre-Authentication – или просто pre-authentication по другой статье), и перейдем к вопросу «как и зачем».

Что нам нужно? Авторизовать ПОЛЬЗОВАТЕЛЯ, а точнее аутентифицировать пользователя, получить перечисление его участия в группах AD\LDAP, и по этому списку авторизовать, то есть выдать ему нужные права на конечном сервере или сервисе. Классическое Authentication, authorization, and accounting (AAA).
И еще, для целей безопасности, нужно вовремя отзывать Ticket-Granting Tickets. И немного знать не только про Golden Ticket и Silver Ticket ,но и про privilege::debug.
И знающие люди тут же напомнят, что, хотя срок жизни TGT – 1 час плюс минус, но срок жизни Ticket-Granting Service (TGS) – 10 часов.

Поэтому все эти авторизации для сервера это хорошо, а как закрывать сессии у отозванных пользователей? Для Windows можно настроить GPO на автоматический выход, можно проверить список сессий и лишние закрыть, а для Linux системы придется держать отдельный склад костылей для проверки всех серверов и не закрытых пользовательских сессий.

Но это все в следующей части, которую, я надеюсь, кто-то уже написал. Шуйский, Курбский, вы когда закончите с etcd, может уже сами что-то напишете?

Но, к делам.

Часть 5. Лось Пользователь, просто пользователь

Напоминаю, что у нас были два локальных пользователя: AlexanderPushkin и AlexanderPushkinTheSecond

Вместо них у нас появляется два доменных пользователя:
AlexanderPushkin@win2025.mydomain и AlexanderPushkinTheSecond@win2025.mydomain

Инструкция говорит про:
Configure the /etc/krb5.conf file to use the Active Directory realm.
Set the Samba configuration file, /etc/samba/smb.conf, to point to the Windows Kerberos realm.

Какая-то явно старая инструкция, с строками
Make sure that the Services for Unix package is installed on the Windows server.
Unix package уже давно не существует. Инструкция от RH 6, текущая версия IBM RH – 10.
Когда же мы, наконец, дойдем до статьи Using Active Directory to Authenticate Linux Users, где в три раза короче написано то же, что и в других статьях, и проверим что там в
/etc/sssd/sssd.conf

в том числе по умолчанию -
fallback_homedir = /home/%u@%d

И попробуем.
/usr/sbin/realm list – окей, результаты есть.
/usr/bin/getent passwd AlexanderPushkin - – окей, результаты есть.
/usr/bin/getent passwd AlexanderPushkin@win2025.mydomain – не окей, результатов нет. Вообще ничего нет.
/usr/bin/getent passwd administrator@win2025.mydomain - не окей, результатов тоже нет.

Почему - остается только гадать. Нет вывода отладки.
Одни и другие пишут, что ldap_id_mapping = True
другие, что ldap_id_mapping = false

Но при этом, если попытаться залогиниться как AlexanderPushkinTheSecond@win2025.mydomain, то в логе контроллера AD проскочит запрос с event ID 4768 - A Kerberos authentication ticket (TGT) was requested для LINUX-WITH-LONG$

Можно конечно сделать на контроллере домена
nltest /dbflag:0x2080ffff

И посмотреть в отладку, хотя это и не случай отлова Zerologon для CVE-2020-1472.

делать я так, конечно, не буду. И так на написание заметки потрачено больше стандартного получаса.

/usr/bin/id AlexanderPushkinTheSecond – результаты есть
/usr/bin/id AlexanderPushkinTheSecond@win2025. mydomain – результаты есть, и даже список групп есть.
/usr/bin/id Administrator@win2025.mydomain – результаты есть, и даже список групп есть.

Как это так вообще работает ? Кто ни разу не входил, тому getent passwd не положен, так чтоли?

Так и есть. Цитата

Используя команды getent passwd и getent group нельзя увидеть доменных пользователей и группы. Этот функционал отключен по умолчанию, для того чтобы сократить нагрузку на серверы.

Документация к Альт линукс.

После первого входа getent passwd начинает работать и что-то показывать, но.
Поскольку я не прописывал pam-auth-update --enable mkhomedir , то и домашняя директория не создалась
В /etc/sssd/sssd.conf прописан fallback_homedir = /home/%u@%d , но автоматом все равно ничего не сделалось.

Зато я могу спокойно читать файлы из
/home/AlexanderPushkin и /home/AlexanderPushkinTheSecond
Но из /home/user не могу. Очень, очень странное поведение, как по мне.

Заключение

Дальше надо перечитывать и пробовать сделать все по статье Разграничение прав доступа к Linux-системе и её сервисам через доменные группы безопасности с помощью SSSD и PAM

Но я хотел сказать совсем другое.

Сделать авторизацию пользователей через AD и SSSD можно, и кто-то делает. Однако, если делать «в лоб» и ничего не проверять, то можно получить проблемы с безопасностью больше, чем было «до введения авторизации».

Отдельно надо отметить проблемы с авторизацией не в ssh, а внутри самих сервисов, то есть придется переписать «все вообще», особенно если у вас по каким-то легаси причинам много завязано на доменных или локальных пользователей.

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

Все что выше, теоретически и практически, можно и нужно автоматизировать через тот же Ansible. Команды понятны, скрипты ясны.

Automating the Process of Joining Linux Systems to an AD Domain using Ansible and SSSD
riponbanik/ansible-role-domain-join
Ansible Playbook to Join Ubuntu/Debian to Active Directory Using Realmd

Плюсы: Система, в целом, скорее работает, чем совсем не работает. Тем более в совсем простых сценариях.

Минусы: Для первичной настройки и описания надо потратить пару дней, потом еще пару дней на проверку. И все равно в чуть более сложных сценариях будет глюки. Особенно, если надо обязательный Kerberos, и никакого NTLM, если везде LDAPS, или если уровень вложенности групп чуть больше чем 1 юзер – 1 группа, или если прописаны сценарии ограничения входа на уровне AD по времени и списку серверов, итд, итп.

Документация есть, но стандартные сценарии описывают «как делать», не описывая «почему надо так, и как не надо, и что будет, если делать не как надо». Стандартные сценарии очень скупо описывают отладку «что может пойти не так».

И это решение, с централизованным управлением пользователями, не решает задач безопасности, то есть отключение в AD «типа вредоносного пользователя» не приводит к мгновенному выходу «везде». В Windows, впрочем, тоже.

Литература
Active Directory Domain Services overview
What is Active Directory? The Ultimate AD Tutorial
Configuring Microsoft Entra ID to provision users into an LDAP directory for Linux authentication
Как настроить SSH-ключи в Debian 11
How to Set Up SSH Keys on Debian 11
[Article] NTLM vs KERBEROS
Подключаемся к Active Directory с помощью realmd
Как ввести Debian в домен Windows (Active Directory) с помощью realmd, SSSD.
Debian man REALMD.CONF
Подключение Debian GNU/Linux 12 (Bookworm) к домену Active Directory с помощью SSSD и настройка PAM для доменной аутентификации и авторизации в SSHD
Разграничение прав доступа к Linux-системе и её сервисам через доменные группы безопасности с помощью SSSD и PAM
Restrict the set of groups the user is a member of with SSSD
Reddit: Realmd/SSSD on Ubuntu - Configuring Auth to AD, Running into AD groups issue
Reddit: SSSD: realmd vs adcli
Reddit: What is it called when an AD account gets "signed out" everywhere and the user has to sign back in again?

RH8 Chapter 1. Connecting RHEL systems directly to AD using SSSD
RH7 3.4. Discovering and Joining Identity Domains - Joining a Domain
RH7 3.5. Removing a System from an Identity Domain
RH7 3.9. Additional Configuration for the Active Directory Domain Entry
RH7 7.4. Additional Configuration for Identity and Authentication Providers
RH6 13.2.14. Configuring Domains: Active Directory as an LDAP Provider (Alternative)

Using Active Directory to Authenticate Linux Users

RedOS 2.9.20.6 Сравнение функций Winbind и SSSD
Astra Сравнение winbind и sssd
Документация к Альт линукс.

Показать полностью 2
7

А давайте встроим ии в powershell. Начало работы с MS AI Shell в PowerShell

В прошлом посте А давайте встроим ии в powershell. Часть вторая. Поисковик спецификаций мы научились работать с gemini-cli. Сегодня я познакомлю вас с инструментом от Microsoft.

AI Shell — инструмент от Microsoft, созданный для упрощения работы с PowerShell. Он интегрируется прямо в командную строку и использует языковые модели Microsoft (Phi, Copilot) на базе Azure AI, чтобы помогать находить команды, исправлять ошибки. и понимать вывод.

Установите модуль AI Shell из PowerShell Gallery.
Install-PSResource -Name AIShell -Preview

Запуск оболочки ИИ

Используйте Start-AIShell команду в модуле AI Shell , чтобы открыть расширенный интерфейс в Терминале Windows. При запуске AI Shell появится запрос на выбор агента.

Использование ai Shell

Прежде чем использовать агент Azure OpenAI, необходимо создать конфигурацию, содержащую конечную точку, ключи API и системный запрос. Запустите AI Shell, выберите агент и запустите /agent config. В открываемом файле конфигурации JSON необходимо указать конечную точку, имя развертывания, версию модели и ключ API. Вы можете настроить свойство системного запроса, чтобы лучше заземлить модель в конкретных вариантах использования, включенная по умолчанию для эксперта PowerShell. Кроме того, если вы хотите использовать OpenAI, вы можете настроить агент только с ключом API из OpenAI в закомментированных примерах в JSON-файле.

Агент Azure предназначен для непосредственного подключения Copilot в Azure к командной строке. Она предоставляет помощь по командам Azure CLI и Azure PowerShell. Чтобы использовать этот агент, необходимо войти в Azure с помощью команды az login из Azure CLI.

Использование AI Shell для взаимодействия с агентами

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

Агент Azure OpenAI

  • «Как создать текстовый файл helloworld в PowerShell?»

  • «Какова разница между параметром и параметром в PowerShell?»

  • Как получить первые 10 самых интенсивных процессов ЦП на компьютере?

Copilot в агенте Azure

  • «Как создать новую группу ресурсов с помощью Azure CLI?»

  • «Как вывести список учетных записей хранения, которые у меня есть в Azure PowerShell?»

  • «Что такое Application Insights?»

  • «Как создать веб-приложение с помощью Azure CLI?»

Ниже приведена краткая демонстрация, показывающая агент Azure в действии:

Переключение агентов

Вы можете переключаться между агентами с помощью синтаксиса @ в сообщениях чата. Например

Вы также можете использовать команду чата для переключения агентов. Например, чтобы переключиться на агент openai-gpt, используйте /agent use openai-gpt.

Команды чата

По умолчанию aish предоставляет базовый набор команд чата, используемых для взаимодействия с моделью ИИ. Чтобы получить список команд, используйте команду /help в сеансе чата.

Вставка кода

При чате с агентом можно использовать команду /code post для автоматического вставки кода из ответа в рабочую оболочку. Это самый простой способ быстро получить код, который необходимо запустить в оболочке. Вы также можете использовать горячий ключ CTRL+d, CTRL+d для вставки кода в рабочую оболочку.

Ключевые привязки для команд

AI Shell имеет ключевые привязки для команды /code. В настоящее время привязки ключей жестко закодируются, но пользовательские привязки ключей будут поддерживаться в будущем выпуске.

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

Устранение ошибок

При возникновении ошибки в рабочем терминале можно использовать командлет Resolve-Error для отправки этой ошибки в открытое окно оболочки ИИ для разрешения. Эта команда запрашивает модель ИИ, чтобы устранить ошибку.

Вызов оболочки ИИ

Командлет Invoke-AIShell можно использовать для отправки запросов текущему агенту в окне открытого окна оболочки ИИ. Эта команда позволяет взаимодействовать с моделью ИИ из рабочего терминала.


Серия «Философия PowerShell»

Полезно? Подпишись.
Понравилось — ставь «+»
Задавай вопросы в комментариях 👇👇👇
Удачи! 🚀

Показать полностью 9
10

Не очень скромное напоминание про сентябрьские обновления Windows

Если вы вдруг пропустили, то вышли:

KB5064401 Cumulative Update for .NET Framework 3.5 and 4.8.1 for Windows 11, version 24H2 and Microsoft server operating system version 24H2
KB5065426 (OS Build 26100.6584) – Для Windows 11 и Windows server 2025 (Microsoft Server Operating System-24H2)

И все остальные:
KB5065428 2025-09 Cumulative Update for Windows Server 2019 for x64-based Systems
KB5065432 2025-09 Cumulative Update for Microsoft server operating system version 21H2 for x64-based Systems
KB5065769 Windows Server 2022 servicing stack update

Остальное старье сами найдете, если до сих пор не ушли с 2008/2012 (поддерживается, но очень дорого) или 2016 сервера.

Как пишут:

41 Elevation of Privilege Vulnerabilities
2 Security Feature Bypass Vulnerabilities
22 Remote Code Execution Vulnerabilities
16 Information Disclosure Vulnerabilities
3 Denial of Service Vulnerabilities
1 Spoofing Vulnerabilities
Two publicly disclosed zero-days fixed

Особенно хорошо напомнить тем, кто страдает склерозом, про вот это:

CVE-2025-55234 - Windows SMB Elevation of Privilege Vulnerability
Microsoft fixed an elevation of privileges flaw in SMB Server that is exploited through relay attacks.

Дежурное напоминание: сертификаты не забываем, не забываем сертификаты!
Windows Secure Boot certificate expiration and CA updates

Примечание

Опять управление AD пересунули, теперь пуск - Windows Tools , который ведет в Control Panel\All Control Panel Items\Windows Tools

Сколько можно, доколе это терпеть!

Ссылки
Microsoft September 2025 Patch Tuesday fixes 81 flaws, two zero-days

Показать полностью
12

Новые кадровые вызовы и риски для оставшихся в РФ филиалов

Для лиги лени: новые инициативы правительства РФ делают работу «из РФ с миром» не сложной, но непредсказуемой.

Я тут внезапно для себя узнал (я слоупок), что теперь «из мира в РФ» не работают голосовые вызовы:
Telegram, Whatapp, Google meeting.
Zoom и Teams пока не проверял. Zalo в РФ не популярен. WeChat в РФ тоже мало используется.
Viber жив ли? Давно о нем не слышал.

Пока внутри РФ работает разный self-hosting  XMPP, и внутри российские приложения типа сбербанка и яндекса. Нет никаких гарантий, что из этого будет работать, и что из этого будет работать между РФ и остальным миром. Наверное, WeChat будет работать, но даже это не точно.

Ирония не в том, работает ли эта связь внутри РФ. Ирония в том, что эти ограничения работает \ не работает – не предсказуемы, это черный ящик. Даже когда в июне 2025 «как-то сломались» сервисы банков, включая Сбербанк, вопрос «что это было» спустили на тормозах. В частных разговорах все участники кивают на «вы сами знаете», но подход остается тот же, «да, сломали, и что вы нам сделаете».
Ситуация дошла до того уровня, который я с коллегами обсуждали еще в 2014 –сделать «черные» списки не выйдет. Будут «белые» списки, которые будут временами ломаться.
Так и вышло.
Официально есть белый список, который может быть будет работать внутри РФ –

Минцифры определило, какие сайты будут работать при отключениях интернета. Как сообщили источники РБК, туда вошли госсервисы, маркетплейсы, онлайн-карты, банковские сервисы и др.

Интересно и то, что:

Ранее в пятницу, 5 сентября, министерство опубликовало в своем телеграм-канале сообщение, где говорится, что перечень сформировали «на основе рейтинга наиболее популярных интернет-ресурсов России».

Почему это в телеграм канале?
Еще недавно эти люди его же блокировали, что же поменялось?
Почему не в VK мессенджере или максе?
Но это просто так интересно, даже не потому, что Дуров так и не вернул стену.

Итого
Пропущу вопрос с деньгами, пусть про это болит голова у финансов.
Получается, что немногочисленный «уже не наш, но раньше наш» филиал в любой момент может оказаться без доступа к внутренним системам, базе знаний, прочим сервисам. Включая видеосвязь и трекер.
С AAA проблем нет, у них развернут RO контроллер домена, и AAA (authentication authorization and accounting ) будет работать. Но все остальное это некоторая головная боль, и она не решает проблем с введением «белых списков».
В таких условиях я не удивлюсь, если прикинув «риски», окажется что финансам проще уже сейчас объявить о сокращении российского филиала, с уведомлением всех за три месяца.

PS. Параноикам на заметку.
В США уже пять лет существует проект Meshtastic, и к нему LILYGO® T-Deck. Я не удивлюсь, если схожий проект развернут в РФ, только не совсем для того, чтобы параноики гоняли по нему треды в стиле фидо. Но для вот такого тихого бизнеса.

Показать полностью
16

Вспоминаем Powershell в нескольких частях. Часть 4. Параллельное исполнение: Powershell jobs

Для ЛЛ: серия пометок по костылям

Конечная цель серии постов: написать свой очень маленький и очень кривой WSUS, поскольку развития WSUS больше не предвидится, но я про это писал
Часть 1. База из баз. Теория
Часть 1.1 Зачем ставить обновления на Linux и Windows и куда угодно, если в отделе работают проверенные электроником сотрудники, и все работает?
Часть 1.2 Чем плох WSUS, SCOM, прочее ПО, и факты в Ansible?
Часть 1.3 Почему Powershell, а не Python?
Часть 1.4 Прочие базовые вещи
Часть 1.5 Классы и объекты, для тех, кто пропускал школу
Часть 1.6 К теме обновлений в Windows
Часть 1.7 Как это все хранить и обрабатывать?
Часть 1.8 Давайте начинать. Мой первый класс
Часть 1.9 Немного магии, не очевидной с первого раза
Часть 1.10 Мой первый массив
Часть 1.11 Суй массив в файл. И забирай из файла
Часть 1.12 Теперь все вместе

Часть 2. Windows update
Часть 2.1 Служба обновлений и ее журнал
Часть 2.2 Настраиваем удаленный доступ
Часть 2.3 Ловим исключения
Часть 2.4 Проблема слишком больших прав
Часть 2.5 Разрешение удаленного подключения
Часть 2.6 Параллельная обработка задач, -parallel,  powershell jobs, Runspaces
Часть 2.7 И, наконец, получим первый список
Часть 2.8 Итого

Часть 3. Обрабатываем, что получилось
Часть 3.1 Немного про общую логику
Часть 3.2 В предыдущих сериях
Часть 3.3 Обновление списка обновлений
Часть 3.4 Обрабатываем оба списка сразу – список обновлений и список с сервера
Часть 3.5 Осталось только выгрузить в Excel
Часть 3.6 Отладка и наладка
Часть 3.7 Альтернативы?


Часть 4. Параллельное исполнение: Powershell jobs
Часть 4.1 Почему Powershell jobs
Часть 4.2 Руководство
Часть 4.3 Переходим к примерам Powershell jobs
Часть 4.4 Переходим к практике Powershell jobs

Часть 4. Параллельное исполнение: Powershell jobs

Часть 4.1 Почему Powershell jobs

У Powershell есть несколько вариантов параллельного исполнения кода.
Первый и наиболее известный, это Foreach-Parallel
Второй - Start-Job и Start-ThreadJob

В чем минус Job ? Это параллельное исполнение скрипта, из результатов которого еще и надо задачу получить. Плюс, точнее минус, этому процессу сложно отдавать какой-то объект для исполнения, у него непривычная схема того, что ему можно отдать на вход. То, что в руководстве описано как «Example 10: Use the ArgumentList parameter to specify an array»

В чем плюс? Сохраняется читаемость, в моем случае. Я ж не настоящий программист.

Часть 4.2 Руководство
В руководстве написано крайне .. плохо -
Start-Job -ScriptBlock
и дальше пишите себе что хотите.
но ScriptBlock это крайне, крайне неудобно, если не читать описание:

$a = { Get-Service BITS }
Invoke-Command -ScriptBlock $a

То есть, скриптблок можно описать почти как функцию

Like functions, script blocks can include the dynamicparam, begin, process, and end keywords

только есть нюансы.

Часть 4.3 Переходим к примерам Powershell jobs

Пример


$PfadZurSpeicherdatenbank = $PSScriptRoot
$Skriptversion = "12"
$Block1 =
{Get-ChildItem}

Start-Job -ScriptBlock $Block1 -Name JobExample01
Start-Job -ScriptBlock $Block1 -Name JobExample01 # это повтор строки и так надо для примера
Get-Job
Get-Job -Name JobExample01
Receive-Job -Name JobExample01

Обратите внимание на параметры  State и HasMoreData
Get-Job | Select Id, Name, PSJobTypeName, State, HasMoreData 
Get-Job | Select Id, Name, PSJobTypeName, State, HasMoreData | format-table

Сделайте
$Data2 = Receive-Job -Name JobExample01
$Data2

Обратите внимание.
Я запросил итоги задачи «-Name JobExample01». Таких задач в списке должно быть две,
и в переменную попали оба вывода, от двух задач с разными ID и одинаковыми именами. ID уникален, имя – нет, зато имя можно генерировать.

Теперь сделайте все что выше в виде одного скрипта, и удивитесь – в вывод $Data2 не попало ничего. Хотя задачи в списке есть. Но вывод из задачи со статусом Completed и HasMoreData = False вы уже получили, а вывод из задачи, которая еще выполняется (Running), хотя данные из нее еще не получали, но HasMoreData  =True.

Удалим все задачи.

Get-Job | Remove-Job

Чтобы перейти дальше, сделаем еще один пример из руководства:

$a ={ param($p1, $p2)
"p1: $p1"
"p2: $p2"}

&$a -p2 "First" -p1 "Second"

И примеры не из руководства: пример 1

$Job02 = {
param ($Out500001)
write-host "JB1" $Out500001}

Start-Job -ScriptBlock $Job02 -ArgumentList "ABC123"
Start-Sleep 5; Get-Job ;
Get-Job | Receive-Job
Get-Job | Remove-Job

И примеры не из руководства: пример 2

$Job03 = {
param ($Out500001)
foreach ($Job03data in $Out500001){
write-host "JB3" $Job03data}}

$Job03Array = (1,2,22)
Start-Job -ScriptBlock $Job03 -ArgumentList $Job03Array
Start-Sleep 5;
Get-Job | Receive-Job

И примеры не из руководства: пример 3

$Job04 = {
param ($Out500001)
foreach ($Job03data in $Out500001){
write-host "JB4" $Job03data}}

$Job03Array = (1,2,22)
Start-Job -ScriptBlock $Job04 -ArgumentList  (,$Job03Array)
Start-Sleep 5;
Get-Job | Receive-Job

И примеры не из руководства: пример 4

$Job05 = {
param ($Input01, $Input02)
write-host "JB5-1 " $Input01
write-host "JB5-2 " $Input02}

Start-Job -ScriptBlock $Job05 -ArgumentList ("A123", "B456")
Start-Sleep 5;
Get-Job | Receive-Job

Тут стоило описать, как использовать именованные переменные \ параметры, но я не стал. Вроде можно. Но мне не очень нужно.
Выводы из увиденного в примерах предлагается сделать самостоятельно

Часть 4.4 Переходим к практике Powershell jobs

И теперь делаем все сразу!

$PfadZurSpeicherdatenbank = $PSScriptRoot
$Skriptversion = "12"
$MeineErsteSicherungsdatei = $PfadZurSpeicherdatenbank + "\" + "nur-eine-datei-part12.xml"
$Fehlermeldung01 =  "Achtung, da ist etwas schiefgelaufen"

if (Test-Path $MeineErsteSicherungsdatei){$NewKeinArray = Import-Clixml -Path $MeineErsteSicherungsdatei}
else {Write-Host $Fehlermeldung01}

$MeineErsteLogin = $PfadZurSpeicherdatenbank + "\" + "dieparole.txt"
$DasPasswordFileExist  = Test-Path -Path $MeineErsteLogin
if ($DasPasswordFileExist -eq $false) {$DieParole = Get-Credential
Export-Clixml -Path $MeineErsteLogin -InputObject $DieParole}
else {$DieParole = Import-Clixml $MeineErsteLogin}

$MeineServerliste = @("192.168.122.250","192.168.122.251")
# $DataRemote1 = Get-HotFix -ComputerName $MeineServerliste[0] -Credential $DieParole

$Rn = Get-Random -Minimum 1 -Maximum 200
$NameRn = "JobExample12" + $Rn
$Block2 = {
param ($ServerAsParam, $CredentialsAsParam)
$DataInBlockRemote1 = Get-HotFix -ComputerName $ServerAsParam -Credential $CredentialsAsParam
Return $DataInBlockRemote1}

Start-Job -ScriptBlock $Block2 -ArgumentList ($MeineServerliste[0], $DieParole)  -Name $NameRn
Start-Sleep 5;
$DataInBlock = Get-Job -Name $NameRn| Receive-Job

Заключение

На этом как бы все. Все необходимые элементы для своего личного костыля, если он вам действительно нужен, у вас есть.

Литература
Как использовать циклы While и Foreach в Powershell Foreach на примерах
Running ForEach in parallel on Windows Powershell 5 (and older)
about_Foreach
about_Foreach-Parallel
Optimize performance using parallel execution
Работа с фоновыми процессами через Jobs в Powershell
Named Arguments for PowerShell Functions: Best Practices
PowerShell background jobs unlock scripting performance
about_Script_Blocks
PowerShell Tip –> Passing array as an argument to a Job/ ScriptBlock
Возврат значения из powershell invoke-command агенту SQL-Server

Показать полностью
18

Вспоминаем Powershell в нескольких частях. Часть 3. Обрабатываем, что получилось

Для ЛЛ: серия пометок по костылям

Вместо предисловия.
Недавно от бабки в поликлинике узнала, что творог опасен. «У знакомой внук дураком сделался через него. Его творогом кормили, от кальция родничок рано зарос, а мозг продолжал расти, и теперь он в ынторнэтах сидит, кнопки нажимает».
Тут много таких, творогом покалеченных

Конечная цель серии постов: написать свой очень маленький и очень кривой WSUS, поскольку развития WSUS больше не предвидится, но я про это писал
Часть 1. База из баз. Теория
Часть 1.1 Зачем ставить обновления на Linux и Windows и куда угодно, если в отделе работают проверенные электроником сотрудники, и все работает?
Часть 1.2 Чем плох WSUS, SCOM, прочее ПО, и факты в Ansible?
Часть 1.3 Почему Powershell, а не Python?
Часть 1.4 Прочие базовые вещи
Часть 1.5 Классы и объекты, для тех, кто пропускал школу
Часть 1.6 К теме обновлений в Windows
Часть 1.7 Как это все хранить и обрабатывать?
Часть 1.8 Давайте начинать. Мой первый класс
Часть 1.9 Немного магии, не очевидной с первого раза
Часть 1.10 Мой первый массив
Часть 1.11 Суй массив в файл. И забирай из файла
Часть 1.12 Теперь все вместе

Часть 2. Windows update
Часть 2.1 Служба обновлений и ее журнал
Часть 2.2 Настраиваем удаленный доступ
Часть 2.3 Ловим исключения
Часть 2.4 Проблема слишком больших прав
Часть 2.5 Разрешение удаленного подключения
Часть 2.6 Параллельная обработка задач, -parallel,  powershell jobs, Runspaces
Часть 2.7 И, наконец, получим первый список
Часть 2.8 Итого

Часть 3. Обрабатываем, что получилось
Часть 3.1 Немного про общую логику
Часть 3.2 В предыдущих сериях
Часть 3.3 Обновление списка обновлений
Часть 3.4 Обрабатываем оба списка сразу – список обновлений и список с сервера
Часть 3.5 Осталось только выгрузить в Excel
Часть 3.6 Отладка и наладка
Часть 3.7 Альтернативы?

Часть 3. Обрабатываем, что получилось

Часть 3.1 Немного про общую логику
Есть школьная логика, когда люди считают, что «нам нужен список всех обновлений, чтобы понять, какое обновление установлено! 111
Есть логика «ближе к Agile», когда нам не важно, какое обновление установлено, а важно, установлено ли последнее обновление, максимум предпоследнее.
В чем разница? В случае «школьной логики» последние лет 50 наверное, может больше, я в школе был травмирован абсолютно угашенной на голову преподавательницей химии, которой надо было не решение, правильное или неправильное, а соблюдение ее личной методологии решения. Абсолютно дурная бабка была.

Логика в моем случае в том, чтобы сначала получить MVP, minimum viable product, получить данные «как есть», и уже потом развивать код, добавляя в выгрузку, или в справку нужные мне данные.
Проблемы написать парсер Windows update нет никакой, может уже даже кем-то написан. Но мне не нужен полный список для решения моей частной задачи.
Задача в первом приближении написана не оптимально с точки зрения кода, объемов данных итд. Но опять же, мне не нужно решать глобальную задачу и делать комбайн с вертикальным взлетом, мне траву во дворе скосить, и скосить «сейчас».

Про это будет еще много отсылок в тексте.

Использование функций.
Использование функций дело, безусловно, полезное и правильное, с точки зрения читаемости кода. Проблема с Powershell в том, что в нем обработка ошибок в функции весьма странная и неудобная с непривычки. Поэтому функции я, конечно, использую, но в этом примере их будет меньше, чем стоило бы.
Например, получение списка обновлений NewKeinArray можно было спокойно вынести в функцию с параметром, или без.

Чистка кода от старого и закомментированного кода.
Для читаемости кода, конечно, было бы неплохо вычищать старый код.
Для прослеживания логики роста кода, чтобы спустя месяц было понятно, что было сделано и почему так было сделано, закомментированный код можно оставлять. Оба варианта сгодятся. Поскольку это учебная статья, то закомментированный код будет оставлен, для примеров и чтобы на него ссылаться.

Часть 3.2 В предыдущих сериях

В первой серии мы получили:
1) Файл nur-eine-datei.xml  c массивом( System.Array) из класса MeineErsteKlasse и генератор (mainefirstclass4pikabu .ps1) для создания этого файла.
Почему эта функция вынесена? Потому что генерация – это очень простой механизм, и его имеет смысл сделать отдельно. Можно ли сделать эту задачу как функцию в основном скрипте? Можно, но зачем? Это простая генерация файла со списком. Ниже попробую пояснить, почему именно так удобно именно мне.
2) Файл dieparole.txt с логином и паролем для удаленного сервера. Так делать не надо, хранение логинов и паролей в тексте – плохая практика. Нормальные люди разворачивают Vault.
3) Некорректно настроенный, так делать не надо, но для демонстрации сойдет, сервер с Windows. WinRM надо грамотно настраивать для безопасной работы!
4) Выгруженный список обновлений с этого сервера.
5) И код из части 2.

Что сделано не очень удобно, и, может, не очень правильно? Файл nur-eine-datei.xml  и оба скрипта должны лежать в одной папке, и называться одинаково в обоих исполняемых файлах. Можно было сделать запуск с параметром «путь к файлу», но, на мой взгляд, это только усложнит использование.

Первым делом переформируем список серверов для проверки.
В примере (2) есть строка

$MeineServerliste = @("192.168.211.150","192.168.211.151")

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

Часть 3.3 Обновление списка обновлений
Перепишем первый скрипт, формирующий список обновлений, в следующем виде:

Class Updates{
[string]$OS
[string]$UpdateType
[string]$KB
[string]$KBDate
[string]$Other}

<#Для какого продукта он предназначен: Microsoft Server Operating System
Для какой версии продукта он предназначен: 24H2 (это Windows server 2025)
Номер: KB article numbers: 5063878
Дата выхода: 8/12/2025 #>
$Skriptversion = "12 from 05.09.2025"

$Ar2 = @()
$UPD =[Updates]::new()
$UPD.OS = "Server 2025 24H2" ; $UPD.UpdateType = "OS" ; $UPD.KB = "KB5063878"  ; $UPD.KBDate = "12.08.2025" ; $Ar2 += $UPD ;
# $MeinErstklassigesBeispiel | Format-Table –AutoSize
$PfadZurSpeicherdatenbank = $PSScriptRoot
$MeineErsteSicherungsdatei = $PfadZurSpeicherdatenbank + "\" + "nur-eine-datei-part12.xml"
Export-Clixml -Path $MeineErsteSicherungsdatei -InputObject $Ar2

# notepad $MeineErsteSicherungsdatei
# $NewKeinArray = Import-Clixml -Path $MeineErsteSicherungsdatei
# $NewKeinArray

Зачем? Во первых, нам не нужны проверки «через блокнот», сделанные для демонстрации «что там внутри». Во вторых, чтобы строка
$UPD.OS = "Server 2025 24H2" ; $UPD.UpdateType = "OS"
помещалась на экран.

Зачем так ?

Допустим, вы по каким-то причинам не перешли с сервера 2012R2 на сервер 2025, и вам нужно следить не только за тем, чтобы было или не было обновление на сервере 2025, но и за 2012.
При этом, поскольку подписки на расширенные обновления для 2012R2 у вас нет, то последнее обновление у вас будет от  10 октября 2023 года.
2023-10 Security Monthly Quality Rollup for Windows Server 2012 R2 for x64-based Systems (KB5031419)
Хотя, если бы вам на самом деле была нужна безопасность, то вы бы оформили подписку на обновления, и получали
2023-11 Security Monthly Quality Rollup for Windows Server 2012 R2 for x64-based Systems (KB5032249)
2023-12 Security Monthly Quality Rollup for Windows Server 2012 R2 for x64-based Systems (KB5033420)

И так далее, вплоть до
2025-08 Security Monthly Quality Rollup for Windows Server 2012 R2 for x64-based Systems (KB5063950)
2025-08 Security Monthly Quality Rollup for Windows Server 2012 for x64-based Systems (KB5063906)

В таком случае достаточно дописать одну строку в код:
$UPD.OS = "Server 2012 R200" ; $UPD.UpdateType = "OS" ; $UPD.KB = "KB5031419"  ; $UPD.KBDate = "10.2023" ; $Ar2 += $UPD ;

Читаемость сохраняется, думать не надо.

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

Часть 3.4 Обрабатываем оба списка сразу – список обновлений и список с сервера

В переменной $DataRemote1 есть массив обновлений, а в $MeineServerliste[0] – имя сервера. Окей, и что с этим делать? Очевидно, создать новый класс, но сначала сделать то, чего делать нельзя.

Вспоминаем Powershell в нескольких частях. Часть 3. Обрабатываем, что получилось

Мне, не знаю как вам, не нужно обрабатывать весь список обновлений. Обновления в Windows последних (2016, 19, 22, 25) бывают:
Обновление стека обслуживания, например servicing stack update (KB5063666)
Кумулятивное плановое обновление, например 2025-08 Cumulative Update for Microsoft server operating system version 24H2 for x64-based Systems (KB5063878) (26100.4946)
Внеплановое обновление
Обновление dotnet, например
2025-07 Cumulative Update for .NET Framework 3.5 and 4.8.1 for Microsoft server operating system version 24H2 for arm64 (KB5056579)
Какие-то еще внеплановые обновление, типа обновления Edge и чего то там еще. Всякая мелочь.
Так нужно ли обрабатывать все 10-20-50 обновлений в списке установленных? Конечно, нет.
Поэтому:


$DataRemote2 = $DataRemote1 | Sort-Object -Property InstalledOn -Descending | Select-Object -First 4

Вот теперь заводим новый класс!

Class CurrentState{
[string]$Name
[string]$IP
[string]$IsActive
[string]$CurrentUpdateKB
[string]$CurrentUpdateKBDate
[string]$Other
[string]$LastInstalledKBFotTroubleshooting}

Remove-Variable TotalList -ErrorAction SilentlyContinue
$TotalList = @()

foreach ($ThisUpdate in $DataRemote2) {
$ThisServer = [CurrentState]::new()
$LastInstalledKBFotTroubleshooting = ""
foreach ($ThisUpdate2 in $DataRemote2){
$LastInstalledKBFotTroubleshooting = $LastInstalledKBFotTroubleshooting + $ThisUpdate2.HotFixID +'.'}

$ThisServer.LastInstalledKBFotTroubleshooting = $LastInstalledKBFotTroubleshooting

foreach ($BaseOfUpdate in $NewKeinArray) { 
$ThisServer.IP = $MeineServerliste[0]
Write-Host "This |"  $ThisUpdate.HotFixID " Base " $BaseOfUpdate.KB
if ($ThisUpdate.HotFixID -eq $BaseOfUpdate.KB) {
$ThisServer.CurrentUpdateKB = $ThisUpdate.HotFixID
$ThisServer.CurrentUpdateKBDate = $BaseOfUpdate.KBDate
$TotalList += $ThisServer
#break
}}

Remove-Variable LastInstalledKBFotTroubleshooting
Remove-Variable ThisServer  }

Часть 3.5 Осталось только выгрузить в Excel

В Powershell «из коробки» нет выгрузки в Excel. Есть txt, csv, xml. Внешний модуль для Excel, конечно, есть, но использовать его просто не хочется.
Однако, если вы сделаете

$CSVfile1 = $PfadZurSpeicherdatenbank + "\" + "MyExport1.csv"
Export-Csv -InputObject $TotalList -Path $CSVfile1
notepad $CSVfile1

То получите совсем не то, чего хотели, а что-то про #TYPE System.Object[]
Это совсем, совсем не то, что вам надо. Для решения этой проблемы есть несколько вариантов, самый читаемый, на мой взгляд,

$CSVfile2 = $PfadZurSpeicherdatenbank + "\" + "MyExport2.csv"
$CSVfile3 = $PfadZurSpeicherdatenbank + "\" + "MyExport3.csv"
$TotalList | Select * | Export-Csv -Path $CSVfile2 -Delimiter ";"
$TotalList | Select Ip, LastInstalledKBFotTroubleshooting | Export-Csv -Path $CSVfile3 -Delimiter ";"
notepad $CSVfile2
notepad $CSVfile3

Часть 3.6 Отладка и наладка

Что же делать, как же быть, если у вас поле CurrentUpdateKB – пустое? Не оказалось у вас установленного последнего обновления?
На мой взгляд, решение очевидно, нужно идти и ставить свежее обновление.


Но, если у вас другое мнение, то
Поле LastInstalledKBFotTroubleshooting у вас есть, Microsoft Update catalog доступен, дальше надо пояснять?

Часть 3.7 Альтернативы?

Пока обсуждал черновик с коллегами, выяснил что можно было решить эту задачу, инвентаризации, и попроще. Или иначе.
Можно было сделать, через, например, групповую политику, разовую задачу по выгрузке того, что мне нужно, в общую папку, в сотню – две файлов с разными именами. Потом уже гораздо проще решить задачу выборки из файлов.
Можно было выдернуть через Get-SilData, тоже вариант.
Можно было запросить SQL базу на WSUS, если она хоть как-то жива.  Там очень простой запрос.

Показать полностью 1
6

ФТП протоколы

Интересно, чем ФТП то провинился, что его тоже режут, примерно также как и звонки/ютуб/телегу...

Каждые Х файлов сервера отваливаются, выдают ошибки, таймауты, и прочее...

Что примечательно "коллеги не из России" - таких проблем не наблюдают, и спокойно загружают файлы. Хоть и гораздо медленнее...

Отличная работа, все прочитано!