Задача сделать для тп скрипт который опрашивает сервера по открытым портам , пингует их и делает 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:
- Как разлогинеть (logoff) всех пользователей со статусом disconnect со всех серверов windows в domain.
- Как завершить сессию на всех серверах в локальной сети.
- Как сделать автоматическую смену пароля у пользователя exchange и отправка нового пароля на email.
- Как автоматизировать установку horizon client на пк пользователей не в домене
- Как отправлять через powershell пользователям письмо с просьбой о смене пароля т.к. срок пароля истекает.