Как завершить сессию на всех серверах в локальной сети.

Проблема при смене пароля на серверах остались отключенные сессии . Из-за этого блокируется учётная запись. Надо сессию завершить на всех серверах . но так как серверов больше 500 в ручную делать это негуманно к себе.

вот скрипт . Запускается от пользователя которого надо завершить

param (
        #get current logged on username
        [string]$UserName = $env:USERNAME
    )

    # Импортировать модуль Active Directory для Get-ADComputer CmdLet
    Import-Module ActiveDirectory


    # Запрос Active Directory для включенных учетных записей компьютеров серверов Windows и сортировка по имени
    $Servers = Get-ADComputer -Filter {(OperatingSystem -like "*windows*server*") -and (Enabled -eq "True")} | Sort Name

    
# Инициирующие переменные
    $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 under UserName: `"" + $UserName.ToUpper() + "`"...") -BackgroundColor Gray -ForegroundColor Black

           # Сохранять результаты в массиве
            [array]$queryResults += (

               # Запросить сервер для определенного имени пользователя
                query user $UserName /server:$ServerName | 
                foreach {
                   # Ищите строки со строкой диска, чтобы отфильтровать активные сеансы
                    if ($_ -match "Disc") {

                        # форматировать вывод в CSV, заменяя запятую более двух пробелов
                        write-output ("`n$ServerName," + (($_.trim() -replace ' {2,}', ',')))
                    }
                }
            )
        }
        # Если сервер не пингуется, показать сообщение об ошибке
        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 server:" -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

        # Пройдите каждый сеанс Disconnected, хранящийся в массиве
        $QueryResultsCSV | foreach {

           # Grabb идентификатор сессии и имя_сервера
            $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("*" * $LineSize)
        Write-Host "You are all good! No ghost sessions found!" -BackgroundColor Green -ForegroundColor Black
        Write-Host ("*" * $LineSize)
    }

    # Пауза в конце, чтобы вы могли захватить вывод
    $null = Read-Host "`n`nScript execution finished, press enter to exit!"

 

 

Similar Posts: