Как выгрузить логи в telegram powershell

REDMOND

Как отправить сообщение в Telegram из PowerShell

Уведомления, получаемые от систем мониторинга, стали неотъемлемой частью специалистов занимающихся сопровождением информационных систем. Однако, мир не стоит на месте и все чаще появляются новые способы оповещения. К традиционным средствам оповещения о состоянии информационных систем: электронная почта и SMS добавились новые средства доставки уведомлений, такие как мессенджеры. Наибольшей популярностью, для этой цели, у системных администраторов стал мессенджер Telegram. А в системах мониторинга появилась возможность настраивать интеграцию с мессенджерами, с целью оперативной рассылки уведомлений.
Но что делать если централизованной системы мониторинга нет, или в ней нет особой необходимости, а потребность получать уведомления в Telegram есть.
Ниже описан один из способов пошаговой настройки для отправки сообщений в Telegram используя PowerShell.

  • используя свой аккаунт Telegram написать специальному служебному боту @BotFather команду "/Start" или любое сообщение — в ответ придет список доступных команд.
  • отправить команду /newbot — и ввести уникальное название бота, а затем идентификатор, который обязательно должен заканчиваться символами "bot".

В ответ придет уникальный token для созданного бота, который будет использоваться при отправке сообщений.
Например боту UserManRu_bot был присвоен токен: 819090298:AAGjXP6QLPMkem9t2LflIHOAiE_Q58bA43g

2. Создать в группу в Telegram и получить ее идентификатор
Для получения идентификатора группы необходимо создать новую группу в Telegram (или использовать имеющуюся группу) и добавить туда созданного бота UserManRu_bot. А для получения идентификатор учетной записи следует отправить боту UserManRu_bot сообщение /Start и любое тестовое сообщение.

Затем необходимо проверить историю обращений которые были к боту, используя запрос ниже: В случае с ботом UserManRu_bot это будет:
В результате мы увидим уникальный идентификатор пользователя (наш идентификатор), он нам понадобится при отправке сообщений
А также уникальный идентификатор группы

Из этого набора символов в формате JSON определяем ID пользователя, который отправил сообщение "Test": 172489755
и Id группы в которую добавили бота: -347310642

  • token — Уникальный идентификатор, который был получен при создании бота
  • chat_id — уникальный идентификатор пользователя или группы. Он определяется запросом getUpdates
  • text — текст сообщения, которое необходимо направить

Вставляем этот запрос в адресную строку браузера и переходим по ссылке. Сообщение Hello lолжно прийти сообщение в группу.

4. Сформировать скрипт для отправки сообщения
Чтобы сформировать и выполнить Web запрос выше, используя PowerShell, потребуется небольшой скрипт. Пример скрипта показан ниже:
Где, 134.19.218.94:3128 — это один из примеров открытого прокси сервера.

Telegram-бот для управления инфраструктурой

image

По мотивам статьи Телеграмм-бот для системного администратора (статья не моя, я только прочитал) захотел поделиться опытом создания Telegram-бота на PowerShell для управления серверами приложений. Будет текст, код и немножко картинок. Конструктивная критика приветствуется ( главное чтобы не звучало «зачем на PowerShell? Надо было на perl» ).

Думаю что статья больше подойдет «новичкам» в PowerShell, но и опытные администраторы могут что-то полезное здесь увидеть.

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

Итак, у нас есть необходимость осуществлять управление сервисами или приложениями на нескольких серверах (останавливать, запускать), перезагружать сервера, смотреть логи и еще какую-то информацию при необходимости. Всё это хочется делать (на самом деле нет), находясь в метро, в магазине или даже лёжа на диване, без VPN и ноутбуков. Из требований (которые были написаны, конечно, на коленке).

  • Простота добавления/изменения задач в Telegram-бот
  • Многозадачность или параллелизация
  • «Понятный» интерфейс управления
  • Хоть какая-то безопасность

Часть 1: простой телеграм-бот

Ищем папку-бота (не каталог) – BotFather (@BotFather) в Telegram

BotFather

Пишем /newbot
Далее, нужно придумать имя боту (в моем случае я назвал Haaaabr специально для статьи) и username, который должен заканчиваться на «bot» (Haaaabr_bot)

После этого BotFather выдаст токен, который мы и будем использовать:

image

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

Делаем простого бота, который будет принимать сообщения и отвечать на них.

Я буду писать код PS частями и периодически вставлять full-код для референса.

Для справки нам понадобятся описания вызовов API Telegram Bot API

Нам будет нужно 2 метода:

getUpdates – получение ботом(скриптом) сообщений
sendMessage – отправка сообщений ботом(скриптом) пользователю

Там же, видим, что:

Шаг 1 – прием сообщений
Переменные

Теперь будем проверять, что отдает вызов $URL_get

Нот бэд. Напишем что-нибудь боту:

Hello

Очевидно, что нам нужен result. Сразу скажу, что нас интересует только последнее сообщение от пользователя, поэтому так:

Теперь нужно сделать confirm, что мы получили сообщение. Делается это все также, через метод getUpdates с параметром offset:

И кидаем это все в цикл c таймаутом в 1 секунду:

Теперь сделаем из этого функцию чтения сообщений. Т.к. нам нужно возвращать несколько значений из функции – решили использовать HashTable (именованный/ассоциативный массив)

Шаг 2 – отправка данных
Для отправки сообщения нам нужен метод sendMessage и поля chat_id и text (остальные опционально https://core.telegram.org/bots/api#sendmessage).

Сразу запилим функцию

получим сообщение в телеге.

Шаг 3 – собираем все вместе

Ниже весь код для отправки-получения сообщений

Дальнейшую логику можно строить на основе $return.text и, например, оператора switch:

в командлете Get-Random используются emoji, в код в статье у меня их встроить не получилось, но PS понимает их нативно
Get-Random

Часть 2: нужны кнопки

В телеграм боте есть опция задания списка команд (открывается вот по этому значку Icon)
Первоначально мы так и сделали – был набор команд, в качестве параметров передавали туда имена серверов или сервисов. Потом решили, что нужно двигаться дальше в сторону User Friendly интерфейсов и подключили функционал кнопок.

Используется вызвов sendMessage c параметром reply_markup

Для нашего функционала мы использовали тип InlineKeyboardMarkup
https://core.telegram.org/bots/api#inlinekeyboardmarkup .

Из описания следует, что поле inline_keyboard– это массив из массива кнопок

Пробуем сделать тестовую отправку кнопок

Проверяем что содержит переменная $json

Видимо как-то не очень передавать объект HashTable («System.Collections.Hashtable System.Collections.Hashtable») для api телеграма. Немного гугла и итог – при конвертации в Json ставим глубину конвертации

Buttons

Делаем функцию по отправке кнопок, на вход будем подавать массив кнопок

Теперь на «привет» бот будет отправлять нам пару кнопок. Осталось понять, какую кнопку нажал пользователь. В текущей ps-функции getUpdates есть проверка на

При нажатии на кнопку никакой текст не возвращается, соответственно, нужно модифицировать функцию. Нажимаем на кнопку

PushTheButton

И запускаем кусок кода для проверки содержимого $data

Никакой message больше не прилетает. Вместо него теперь callback_query. Правим функцию

Теперь функция возвращает text, если есть сообщение, или callback_data, если было нажатие на кнопку. На этапе тестов словили ошибку при вызове:

Так как parse_mode выставлен в Markdown, а отправляемый текст

нужно перед отправкой форматировать сообщение, подробнее тут:
https://core.telegram.org/bots/api#formatting-options
или убрать нижнее подчеркивание «_»

Часть 3: делаем конфиг

Настало время всё вынести в конфиг. Тут все просто – делаем xml:

Описываем задачи (tasks) и для каждой задачи указываем скрипт или команду.
Проверяем:

Теперь, если написать «привет» — бот вернет список кнопок, который соответствует задачам, описанным в xml-файлы. В callback_data будет команда или скрипт.

Если делать косметические изменения – то желательно, чтобы кнопок было 3-4 на строку, иначе они отображаются не полностью:

KeyBoard

Будем делать по 3 кнопки в линию (максимально).

Схематично массив keyboard должен выглядеть так:

Keyboard

Таким образом:
Button[i] — массив (ассоциативный) вида

Line[1-3] — это массивы (из кнопок), которые хранят в себе массивы кнопок (это важно)
Keyboard – массив из Line’ов.

Модифицируем функцию sendKeyboard

Keyboard_Telegram

Часть 4: задачность и многозадачность

Настало время по кнопке делать дела.

Для многозадачности будем использовать механизм Job’ов. Проверяем такой кусок кода:

И через 5 секунд выполняем:

$output должен возвращать ipconfig с localhost

Добавляем это в основной скрипт, в блок callback_data

Проверяем, ловим error
Invoke-RestMethod:

На просторах интернета находим информацию, что длина сообщения не может превышать 4096 символов. Оукей…

говорит что длина 39
Долго думаем что не так, в результате пробуем такой кусок кода:

Output

Теперь прикрутим «немного безопасности»

REDMOND

Добавляем в xml конфиг новую строку, назовем ее users и укажем там chat_id тех, кому можно общаться с ботом:

В скрипте будем получать массив users

Часть 5: в заключение

Проверяем функционал бота – добавим туда скриптов, которые будут делать что-то полезное
Для операций на удаленных серверах мы используем Invoke-Command с последующим Write-Output

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

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

Наверняка у кого-то будет проблема с отправкой сообщения > 4096 символов, но это решаемо Substring и циклом отправки.

И напоследок – удаленное управление из любой точки мира (почти из любой) это хорошо, но всегда есть риск, что что-то пойдет не так (управление ботом вдруг может получить кто-то нехороший). На этот случай мы просто добавили Exit из скрипта по определенному слову

Как создать бота Telegram для разблокировки AD аккаунтов

В этой статье будет рассмотрен способ работы с Telegram через Powershell. Основная задача, которая будет решаться в статье, получение списка заблокированных пользователей и их разблокировка. Обычно, когда такие ситуации случаются, я редко нахожусь за компьютером и мне приходится делать подключение через телефон и RDP — это не удобно. С помощью описанного методы разблокировать пользователя можно будет в 2 клика.

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

Навигация по посту

Для чего нужен API

У многих приложение (веб и локальных) есть понятие API, которое описывает процесс взаимодействия с программой и упрощает его. Например вам нужно узнать количество новых сообщений на своей почте и для этого вы открываете веб страницу. Веб страница весит 7Мб, а такую процедуру вы проделываете 100 раз в минуту. Этот способ плох и для вас и для сервера. Будет лучше, если вам будет отправлено только количество новых сообщений. Одна из таких проблем и решается с помощью API. У нас будет возвращена информация типа:

Формат выше называется JSON и это самый популярный способ общения с веб-API. Он похож на хэш-таблицы Powershell и для работы с ним есть отдельный командлет.

Умение разбираться и взаимодействовать с разными API — это весомый навык разработчиков и ,особенно, для системных администраторов.

Регистрация бота Telegram

Для ботов в Telegram есть свой публичный API и что бы им воспользоваться — вы должны пройти регистрацию. Это делается в несколько шагов.

Регистрация вашего персонального бота выполняется через специальный канал BotFather. Найти его вы можете через поиск (у него будет галочка):

Регистрация бота в Telegram через BotFather

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

Диалоговое окно BotFather в Telegram

Команда '/start' поможет в случаях, если вы забудете названия ботов или захотите изменить какие-то данные.

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

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

После этого нам будет предложено ввести название для бота. Это название, которое легче всего будет понять вам. Я назову его:

  • 'fixmypc_ad_test'

После названия для бота нужно будет придумать название для канала, который он сможет обслуживать. Главным правилом названия — оно должно заканчиваться на 'bot'. Учтите, что вашего бота можно будет найти через поиск и лучше не использовать идентифицирующие вас имена. Я буду использовать:

  • 'fixmypc_ad_test_bot'

Регистрация бота в Telegram для Powershell

В выделенном фрагменте, под номером 4, ссылка на ваш канал. Под номером 5 — ваш персональный токен. Токен — это как пароль, если кто-то получит к нему доступ сможет управлять ботом. Этот токен нужно будет отправлять при каждом запросе Telegram.

Нажмите на ссылку во фрагменте 4 и нажмите кнопку /start что бы у вас было хотя бы 1 сообщение.

Взаимодействие с API Telegram

Большая часть взаимодействия с API ботов (есть и другие) сводится к обращению по 1 url. Этот url выглядит следующим образом и состоит из частей:

  • <token> — это поле &#39;пароля&#39; от вашего бота. Мы его получили раннее;
  • <METHOD_NAME> — это команда, которую мы отправляем к Telegram и получаем какой-то ответ.

Названия методов и способ обращения к ним заранее определен и описан в документации. Документация по работе с ботами описана по ссылке.

В рамках всей статьи у меня определены 2 переменных, которые составят часть Url для обращения к Telegram. В примерах вы можете не увидеть эти переменны, но они могут использоваться:

Invoke-RestMethod

Как уже писалось выше — Telegram использует формат JSON. Такой формат не поддерживается в базовой реализации Powershell, но он содержит команду Invoke-RestMethod для преобразования JSON в hash-table.

В следующем примере мы соединим наш Url и токеном с методом getMe, который вернет базовую информацию о боте:

Выполнение запроса в Telegram через Powershell Invoke-RestMethod

Скриншот выше демонстрирует, что мы получили вложенные хэш таблицы типа @>>. Мы можем &#39;распаковать&#39; эти массивы:

Получение информации о боте в Telegram через Powershell Invoke-RestMethod

Получение сообщений

После регистрации бота вы должны были нажать на кнопку /start, т.е. у вас должно быть хотя бы одно сообщение. Что бы получить его воспользуемся методом getUpdates:

Выведем информацию, которая находится внутри массивов:

Получение информации о сообщении в Telegram через Powershell Invoke-RestMethod

Обратите внимание, что у каждого пользователя бота свой собственный чат/канал с ним. Вы, как пользователь, не можете видеть сообщения другого пользователя, а он ваши. Бот же видит оба ваших чата и идентифицирует вас по идентификатору &#39;chat.id&#39;. В дальнейшем мы будем использовать этот идентификатор что бы понять от кого мы получили сообщение и кому будем отправлять ответ:

Получение идентификатора сообщения Telegram через Powershell Invoke-RestMethod

У меня 2 &#39;chat_id&#39; так как я отправлял 2 сообщения. Для ответа нужно только 1 — и так его можно получить:

Отправка сообщений

Методы для получения данных от API могут нуждаться в дополнительных, обязательных, параметрах. Эти параметры описаны в документации. Для отправки сообщений используется метод &#39;sendMessage&#39; и в документации для него описаны следующие обязательные параметры (в колонке Required):

Описание API ботов Telegram

В предыдущем примере мы уже получили chat.id и должны его передать для отправки сообщения. Текст сообщения вы можете изменить на свое усмотрение. Все параметры и их значения помещаются в хэш таблицу, а затем в -Body команды Invoke-RestMethod :

Отправка сообщения в Telegram через Powershell Invoke-RestMethod

Получаем заблокированных пользователей AD

Свойство, которое отображает заблокированных пользователей AD, называется LockedOut. С помощью следующей команды мы получим всех таких пользователей:

Получение заблокированного пользователя AD в Powershell

Что бы такой пользователь смог зайти в систему он должен быть разблокирован и ему должен быть установлен новый пароль. В этой статье будет рассмотрен одинаковый пароль во всех случаях — &#39;Zx12345&#39;:

Снятие блокировки пользователя AD и установка пароля с Powershell

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

Как отправлять письма используя Powershell Send-MailMessage

Связываем Telegram и AD

Все сообщения, которые будут посланы пользователями боту, можно разделить на обычный текст и команды. Команды — это то что мы должны обработать. Удобнее всего сделать команды через Telegram кнопки или ссылки. Их удобство в том, что мы можем не печатать текст, а просто нажать на эту команду. В этой статье будут рассмотрены только ссылки. Они начинаются со знака &#39;/&#39; и не могут содержать символы пробелов:

Команды Telegram

Таких типов команд должно быть 2 — на получение списка пользователей и разблокировку. Как видно на примере выше — мы не можем использовать в качестве команды имена пользователей т.к. они содержат пробелы. Мы можем использовать UPN, но по нему не всегда понятно что это за пользователь (например aa@domain.local). Кроме этого команды, которые устанавливают пароль и снимают блок (Unlock-AdAccount и Set-ADAccountPassword), работают только с SID/GUID(самые удобные способы). Эти данные тоже не очень хорошо выводить т.к. они являются идентификаторами безопасности. Я предлагаю решить эту проблему создав следующий вид команд и сопутствующего текста:

Команды Telegram

Каждый идентификатор типа /0, /1, /2 будет соответствовать индексу значения в массиве (массив содержащий пользователей). Создадим функции, которые позволят сделать это.

Формирование списка пользователей

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

В примере выше, Anna Petrovna, будет соответствовать индексу 0, а Патрушева — 1. Нужно так же учитывать, что заблокированных пользователей может не быть. Создадим функцию получения пользователей:

Получение списка заблокированных пользователей AD для Telegram

С помощью следующего скрипта мы получим заблокированных пользователей использую созданный командлет и создадим текст для отправки в Telegram (который мы спланировали раннее):

Создание текста с заблокированными пользователей AD для Telegram

Отправка списка пользователей

Создадим функцию с помощью которой мы будем отправлять сообщения. Как уже и описывалось раньше для отправки сообщений нужно указать текст и chat_id. Эти данные мы тоже будем передавать через функцию. В примере ниже не видно переменных $token и $url, подразумевается что вы уже объявляли их раннее:

Отправка текста с заблокированными пользователей AD для Telegram

В выделенном фрагменте видно, что у нас получилось реализовать вывод сообщений в планируемом формате.

Реализация команд

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

  • Команду на получение списка заблокированных пользователей — /get_user;
  • Команду на разблокировку пользователей — они у нас уже выводятся в виде /1, /2 и т.д.

Что бы суметь получить команды мы должны создать вечный цикл. Этот вечный цикл, раз в 2 секунды, будет выполнять запрос к API telegram и получать последнее сообщение. Выполнять запросы чаще чем раз в 2 секунды не рекомендуется, т.к. у Telegram может быть на это ограничение. Получить последнее сообщение из чата можно так:

Получение последнего сообщения Telegram через Invoke-RestMethod Powershell

У пользователей есть идентификаторы чатов (chat_id), а у чатов есть идентификаторы сообщений (message_id). В примере выше мы вернули последнее сообщение из всех чатов (с помощью offset=&#39;-1&#39;). Последнее сообщение не значит "новое" и нам нужно научится их различать. Один из способов сделать это, при запуске программы, запомнить последнее сообщение написанное в чате. Каждые 2 секунды мы будем повторять запрос и сравнивать идентификаторы сообщений (message_id). Если они отличаются, то значит пришло новое сообщение и мы заменяем старый message_id на новый и выполняем еще какую-то логику:

Получение сообщений Telegram через Invoke-RestMethod Powershell

Теперь нам нужно понять начинается ли сообщение на &#39;/&#39; (т.е. является командой). Если это команда — мы определяем какая именно (разблокировать или получить). Ниже уже готовый скрипт, в котором объедены предыдущие части. Добавлены моменты, которые могли бы вызвать недопонимание:

  1. Если нет заблокированных пользователей (массив пустой) — будет отправлено сообщение "Нет заблокированных пользователей";
  2. Если пользователь успешно разблокирован (не было критичных ошибок) — "Пользователь $($user.Name) разблокирован".

Бот по разблокировки пользователей Telegram через Powershell

Безопасность и возможные проблемы

Работая с ботом вы должны понимать, что он публичный и его может найти и использовать каждый. Есть несколько ограничения доступа. Самый популярный способ — задать явно chat_id и исполнять команды только от него. Так как это персональный идентификатор, который присваивается Telegram каждому пользователю, его будет тяжело подделать. Вообще, вместе с сообщением, возвращается несколько идентификаторов, каждый из которых вы можете использовать:

Идентификаторы пользователя Telegram с Powershell Invoke-RestMethod

Чтобы работать с определенным ChatID — нужно будет исправить скрипт в двух местах: в переменной $MessageID и в командлете Get-TelegramMessage:

Учтите, что скрипт читает сообщение раз в 2 секунды и если вы отправите в этот промежуток 2 сообщения — будет прочитано только последнее.

Второй способ — это создание приватного канала, в который будет добавлен этот бот. Это другой API и он не рассматривается в этой статье.

Скрипт изначально не делался для работы более чем с 1 пользователем. Это связано с переменной chatid, которая идентифицирует только одного пользователя. Если вам нужно реализовать приватный доступ более чем 1 пользователю вы должны реализовать следующее:

  1. Объявить массив с ChatID пользователей, которые могут работать через бот;
  2. При проверке последнего сообщения, в Get-TelegramMessage, добавить проверку на ChatID;
  3. Если проверка успешная, командлет должен возвращать не только текст сообщения, но и ChatID. Этот ChatID и станет основным для отправки ответа.

У меня нет возможности проверить работу для 2 пользователей, но исправления в этих местах должны сработать:

При этом проблема с 2-я сообщениями за 2 секунды останется.

Этот скрипт может дорабатываться и его последнюю версию вы можете посмотреть на моем github.

REDMOND

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *