Exchange Servers Restart Powershell

Merhaba,

Özellikle büyük ortamlarda bir çok Exchange sunucusu yöneten kişiler için ihtiyaç olacığını düşündüğüm aynı zamanda da kendi ihtiyacımı gidermek için geliştirdiğim, Exchange sunucularını kontrollü bir şekilde restart eden script’i sizinle paylaşmak istedim.

Script, $servers parametresine tanımladığınız Exchange sunucularını sırası gerekli kontrolleri yapıyor ve restart ediyor.

Bu aşamalar şu şekildedir;

  1. Exchange sunucusuna git connection testi yap başarılı ise ikinci adıma geç değilse tekrar dene..
  2. Exchange sunucunun ServerComponent’lerini kontrol et Active olmayan varsa Active set et.
  3. Herbir MB DB için CopyQueue, ReplayQueue 5’den büyük ve MailboxDB status Healthy ve Mounted’dan farklı ise 30 sn bekle tekrar dene, değil ise True değerini dön.
  4. 1,2,3. aşamalar sonucu Checkstatus fonksiyonu başarılı döndü ise sunucu üzerinde active mailbox’ları move et.
  5. Tekrar Check(1,2,3. aşamalar) fonksiyonunu çağır, Return true ise makinayı restart et ve 5 dk bekle değilse tekrar Checkstatus..
  6. Tekrar Check(1,2,3. aşamalar) fonksiyonunu çağır, Return true ise bir sonraki sunucuya geç ve 1,2,3,4,5,6. aşamları gerçekleştir değilse tekrar CheckStatus
#$UserCredential = Get-Credential
#$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://exchangeserver.contoso/PowerShell/ -Authentication Kerberos -Credential $UserCredential
#Import-PSSession $Session -DisableNameChecking

Add-PSSnapin *exch*
$servers = "exchangeserver01.contoso","exchangeserver02.contoso"

Function CheckStatus
{

Param($Server)

    Try
    {
        $testConn = Test-NetConnection -ComputerName $Server -ErrorAction Stop -WarningAction Stop
        Write-Host -ForegroundColor Green "Checking connection to " $Server  ".."
        If($testConn.PingSucceeded -notlike "True"){
            Start-Sleep -Seconds 30
            CheckStatus -Server $Server
        }
        else
        {
        
            
    $MailboxDBs = Get-MailboxDatabaseCopyStatus -Server $server -ErrorAction Stop -WarningAction Stop

    $ComponentStates = Get-ServerComponentState -Identity $server | ? {$_.State -ne "Active"}

    If($ComponentStates.count -ne 0)
    {
        foreach($c in $ComponentStates.Component)
        {

            Set-ServerComponentState -Identity $server -Component $c -Requester Maintenance  -State Active
            Write-Host -ForegroundColor Green  $Server  " Components are set to Active"        
        }
    }

        foreach($MailboxDB in $MailboxDBs)
        {
        
            $CopyQueue = $MailboxDB.CopyQueueLength
            $ReplayQueue = $MailboxDB.ReplayQueueLength
            $MBStatus = $MailboxDB.Status

        if(($CopyQueue -gt 5) -or ($ReplayQueue -gt 5) -or ($MBStatus -notmatch "Healthy" -and $MBStatus -notmatch "Mounted"))
        {
             Start-Sleep -Seconds 30
             Write-Host -ForegroundColor Red $server " is not ready.. It will retry after 30 seconds"
             CheckStatus -Server $Server #until it letter then 5 Queues

        }else{return $true}

        }                  
}
    }Catch
    {
        Start-Sleep -Seconds 30
        CheckStatus -Server $Server
    }
              
}
 

foreach($server in $servers)
 {
    
        Try
        {
        $testHealthS1 = CheckStatus -Server $server
        }Catch
        {
        Write-Host -ForegroundColor Red "HealtCheck Process Failed..."        
      
        }

        If($testHealthS1 -eq "True")
        {
            Try
        {
            Move-ActiveMailboxDatabase -Server $server -SkipLagChecks -SkipMoveSuppressionChecks -ErrorAction Stop -WarningAction Stop -Confirm:$false

        }Catch
        {
            Write-Host -ForegroundColor Red "HealtCheck Process Failed..." 
            Break;
        }        

        $testHealthS2 = CheckStatus -Server $server                                   

        If($testHealthS2 -eq "True")
        {
            Restart-Computer -ComputerName $server
            Write-Host -ForegroundColor Green $server " is restarting!"
            Start-Sleep -Seconds 300
        }else
        {
            Write-Host -ForegroundColor Red "HealtCheck Process Failed..."
            Break;
        }
        $testHealthS3 = CheckStatus -Server $server                                   

        If($testHealthS3 -eq "True")
        {            
            Write-Host -ForegroundColor Green $server " is restarted!"
                        
        }else
        {
            Write-Host -ForegroundColor Red "HealtCheck Process Failed..."
            Break;
        }      
    }
 }

Umarım faydalı olmuştur, sorularınızı ayyildizrdm@gmail.com adresine gönderebilirsiniz.

Teşekkürler,

About the Author

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir