![Уведомление по электронной почте, если автоматическая служба не запущена (Windows Server 2012 R2)](https://rvso.com/image/668797/%D0%A3%D0%B2%D0%B5%D0%B4%D0%BE%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9%20%D0%BF%D0%BE%D1%87%D1%82%D0%B5%2C%20%D0%B5%D1%81%D0%BB%D0%B8%20%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D1%81%D0%BB%D1%83%D0%B6%D0%B1%D0%B0%20%D0%BD%D0%B5%20%D0%B7%D0%B0%D0%BF%D1%83%D1%89%D0%B5%D0%BD%D0%B0%20(Windows%20Server%202012%20R2).png)
В нашей среде есть несколько серверов (Windows Server 2012 R2), которые автоматически устанавливают обновления и после этого перезагружаются.
После перезапуска мы хотели бы проверить состояние всех служб (Windows), которые настроены на автоматический запуск. Если служба не запустилась, скрипт попытается запустить ее 3 раза, и если все попытки окажутся неудачными, он должен отправить уведомление по электронной почте, чтобы мы могли проверить, что не так с этой службой на этом сервере.
Мне было интересно, существует ли уже простое решение, может быть, скрипт PowerShell?
решение1
Я бы посоветовал вам рассмотреть вариант получения NMS. Мы используем PRTG, и он хорошо работает. В нем вы можете создавать датчики, которые отслеживают службы Windows с помощью WMI. Вы можете настроить датчик для отправки почты/запуска скриптов, если служба выйдет из строя.
PRTG лицензируется по датчикам, но бесплатная версия дает вам 100, чего должно быть достаточно для пары серверов (вам нужен один датчик на службу для мониторинга)
решение2
Powershell был бы отличным способом для мониторинга этих служб. Как ни странно, я как раз сегодня читал блог об этом. Я попробую дать ссылку на скрипт, если смогу его найти, но общая суть его будет такой:
1.) Найдите службы, настроенные на автоматический запуск.
2.) Проверьте состояние сервиса.
Хитрость в том, что
get-service
Командлет не выводит никакого «StartupType», поэтому вместо него вам придется использовать WMI-объект Win32_Service.
Foreach($Server in $ServerList){
Get-WmiObject -ComputerName $Server Win32_Service |
Where-Object {$_.StartMode -eq 'Auto' -AND $_.State -eq 'Stopped'}
}
В результате вы получите список услуг, соответствующих желаемым вами параметрам.
ПРИМЕЧАНИЯ Есть пара замечаний по этому поводу:
1.) Я настоятельно рекомендую вам запускать этот скрипт через пару минут после запуска серверов, так как $_.StartMode -eq 'Auto' будет включать службы, настроенные на немедленный запуск после загрузки, И службы, настроенные на автоматический запуск после задержки.
2.) Будут службы, которые будут возвращены через эту однострочную команду, мониторинг которых вам, вероятно, не нужен. (На моем ноутбуке в IE служба под названием «TrustedInstaller» соответствовала этим критериям и была возвращена как остановленная служба :/). Поэтому вам, скорее всего, придется отфильтровать и их.
решение3
Сервис > Свойства > Восстановление
Можно выбрать действие при первых трех сбоях, включая перезапуск службы или выполнение команды.
Здесь вы также можете использоватьЗапустить программудля настройки вашего скрипта, который будет перезапускать службу, очищать файл, отправлять вам уведомления и т. д. Я полностью за скрипт NMS (Zabbix) или Powershell, но большую часть этих проблем можно решить изначально, и GPO (если применимо к вашей среде) может иметь этот набор для всех необходимых служб/машин.
решение4
Я нашел скрипт Powershell, который мне идеально подходит, мне просто нужно его немного настроить. Вот ссылкаhttp://doitcloudy.blogspot.de/2014/07/scriptgesteuerter-neustart-von-windows.html(На немецком, но текст внизу страницы полностью на английском). Однако мне нужна помощь с этой частью (строки 130 и далее):
foreach ($item in $report){
Write-Host "Starting Service " $item.Name " on server: " $item.Server -Foregroundcolor yellow
$start = Get-Date
$startSVCblock = {param($item) Start-Service -InputObject (Get-Service -ComputerName $item.Server -Name $item.Name)}
$j = Start-Job -ScriptBlock $startSVCblock -Arg $item
do {
if ($j.State -ne 'Running') { break}
$j | Receive-Job
} while (((Get-Date) - $start) -le $timeout)
}
Я вижу, что это часть, где скрипт запускает службу, но я не привык к заданиям в Powershell. Как мне отредактировать скрипт, чтобы при неудачном запуске службы он записывал имя службы в файл журнала? Может быть, с помощью try/catch?
Редактировать:
Если кто-то наткнется на это и захочет узнать, как я это решил: После долгих исследований я обнаружил, что крайне сложно записать вывод Receive-Job в файл журнала. Поэтому я выбрал другой подход: я проверяю, запущен ли сервер после завершения задания. Вот код:
foreach ($item in $report){
Write-Output "Starting Service " $item.Name " on server: " $item.Server
$start = Get-Date
$startSVCblock = {param($item) Start-Service -InputObject (Get-Service -ComputerName $item.Server -Name $item.Name)}
$j = Start-Job -ScriptBlock $startSVCblock -Arg $item
do {
if ($j.State -ne 'Running') { break}
$j | Receive-Job
} while (((Get-Date) - $start) -le $timeout)
$newService = Get-Service -ComputerName $item.Server -Name $item.Name
if ($newService.Status -ne "Running") { LogWrite "$item could not start" }
}