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

Как сделать плановую перезагрузку серверов RD host windows 2016, со снятием нагрузки и возвращением её после ребута.

Задача: есть 7 серверов rd host sesion . Необходимо раз в неделю перезагружать сервер.

Скрипт по снятию подключений с rd host. Запускается в 18-00

Скрипт для запуска через cmd stop rdsh to day.bat

powershell -NoLogo -ExecutionPolicy Bypass -File "%~dp0\stop rdsh to day.ps1"
$dp0         = ($MyInvocation.MyCommand.Path | Split-Path -Parent)
#$dp0 = "C:\Scripts\Restart-RDSH"
$RDSCollection = "Farm"
$activbrocer= Get-RDConnectionBrokerHighAvailability 


# Get the current day
$date = Get-Date;

# determine the day, month, and year
$curDay = $date.DayOfWeek;
$curMonth = $date.Month;
$curYear = $date.Year;

# get total days in month
$totalDaysInMonth = [DateTime]::DaysInMonth($curYear, $curMonth);

switch($curDay){
    "Monday" {
        # this is where we want to be
        $offset = 0;
    }
    "Tuesday"{
        $offset = -1;
    }
    "Wednesday"{
        $offset = -2;
    }
    "Thursday"{
        $offset = -3;
    }
    "Friday"{
        $offset = -4;
    }
    "Saturday"{
        $offset = -5;
    }
    "Sunday"{
        $offset = -6;
    }
}

# Lets determine the start of the week
$startOfWeek = $date.AddDays($offset);
$endOfWeek = $startOfWeek.AddDays(6);


#Write-Host $startOfWeek.AddDays(0);

#Write-Host  $date ;


if ($date -eq $startOfWeek.AddDays(0))
 {
    $list = "$dp0\server 1.txt"
}
 elseif ($date -eq $startOfWeek.AddDays(1)) 
 {
    $list = "$dp0\server 2.txt"
}
 elseif ($date -eq $startOfWeek.AddDays(2)) 
 {
    $list = "$dp0\server 3.txt"
}
 elseif ($date -eq $startOfWeek.AddDays(3)) 
 {
    $list = "$dp0\server 4.txt"
}
 elseif ($date -eq $startOfWeek.AddDays(4)) 
 {
    $list = "$dp0\server 5.txt"
}
 elseif ($date -eq $startOfWeek.AddDays(5)) 
 {
    $list = "$dp0\server 6.txt"
}

 elseif ($date -eq $startOfWeek.AddDays(6)) 
 {
    $list = "$dp0\server 7.txt"
}

#Write-Host $list


$hosts = Get-Content -Path $list -Encoding "UTF8"

ForEach ($serv in $hosts) {
    Write-Host "Processing $serv"
    Set-RDSessionHost -ConnectionBroker $activbrocer.ActiveManagementServer -SessionHost $serv -NewConnectionAllowed  No
}

 

Как сделать плановую перезагрузку серверов RD host windows 2016, со снятием нагрузки и возвращением её после ребута.

Как сделать плановую перезагрузку серверов RD host windows 2016, со снятием нагрузки и возвращением её после ребута.

Скрипт для перезагрузки серверов с которого снята нагрузка и нет активных пользователей. Restart-RDSH.ps1

Скрипт для запуска через cmd Restart-RDSH.cmd

$dtstamp = Get-Date -Format "yyyy-MM-dd"
$RDSCollection = "Farm"
$activbrocer = if (Get-RDConnectionBrokerHighAvailability -ConnectionBroker  "DCB01.adminbd.ru")
{Get-RDConnectionBrokerHighAvailability -ConnectionBroker  "RDCB01.adminbd.ru"}
else 
{Get-RDConnectionBrokerHighAvailability -ConnectionBroker  "RDCB02.adminbd.ru"}

$hosts = Get-RDSessionHost -CollectionName $RDSCollection -ConnectionBroker $activbrocer.ActiveManagementServer
$hosts = $hosts | Where { $_.NewConnectionAllowed -eq "No" }
$log = '<html>
        <body>
     <p class="MsoNormal">AutoRebootScript Log</p>`n'

ForEach ($h in $hosts) {
    $serv = $h.SessionHost
    $users = Get-RDUserSession -CollectionName $RDSCollection -ConnectionBroker $activbrocer.ActiveManagementServer
    $tmp = $Users | where {($_.HostServer -eq $serv) -and (($_.SessionState -ne "STATE_DISCONNECTED") -or (($_.SessionState -eq "STATE_DISCONNECTED") -and ($_.IdleTime -le 900000)))}
    Write-Host "Processing $serv"
    $log += '<p>Обработка $serv </p>`n'
    $cnt = $tmp.Count
    Write-Host "Sessions count: $cnt"
    $log += '<p>Количество сессий: $cnt </p>`n'
    if ($cnt -eq 0) {
        Write-Host "Sending reboot command"
        $log += '<p>Посылаю команду на перезагрузку </p>`n'
        Restart-Computer -ComputerName $serv -Force
        #pings
        Write-Host "Pinging"
        $flagNoPing  = $false
        $flagRetPing = $false
        $pingCnt     = 0
        $pingSuccess = 0
        $Error.Clear()
        While (-not (($flagNoPing -and $flagRetPing) -or ($pingCnt -ge 600))) {
            Test-Connection -Count 1 $serv -ErrorAction SilentlyContinue | Out-Null
            Start-Sleep 1
            $pingCnt++
            if($Error[0]) {
                Write-Host "!" -NoNewline
                $flagNoPing = $true
                $pingSuccess = 0
            } else {
                Write-Host "." -NoNewline
                if ($flagNoPing) {
                    $pingSuccess ++
                    if ($pingSuccess -ge 10) {
                        $flagRetPing = $true
                    }
                }
            }
            $Error.Clear()
        }
        Write-Host "."
        if ($pingCnt -ge 600) {
            if (-not $flagNoPing) {
                Write-Host "Server probably not rebooted (5 min timeout)"
                $log += '<p color="red"><b>Пинг не был потерян, возможно сервер не ушёл в перезагрузку за 5 минут</b></p>`n'
            }
            if ($flagNoPing -and -not $flagRetPing) {
                Write-Host "Server probably not up (5 min timeout)"
                $log += '<p color="red"><b>Пинг был потерян и не вернулся, возможно сервер не вышел из перезагрузки за 5 минут</b></p>`n'
            }
        } else {
            Write-Host "Returning connections"
            $log += '<p>Возвращаю нагрузку </p>`n'
            $Error.Clear()
            Set-RDSessionHost -SessionHost $serv -NewConnectionAllowed Yes -ConnectionBroker $activbrocer.ActiveManagementServer
            if($Error[0]) {
                $log += '<p color="red"><b>Ошибка возвращения нагрузки: </b></p>`n'
                foreach ($E in $Error) {
                		$log += '<p color="red"><b> $E.Exception.Message </b></p>`n'
                }
            }
        }
    } else {
        Write-Host "Skipping $serv"
        $log += '<p color="red"><b>Пропускаю $serv </b></p>`n'
    }
}
$log += '<br><p color="red"><b>Пожалуйста проверьте:</b></p><ul>`n'
$log += '<li>Сервера с ошибкой</li>`n'
$log += '<li>Возможность подключиться на обработаные сервера</li>`n'
$log += '<li>Статус возможности подключения на обработаных серверах</li></ul>`n'
$log += '</html>'

#Write-Host $log

#Send-MailMessage -SmtpServer "tech.adminbd.ru" `
#		-From "report@tech.adminbd.ru" `
#		-To "admins@adminbd.ru" `
#		-Subject "Отчёт автоперезагрузки $dtstamp" `
#		-BodyAsHtml `
#		-Body $log `
#		-Encoding utf8

 

powershell -NoLogo -ExecutionPolicy Bypass -File "%~dp0\Restart-RDSH.ps1"

Запускается с 21-00 каждый час двенадцать часов.

 

Как сделать плановую перезагрузку серверов RD host windows 2016, со снятием нагрузки и возвращением её после ребута.

Как сделать плановую перезагрузку серверов RD host windows 2016, со снятием нагрузки и возвращением её после ребута.

Similar Posts:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *