Задача всех разогнать пользователей со статусом дисконект с серверов.
param ( # Импортировать модуль Active Directory для Get-ADComputer CmdLet [string]$UserName = $null ) # Импортировать модуль Active Directory Import-Module ActiveDirectory # Запрос Active Directory для включенных учетных записей компьютеров серверов Windows и сортировка по имени $Servers = Get-ADComputer -Filter {(OperatingSystem -like "*windows*server*") -and (Enabled -eq "True") } | Sort Name #Get-ADComputer -Filter {(Name -like "FS*") -and (Enabled -eq "True") } | Sort Name #{(OperatingSystem -like "*windows*server*") -and (Enabled -eq "True") # Инициирующие переменные $SessionList = $NULL $queryResults = $NULL $SError = $null $SDown = $null $z = 0 # Получить общее количество серверов $count = $Servers.count # Начать цикл по каждому серверу одновременно ForEach ($Server in $Servers) { # Инициировать счетчик для отображения прогресса $z = $z + 1 $ServerName = $Server.Name # Начать вывод прогресса Write-Progress -Activity "Processing Server: $z out of $count servers." -Status " Progress" -PercentComplete ($z/$Servers.count*100) # Проверить, доступен ли сервер для пинга if (Test-Connection $Server.Name -Count 1 -Quiet) { Write-Host "`n`n$ServerName is online!" -BackgroundColor Green -ForegroundColor Black Write-Host ("`nQuerying Server: `"$ServerName`" for disconnected sessions...") -BackgroundColor Gray -ForegroundColor Black try { # Сохранять результаты в массиве $sessionQuery = query user /server:$ServerName # Если команду query user не возвращает ничего, пропускаем сервер if ($sessionQuery -notmatch '\S') { Write-Host "`nNo users found on $ServerName or no disconnected sessions." -BackgroundColor Yellow -ForegroundColor Black continue } # Преобразовать результаты в массив [array]$queryResults += ( # Запросить сервер для всех пользователей $sessionQuery | foreach { # Ищите строки со строкой "Disc", чтобы отфильтровать отключенные сеансы if ($_ -match "Disc") { # Форматировать вывод в CSV, заменяя более двух пробелов запятой write-output ("`n$ServerName," + (($_.trim() -replace ' {2,}', ','))) } } ) } catch { # Обработка случая, если пользователей нет на сервере Write-Host "`nNo users found on $ServerName or no disconnected sessions." -BackgroundColor Yellow -ForegroundColor Black } } # Если сервер не пингуется, показать сообщение об ошибке else { # Составьте список серверов, которые не работают [array]$SDown += ($ServerName) Write-Host "`nError: Unable to connect to $ServerName!" -BackgroundColor red -ForegroundColor white Write-Host "Either the $ServerName is down or check for firewall settings on server $ServerName!" -BackgroundColor Yellow -ForegroundColor black } } # Если есть какой-либо не пингующий сервер, то отобразите список if ($SDown -ne $null -and $SDown) { Write-Host "`nScript was unable to connect to the following servers:" -ForegroundColor White -BackgroundColor Red $SDown } # Проверьте, хранятся ли какие-либо отключенные сеансы в массиве if ($queryResults -ne $null -and $queryResults) { # Преобразовать формат CSV в табличный формат с заголовками $QueryResultsCSV = $queryResults | ConvertFrom-Csv -Delimiter "," -Header "ServerName","UserName","SessionID","CurrentState","IdealTime","LogonTime" # Показать результаты на консоли $QueryResultsCSV | ft -AutoSize # Пройдите каждый отключенный сеанс, хранящийся в массиве $QueryResultsCSV | foreach { # Захватить идентификатор сессии и имя сервера $Sessionl = $_.SessionID $Serverl = $_.ServerName # Показать сообщение на консоли Write-Host "`nLogging off" $_.UserName "from $Serverl..." -ForegroundColor black -BackgroundColor Gray sleep 2 # Выйти из системы, используя идентификатор сессии logoff $Sessionl /server:$Serverl /v } } else { # Если массив пуст, показать сообщение о том, что сессия не найдена Write-Host "`n`n`n`n************************************" Write-Host "You are all good! No disconnected sessions found!" -BackgroundColor Green -ForegroundColor Black Write-Host "************************************" } # Пауза в конце, чтобы можно было увидеть вывод $null = Read-Host "`n`nScript execution finished, press enter to exit!"
Similar Posts:
- Как завершить сессию на всех серверах в локальной сети.
- Как искать внутри GPO групповых политик.
- Как делегировать права управления терминальных сессий не давая полные права на сервер в windows 2012/16
- Как сбросить терминальные сессии на терминальной ферме RDS windows 2012-2016 без прав администратора
- Как отключить (отмонтировать) диск User Profile Disks в RDS Windows Server