none
Небольшой скрипт для проверки состояния Exchange 2010 Services RRS feed

  • Вопрос

  • # Переменные
    $filename = "c:\temp\CheckExchHealth.txt"
    $file = get-content $filename
    $srvs = Get-ExchangeServer | select name
    $sendmail = Send-MailMessage -to address@mail.ru -from ExchangeMonitor@mail.ru -Subject "Состояние сервисов на почтовых серверах smallcompany" -Body "см.вложение" -Attachments $filename -Priority High -SmtpServer mx01.smallcompany.local -Encoding ([System.Text.Encoding]::UTF8)
    $exit =

    # Берем список Exchange серверов, проверяем статус их сервисов, формируем лог-файл вывода для дальнейшего парсинга
    start-transcript $filename
    Foreach ($srv in $srvs){
    $svcr = Test-ServiceHealth -Server $srv.name | select ServicesNotRunning
    $test = (Test-ServiceHealth -Server $srv.name).ServicesNotRunning
    if ($test -match "MS") { #MS потому что каждая незапущенная служба начинается с MS...
            write-host -foregroundcolor Red $srv.name,$svcr.ServicesNotRunning -Error! Some of services are not running!
    }
    else {
    Write-Host -foregroundcolor Green $srv.name,$svcr.ServicesNotRunning OK! All services are running!
    }
    }
    stop-transcript

    # Проверяем лог-файл на присутствие записей о незапущенных сервисах и/или ошибках и, в случае обнаружения, посылаем email
    Foreach ($teststring in $file) {
    if ($teststring -match "error") {
    $sendmail
    $exit
    }
    else {
    $exit
    }
    }

    Понимаю, что нужно как-то завершить цикл Foreach при первом совпадении, так как email уже будет послано. Подскажите пожалуйста КАК?

    17 августа 2012 г. 6:39

Ответы

  • $srvs = Get-ExchangeServer
    
    $data = @()
    
    Foreach ($srv in $srvs){
    	$data += Test-ServiceHealth -Server $srv.name | Where {$_.ServicesNotRunning } |
            Select @{n="Name";e={$_.PSComputerName}},Role,@{n="ServicesNotRunning";e={$_.ServicesNotRunning -join ","}} 
    }
    
    if ($data)
    {
        $body = $data | Format-List | Out-String
        Send-MailMessage -to address@mail.ru -from ExchangeMonitor@mail.ru -Subject "Состояние сервисов на почтовых серверах smallcompany" `
        -Body $body -Priority High -SmtpServer mx01.smallcompany.local -Encoding ([System.Text.Encoding]::UTF8)
    }

    • Помечено в качестве ответа WeST87 17 августа 2012 г. 7:15
    17 августа 2012 г. 7:06
    Отвечающий

Все ответы

  • $srvs = Get-ExchangeServer
    
    $data = @()
    
    Foreach ($srv in $srvs){
    	$data += Test-ServiceHealth -Server $srv.name | Where {$_.ServicesNotRunning } |
            Select @{n="Name";e={$_.PSComputerName}},Role,@{n="ServicesNotRunning";e={$_.ServicesNotRunning -join ","}} 
    }
    
    if ($data)
    {
        $body = $data | Format-List | Out-String
        Send-MailMessage -to address@mail.ru -from ExchangeMonitor@mail.ru -Subject "Состояние сервисов на почтовых серверах smallcompany" `
        -Body $body -Priority High -SmtpServer mx01.smallcompany.local -Encoding ([System.Text.Encoding]::UTF8)
    }

    • Помечено в качестве ответа WeST87 17 августа 2012 г. 7:15
    17 августа 2012 г. 7:06
    Отвечающий
  • Александр, огромное спасибо. Через сплаттинг намного удобнее!
    17 августа 2012 г. 7:17
  • Александр, здравствуйте! Можно еще вопрос?

    Делается проверка на присутствие незапущенных сервисов, и в случае если они есть, выводится write-host ERROR!

    if ({$collect | select "ServicesNotRunning"} -match "\w") {
            Write-Host -foregroundcolor Red $srv.name,$svcr.ServicesNotRunning -Services not running! Error!

    Делая вывод переменной в двух разных случаях (когда есть незапущенные Exchange-сервисы, когда их нет) получаю:

    а.(нет незапущенных сервисов) PS C:\> $collect | select "ServicesNotRunning"

    ServicesNotRunning                                                                                                                         
    --------------------    

    b.(есть незапущенные сервисы) PS C:\> $collect | select "ServicesNotRunning"

    ServicesNotRunning                                                                                                                         
    --------------------                                                                                                                                           

    MSExchangeEdgeSync                                                                                                                     

    Почему в обоих случаях, при проверке if, я получаю значение True? Мне нужно именно разграничить два случая. Чтобы write-host делался только когда есть незапущенные сервисы.

    Заранее спасибо!

    14 сентября 2012 г. 6:26
  • {$collect | select "ServicesNotRunning"} - Должны быть круглые скобки,потому что данная часть не выполняется и всегда $TRUE.

    [PS] C:\Windows\system32>{$collect | select "ServicesNotRunning"}
    $collect | select "ServicesNotRunning"

    $collect | Where {$_.ServicesNotRunning} | Foreach {Write-Host -foregroundcolor Red $_.PSComputerName,$_.ServicesNotRunning -Services not running! Error!}
    14 сентября 2012 г. 6:53
    Отвечающий
  • {$collect | select "ServicesNotRunning"} - Должны быть круглые скобки,потому что данная часть не выполняется и всегда $TRUE.

    [PS] C:\Windows\system32>{$collect | select "ServicesNotRunning"}
    $collect | select "ServicesNotRunning"

    $collect | Where {$_.ServicesNotRunning} | Foreach {Write-Host -foregroundcolor Red $_.PSComputerName,$_.ServicesNotRunning -Services not running! Error!}

    Александр,спасибо!

    В такой конструкции where реагирует одинаково положительно при обоих вариант(когда незапущенные сервисы есть и когда их нет). Ощущение, что он пустые строки считает за искомые объекты.


    14 сентября 2012 г. 7:32
  • {$collect | select "ServicesNotRunning"} - Должны быть круглые скобки,потому что данная часть не выполняется и всегда $TRUE.

    [PS] C:\Windows\system32>{$collect | select "ServicesNotRunning"}
    $collect | select "ServicesNotRunning"

    $collect | Where {$_.ServicesNotRunning} | Foreach {Write-Host -foregroundcolor Red $_.PSComputerName,$_.ServicesNotRunning -Services not running! Error!}

    Александр,спасибо!

    В такой конструкции where реагирует одинаково положительно при обоих вариант(когда незапущенные сервисы есть и когда их нет). Ощущение, что он пустые строки считает за искомые объекты.


    Не верю(с).

    Вывод - $collect | Where {$_.ServicesNotRunning}

    14 сентября 2012 г. 7:40
    Отвечающий
  • И правильно делаете, что не верите :) Вы были правы-все работает! Большое спасибо!

    вывод: $collect | Where {$_.ServicesNotRunning}

    Name                                     ServicesRunning                             ServicesNotRunning                            
    -----------                                     ------------------                             ------------------                            
    srv02                                    IISAdmin,MSExchangeADTopology,MSExchangeSer... MSExchangeEdgeSync    


    14 сентября 2012 г. 7:44
  • А как правильно изменить конструкцию, чтобы при отсутствии незапущенных сервисов, делался write-host OK!

    Заранее спасибо!

    14 сентября 2012 г. 12:58
  • $collect | Foreach {
    	if($_.ServicesNotRunning)
    	{
    		Write-Host -foregroundcolor Red $_.PSComputerName,$_.ServicesNotRunning -Services not running! Error!
    		
    	}
    	else
    	{
    		Write-Host  -Foreground Green $_.Role - OK
    	}
    } 

    14 сентября 2012 г. 14:23
    Отвечающий