Перейти к содержимому

Как сделать проверку серверов на открытие портов , пинги и трасеровка хостов для технической поддержки.

Задача сделать для тп скрипт который опрашивает сервера по открытым портам , пингует их и делает tracert. И отправляет на почту результат.

# Добавьте в начало скрипта
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }

# Настройки Яндекс.Почты
$YandexTo = "moskvichev@yandex.ru" 
$YandexFrom = 'moskvichev@yandex.ru'
$YandexUser = "moskvichev@yandex.ru"
$YandexPass = "пароль из яндекс"
$YandexSmtpServer = 'smtp.yandex.ru'
$YandexPort = 587

# Получение информации о ПК и пользователе
$ComputerName = $env:COMPUTERNAME
$UserName = $env:USERNAME
$Domain = $env:USERDOMAIN

# Порты для проверки для каждого сервера
$ServerPorts = @{
    "vdi.adminbd.ru" = @(443)
    "zon01.adminbd.ru" = @(3389, 32111, 4172, 8443,443)
    "zon02.adminbd.ru" = @(3389, 32111, 4172, 8443,443)
}

# Функция для вывода цветного текста
function Write-ColorOutput {
    param(
        [string]$Message,
        [string]$Color = "White"
    )
    Write-Host $Message -ForegroundColor $Color
}

# Функция для проверки статуса брандмауэра
function Test-FirewallStatus {
    Write-ColorOutput "`n=== ПРОВЕРКА СТАТУСА БРАНДМАУЭРА ===" "Cyan"
    
    try {
        $firewallStatus = Get-NetFirewallProfile | Select-Object Name, Enabled
        
        Write-ColorOutput "  Статус профилей брандмауэра:" "Yellow"
        foreach ($profile in $firewallStatus) {
            $status = if ($profile.Enabled) { "ВКЛЮЧЕН" } else { "ВЫКЛЮЧЕН" }
            $color = if ($profile.Enabled) { "Red" } else { "Green" }
            Write-ColorOutput "  - $($profile.Name): $status" $color
        }
        
        return $firewallStatus
    }
    catch {
        Write-ColorOutput "  ОШИБКА при проверке брандмауэра: $($_.Exception.Message)" "Red"
        return $null
    }
}

# Функция для выполнения ping с выводом на экран
function Test-ServerPing {
    param($ServerName)
    
    Write-ColorOutput "`n=== PING ТЕСТ: $ServerName ===" "Cyan"
    
    try {
        $pingResult = Test-Connection -ComputerName $ServerName -Count 4 -Quiet
        $pingDetails = Test-Connection -ComputerName $ServerName -Count 4
        
        $avgResponseTime = [math]::Round(($pingDetails.ResponseTime | Measure-Object -Average).Average, 2)
        $packetLoss = ($pingDetails.ResponseTime | Where-Object {$_ -eq $null}).Count * 25
        
        # Вывод подробной информации о ping
        foreach ($ping in $pingDetails) {
            if ($ping.ResponseTime) {
                Write-ColorOutput "  Ответ от $($ping.IPV4Address): время=$($ping.ResponseTime)мс TTL=$($ping.ResponseTimeToLive)" "Green"
            } else {
                Write-ColorOutput "  Превышено время ожидания запроса" "Red"
            }
        }
        
        Write-ColorOutput "  Статистика Ping:" "Yellow"
        Write-ColorOutput "  - Среднее время ответа: $avgResponseTime мс" "White"
        Write-ColorOutput "  - Потеряно пакетов: $packetLoss%" "White"
        
        if ($pingResult) {
            Write-ColorOutput "  РЕЗУЛЬТАТ: УСПЕШНО" "Green"
        } else {
            Write-ColorOutput "  РЕЗУЛЬТАТ: НЕУДАЧА" "Red"
        }
        
        return [PSCustomObject]@{
            Server = $ServerName
            Status = if($pingResult){"Success"}else{"Failed"}
            ResponseTime = $avgResponseTime
            PacketLoss = $packetLoss
        }
    }
    catch {
        Write-ColorOutput "  ОШИБКА: $($_.Exception.Message)" "Red"
        return [PSCustomObject]@{
            Server = $ServerName
            Status = "Failed"
            ResponseTime = "N/A"
            PacketLoss = 100
        }
    }
}

# Функция для выполнения traceroute с выводом на экран
function Test-Traceroute {
    param($ServerName)
    
    Write-ColorOutput "`n=== TRACEROUTE: $ServerName ===" "Cyan"
    
    try {
        $traceroute = Test-NetConnection -ComputerName $ServerName -TraceRoute -InformationLevel Detailed
        
        Write-ColorOutput "  Маршрут к $ServerName :" "Yellow"
        $hopCount = 1
        foreach ($hop in $traceroute.TraceRoute) {
            Write-ColorOutput "  Хоп $hopCount : $hop" "White"
            $hopCount++
        }
        
        Write-ColorOutput "  Всего хопов: $($hopCount - 1)" "Yellow"
        return $traceroute
    }
    catch {
        Write-ColorOutput "  ОШИБКА при выполнении traceroute: $($_.Exception.Message)" "Red"
        return "Ошибка при выполнении traceroute для $ServerName"
    }
}

# Функция для проверки портов с выводом на экран
function Test-ServerPorts {
    param($ServerName)
    
    $ports = $ServerPorts[$ServerName]
    Write-ColorOutput "`n=== ПРОВЕРКА ПОРТОВ: $ServerName ===" "Cyan"
    Write-ColorOutput "  Порты для проверки: $($ports -join ', ')" "Yellow"
    
    $portResults = @()
    
    foreach ($port in $ports) {
        Write-ColorOutput "  Проверка порта $port..." "White" -NoNewline
        
        try {
            $portTest = Test-NetConnection -ComputerName $ServerName -Port $port -InformationLevel Detailed -WarningAction SilentlyContinue
            
            if ($portTest.TcpTestSucceeded) {
                Write-ColorOutput " ОТКРЫТ" "Green"
                $status = "Open"
            } else {
                Write-ColorOutput " ЗАКРЫТ" "Red"
                $status = "Closed"
            }
            
            $portResults += [PSCustomObject]@{
                Server = $ServerName
                Port = $port
                Status = $status
                RemoteAddress = $portTest.RemoteAddress
                PingSucceeded = $portTest.PingSucceeded
            }
        }
        catch {
            Write-ColorOutput " ОШИБКА" "Red"
            $portResults += [PSCustomObject]@{
                Server = $ServerName
                Port = $port
                Status = "Error"
                RemoteAddress = "N/A"
                PingSucceeded = $false
            }
        }
        
        # Небольшая пауза между проверками портов
        Start-Sleep -Milliseconds 500
    }
    
    return $portResults
}

# Основная часть скрипта
Clear-Host
Write-ColorOutput "==============================================" "Magenta"
Write-ColorOutput "   ПРОВЕРКА VDI СЕРВЕРОВ adminbd" "Magenta"
Write-ColorOutput "   Начало проверки: $(Get-Date -Format 'dd.MM.yyyy HH:mm:ss')" "Magenta"
Write-ColorOutput "==============================================" "Magenta"

Write-ColorOutput "`nИнформация о системе:" "Yellow"
Write-ColorOutput "  Имя ПК: $ComputerName" "White"
Write-ColorOutput "  Пользователь: $Domain\$UserName" "White"
Write-ColorOutput "  Запуск от: $env:USERDOMAIN\$env:USERNAME" "White"

Write-ColorOutput "`nНастройки Яндекс.Почты:" "Yellow"
Write-ColorOutput "  Сервер: $YandexSmtpServer" "White"
Write-ColorOutput "  Порт: $YandexPort" "White"
Write-ColorOutput "  Пользователь: $YandexUser" "White"
Write-ColorOutput "  От: $YandexFrom" "White"
Write-ColorOutput "  Кому: $YandexTo" "White"

# Проверка статуса брандмауэра
$firewallStatus = Test-FirewallStatus

# Список серверов для проверки
$servers = @("vdi.adminbd.ru", "zon01.adminbd.ru", "zon02.adminbd.ru")

# Выполнение проверок
Write-ColorOutput "`nНачинаем проверку серверов..." "Yellow"

$pingResults = @()
$tracerouteResults = @()
$allPortResults = @()

foreach ($server in $servers) {
    # Ping тест
    $pingResults += Test-ServerPing -ServerName $server
    
    # Traceroute
    $tracerouteResults += [PSCustomObject]@{
        Server = $server
        Traceroute = Test-Traceroute -ServerName $server
    }
    
    # Проверка портов
    $portResults = Test-ServerPorts -ServerName $server
    $allPortResults += $portResults
    
    # Пауза между проверками разных серверов
    Start-Sleep -Seconds 2
}

# Сводная информация
Write-ColorOutput "`n" "White"
Write-ColorOutput "==============================================" "Magenta"
Write-ColorOutput "   СВОДНАЯ ИНФОРМАЦИЯ" "Magenta"
Write-ColorOutput "==============================================" "Magenta"

Write-ColorOutput "`nСводка по Ping:" "Yellow"
foreach ($ping in $pingResults) {
    $color = if ($ping.Status -eq "Success") { "Green" } else { "Red" }
    Write-ColorOutput "  $($ping.Server): $($ping.Status) (Время: $($ping.ResponseTime)мс, Потери: $($ping.PacketLoss)%)" $color
}

Write-ColorOutput "`nСводка по портам:" "Yellow"
foreach ($server in $servers) {
    Write-ColorOutput "  $server`:" "Cyan"
    $serverPorts = $allPortResults | Where-Object { $_.Server -eq $server }
    foreach ($port in $serverPorts) {
        $color = if ($port.Status -eq "Open") { "Green" } else { "Red" }
        Write-ColorOutput "    Порт $($port.Port): $($port.Status)" $color
    }
}

# Создание HTML отчета для email
Write-ColorOutput "`nФормирование HTML отчета..." "Yellow"

$htmlHeader = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <title>Отчет проверки VDI серверов</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        h1 { color: #2c3e50; }
        h2 { color: #34495e; border-bottom: 1px solid #bdc3c7; padding-bottom: 5px; }
        table { border-collapse: collapse; width: 100%; margin-bottom: 20px; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background-color: #f2f2f2; }
        .success { background-color: #d4edda; color: #155724; }
        .failed { background-color: #f8d7da; color: #721c24; }
        .warning { background-color: #fff3cd; color: #856404; }
        .timestamp { color: #7f8c8d; font-size: 12px; }
        .firewall-enabled { background-color: #f8d7da; }
        .firewall-disabled { background-color: #d4edda; }
        .system-info { background-color: #e9ecef; padding: 10px; border-radius: 5px; margin-bottom: 20px; }
    </style>
</head>
<body>
    <h1>Отчет проверки VDI серверов adminbd</h1>
    <div class="system-info">
        <strong>Информация о системе:</strong><br>
        Имя ПК: $ComputerName<br>
        Пользователь: $Domain\$UserName<br>
        Время запуска: $(Get-Date -Format 'dd.MM.yyyy HH:mm:ss')
    </div>
"@

# Статус брандмауэра в HTML
$firewallHtml = "<h2>Статус брандмауэра</h2><table><tr><th>Профиль</th><th>Статус</th></tr>"
foreach ($profile in $firewallStatus) {
    $status = if ($profile.Enabled) { "ВКЛЮЧЕН" } else { "ВЫКЛЮЧЕН" }
    $class = if ($profile.Enabled) { "firewall-enabled" } else { "firewall-disabled" }
    $firewallHtml += "<tr class='$class'><td>$($profile.Name)</td><td>$status</td></tr>"
}
$firewallHtml += "</table>"

# Ping результаты в HTML таблицу
$pingTable = $pingResults | ConvertTo-Html -Fragment
$pingTable = $pingTable -replace '<td>Success</td>','<td class="success">Success</td>'
$pingTable = $pingTable -replace '<td>Failed</td>','<td class="failed">Failed</td>'

# Port результаты в HTML таблицу
$portTable = $allPortResults | ConvertTo-Html -Fragment
$portTable = $portTable -replace '<td>Open</td>','<td class="success">Open</td>'
$portTable = $portTable -replace '<td>Closed</td>','<td class="failed">Closed</td>'
$portTable = $portTable -replace '<td>Error</td>','<td class="failed">Error</td>'

# Traceroute результаты
$tracerouteHtml = ""
foreach ($result in $tracerouteResults) {
    $tracerouteHtml += "<h3>Traceroute для $($result.Server):</h3>"
    if ($result.Traceroute -is [string]) {
        $tracerouteHtml += "<p style='color: red;'>$($result.Traceroute)</p>"
    } else {
        $tracerouteHtml += "<pre style='background-color: #f5f5f5; padding: 10px; border-radius: 5px;'>"
        $hopCount = 1
        foreach ($hop in $result.Traceroute.TraceRoute) {
            $tracerouteHtml += "Hop $hopCount : $hop`n"
            $hopCount++
        }
        $tracerouteHtml += "</pre>"
    }
}

$htmlBody = @"
    $firewallHtml
    
    <h2>Результаты Ping</h2>
    $pingTable
    
    <h2>Результаты проверки портов</h2>
    $portTable
    
    <h2>Результаты Traceroute</h2>
    $tracerouteHtml
    
    <hr>
    <p style='color: #7f8c8d; font-size: 12px;'>
        Отчет сгенерирован автоматически. Время формирования: $(Get-Date -Format 'dd.MM.yyyy HH:mm:ss')
    </p>
</body>
</html>
"@

$htmlReport = $htmlHeader + $htmlBody

# Сохранение отчета в файл
$reportPath = "C:\temp\VDI_Report_$(Get-Date -Format 'yyyyMMdd_HHmmss').html"
try {
    if (-not (Test-Path "C:\temp")) {
        New-Item -ItemType Directory -Path "C:\temp" -Force
    }
    $htmlReport | Out-File -FilePath $reportPath -Encoding UTF8
    Write-ColorOutput "Локальная копия отчета сохранена: $reportPath" "Green"
}
catch {
    Write-ColorOutput "Ошибка при сохранении файла: $($_.Exception.Message)" "Red"
}

# Отправка email через Яндекс.Почту
Write-ColorOutput "`nОтправка отчета через Яндекс.Почту..." "Yellow"

$subject = "Отчет проверки VDI серверов adminbd- $(Get-Date -Format 'dd.MM.yyyy HH:mm')"

try {
    $mes = New-Object System.Net.Mail.MailMessage
    $mes.From = $YandexFrom
    $mes.To.Add($YandexTo)
    $mes.Subject = $subject
    $mes.IsBodyHTML = $true
    $mes.Body = $htmlReport

    $smtp = New-Object Net.Mail.SmtpClient($YandexSmtpServer, $YandexPort)
    $smtp.EnableSSL = $true
    $smtp.Credentials = New-Object System.Net.NetworkCredential($YandexUser, $YandexPass)

    $smtp.Send($mes) 
    Write-ColorOutput "✓ Письмо успешно отправлено с Яндекс почты!" -ForegroundColor Green
}
catch {
    Write-ColorOutput "✗ Ошибка отправки через Яндекс.Почту: $($_.Exception.Message)" -ForegroundColor Red
}
finally {
    if ($mes) {
        $mes.Dispose()
    }
    # Восстанавливаем проверку сертификата
    [System.Net.ServicePointManager]::ServerCertificateValidationCallback = $null
}

Write-ColorOutput "`nПроверка завершена!" "Magenta"
Write-ColorOutput "Время завершения: $(Get-Date -Format 'dd.MM.yyyy HH:mm:ss')" "Magenta"

# Ожидание нажатия клавиши перед закрытием
Write-ColorOutput "`nНажмите любую клавишу для выхода..." "Gray"
pause

 

 

Как сделать проверку серверов на открытие портов , пинги и трасеровка хостов для технической поддержки.

Similar Posts:

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

Яндекс.Метрика