Мониторинг доступности сетевой папки через PowerShell

Обновлено 22.04.2024

Monitoring DFS

Добрый день! Уважаемые читатели и гости IT блога Pyatilistnik. В прошлый раз мы с вами создали и разобрали скрипт PowerShell, который позволяет отслеживать переезды ролей файлового кластера между нодами. В сегодняшней статье я хочу пополнить свою коллекцию сценариев, которые могут вам быть полезны в вашей повседневной жизни. Задача заключается в том, чтобы отслеживать ряд файловых сетевых папок, которые опубликованы в DFS шаре на предмет их доступности по сети, данная необходимость появилась после интересного случая с зависание узла файлового кластера, который повесил всю систему распределения.

Постановка задачи

В инфраструктуре есть домен Active Directory в его периметре есть DFS корень в котором опубликованы файловые шары.

Список 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

В результате если сетевая шара из списка будет недоступна вы получите вот такое сообщение в ваш канал:

User root\pupkin is unable to connect to folder \\pyatilistnik.org\root\имя папки

Сообщение о недоступности папки в телеграм

Теперь можно оперативно проверить в чем дело, чтобы устранить причину. Надеюсь, что было полезно. На этом у меня все, с вами был Иван Сёмин, автор и создатель IT портала Pyatilistnik.org.

Автор - Сёмин Иван

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

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