Задача: есть 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 }
Скрипт для перезагрузки серверов с которого снята нагрузка и нет активных пользователей. 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 каждый час двенадцать часов.
Similar Posts:
- Как сбросить все зависшие или в состоянии disconnect сессии в rpd rds ferma со всех хостов разом.
- Как перенести базу sql брокера rds windows 2016 фермы на другой сервер sql.
- Как сбросить терминальные сессии на терминальной ферме RDS windows 2012-2016 без прав администратора
- Как отключить (отмонтировать) диск User Profile Disks в RDS Windows Server
- Как делегировать права управления терминальных сессий не давая полные права на сервер в windows 2012/16