Мониторинг доступности сетевой папки через PowerShell
Добрый день! Уважаемые читатели и гости IT блога Pyatilistnik. В прошлый раз мы с вами создали и разобрали скрипт PowerShell, который позволяет отслеживать переезды ролей файлового кластера между нодами. В сегодняшней статье я хочу пополнить свою коллекцию сценариев, которые могут вам быть полезны в вашей повседневной жизни. Задача заключается в том, чтобы отслеживать ряд файловых сетевых папок, которые опубликованы в DFS шаре на предмет их доступности по сети, данная необходимость появилась после интересного случая с зависание узла файлового кластера, который повесил всю систему распределения.
Постановка задачи
В инфраструктуре есть домен Active Directory в его периметре есть DFS корень в котором опубликованы файловые шары.
Необходимо раз в час проводить проверку на доступность данного списка сетевых папок, зайдя в них с помощью определенной учетной записи у которой есть права на чтение.
- Делаем учетную запись в ADUC под данную задачу
- Назначаем в ACL или на файловых серверах права для этой учетной записи
- Делаем проверку через PowerShell
- В случае недоступности отправляем сообщение в чат мониторинга в Телеграм.
Скрипт PowerShell проверяющий доступность сетевой шары с оповещением в Телеграм
# Функция для получения текущей даты и времени в формате MM.dd.yyyy HH:mm:ss
function Date {Get-Date -Format "MM.dd.yyyy HH:mm:ss"}
# Определение пути к папке для логов, используя переменную $PSScriptRoot и имя скрипта
$log_folder = "$PSScriptRoot\Logs\" + $($MyInvocation.MyCommand.Name -replace (".ps1", ""))
# Создание имени файла лога в формате "yyyy_MM_dd_HH_mm_ss.txt"
$log = "$log_folder\$(Get-Date -Format "yyyy_MM_dd_HH_mm_ss").txt"
# Проверка наличия папки для логов, если нет - создание папки
if (! (Test-Path $log_folder -PathType Container -ErrorAction SilentlyContinue))
{
New-Item $log_folder -ItemType D -Force | Out-Null
}
# Запись в лог текущей даты и времени с сообщением "Start Processing"
"$(Date) Start Processing" | Tee-Object $log -Append
# Получение имени текущего пользователя
$current_user = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
# Запись в лог текущей даты и времени с сообщением о начале обработки папок в указанном пути
"$(Date) Processing folders in \\Pyatilistnik.org\root" | Tee-Object $log -Append
# Создание массива для ошибок
$err = @()
# Цикл для обработки папок в указанном пути
foreach ($folder in (Get-DfsnFolder -Path "\\Pyatilistnik.org\root\*" | sort NamespacePath).NamespacePath)
{
# Пропуск папки, если ее путь соответствует указанному шаблону
if ($folder -like "\\Pyatilistnik.org\root\IS-logs*") {Continue}
# Проверка наличия пути к папке
if (Test-Path $folder)
{
# Действия при успешном обнаружении пути
}
else
{
# Запись в лог текущей даты и времени с сообщением об ошибке подключения к папке
"$(Date) User $current_user is unable to connect to folder `"$folder`"" | Tee-Object $log -Append
$err += "$(Date) User $current_user is unable to connect to folder `"$folder`""
}
}
# Подсчет количества ошибок
$err_count = ($err | Measure-Object).Count
# Проверка наличия ошибок
if ($err_count -gt 0)
{
# Запись в лог текущей даты и времени с сообщением о попытке отправки уведомления в Telegram
"$(Date) Trying to send Telegram notification" | Tee-Object $log -Append
try {
# Установка токена и chat_id для отправки уведомления в Telegram
$token = "123456789:BBA3iFrWE-TT-i0g1VRp-Cgeq2sEDbeygug"
$chat_id = "-9999998887838"
$text = $err # | Tee-Object $log -Append
# Формирование данных для отправки в Telegram
$payload = @{
"chat_id" = $chat_id;
"text" = $text;
"parse_mode" = "Markdown";
}
# Установка протокола безопасности для запроса
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# Отправка запроса на сервер Telegram для отправки сообщения
Invoke-WebRequest -Uri ("https://api.telegram.org/bot{0}/sendMessage" -f $token) -Method Post -ContentType "application/json;charset=utf-8" -Body (ConvertTo-Json -Compress -InputObject $payload) -ErrorAction Stop
# "$(Date) Waiting 3 seconds" | Tee-Object $log -Append
# Start-Sleep -Seconds 3
}
catch {
# Запись в лог текущей даты и времени с сообщением об ошибке при отправке уведомления
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
}
}
# Запись в лог текущей даты и времени с сообщением о завершении обработки
"$(Date) End Processing" | Tee-Object $log -Append
В результате если сетевая шара из списка будет недоступна вы получите вот такое сообщение в ваш канал:
Теперь можно оперативно проверить в чем дело, чтобы устранить причину. Надеюсь, что было полезно. На этом у меня все, с вами был Иван Сёмин, автор и создатель IT портала Pyatilistnik.org.