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

Как разлогинеть (logoff) всех пользователей со статусом disconnect со всех серверов windows в domain.

Задача всех разогнать пользователей со статусом дисконект с серверов.

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:

Метки:

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

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

Яндекс.Метрика