Посмотреть активных пользователей windows server 2019

С чего начинается администрирование пользователей на сервере терминалов? Конечно с просмотра «Активных» или «Отключенных» сессий пользователей.

С чего начинается администрирование пользователей на сервере терминалов?

Конечно с просмотра «Активных» или «Отключенных» сессий пользователей.

Без этой картины администрирование сервера терминалов невозможно.

И так, конечно мы должны во всех подробностях видеть, что у нас происходит на сервере терминалов!

Какие процессы запущены от имени тех или иных пользователей их идентификаторы, id сессий пользователей, это и многое другое помогает администратору всегда быть в курсе того что происходит на сервере и соответственно всем этим управлять, и вовремя реагировать на различные ситуации.

На разных версиях Windows server  администраторы по-разному решают этот вопрос.

Кто-то смотрит пользователей используя простой «Диспетчер задач» на Windows server 2012 – 2022. Некоторые используют различные команды в CMD, ну а кое-кто использует PowerShell .

Но все администраторы хотят одного:

1.  Чтоб быстро посмотреть всех пользователей кто работает на сервере.

2.  Чтоб это было как можно информативней.

3.  Чтоб бесплатно.

Поэтому поводу решил собрать все лучшие, простые и быстрые способы которые (на мое мнение) стоит использовать.

Уверен, что многим начинающим администраторам эти способы помогут в администрировании сервера терминалов.

И так способ первый и самый простой (На Windows server 2012 — 2022)

1.     Диспетчер задач.

«Диспетчер задач» — вкладка «Пользователи» — позволяет нам видеть пользователей, которые работают на этом сервере.

Dispetcher_Zadach_Windows_server_2012_r2

Но по умолчанию стандартный «Диспетчер задач» — вкладка «Пользователи» нам не покажет, что пользователь работает на сервере удаленно, используя RDP, хорошо, что это можно легко исправить.

Правый клик мышкой на панели «Пользователь» и в появившимся контекстном меню

ставим птичку напротив «Сеанс» а также стоит поставить и напротив «Имя клиента».

Dispetcher_Zadach_Windows_server_2022_r2

Так мы будем знать, что этот пользователь работает у нас на сервере через RDP.

Минусы данного способа здесь очевидны, чтоб смотреть пользователей мы должны находится на сервере терминалов, где собственно и запускаем «Диспетчер задач», нет возможности сделать какую-то выборку, фильтр и т.д. 

2.     quser

Следующий метод это использование команды quser в CMD или PowerShell.

Quser – это аналог QUERY USER (Такое сокращение позволяет выполнять команду быстрее)

Здесь все просто запускаем CMD или PowerShell и пишем команду quser

Power shell quser

Так мы увидим всех пользователей, что работают на этом сервере.

Метод очень простой быстрый и достаточно информативный.

Он покажет Вам — Пользователя, Сеанс, его ID, Статус , Бездействие сеанса, и время входа.

Если мы хотим посмотреть только какого-то конкретного пользователя, тогда можно написать например так:

Пример: 

Term01 – это логин пользователя.

Power shell quser 2

Большинство системных администраторов отдают предпочтение именно этому способу.

И не только потому, что быстро, просто и т.д., но и потому что можно смотреть удаленно всех пользователей, сидя за своим ПК, где не будь в локальной сети.

И для этого достаточно ввести команду с параметром SERVER

Пример: 

quser /server 192.168.128.50

Вместо IP можно указать (хост) имя сервера терминалов.

Power shell quser 5

Формат командной строки:

QUSER [; пользователь ; | ; имя сеанса ; | ; ID сеанса ;] [/SERVER:; сервер ;]

3.     query user    

Query user  делает все что и команда quser. 

Использовать ее можно также как в CMD так и в PowerShell.

Также возможно выполнить и удаленно

Пример: 

query user /server 192.168.128.50

query user 

4.     query session       

Эта команда позволяет получить список всех сеансов (активных и неактивных), которые выполняются на сервере терминалов. Команда query session имеет такой синтаксис:

Использовать ее можно также как в CMD так и в PowerShell.

Также возможно выполнить и удаленно

Пример: 

query session /server 192.168.128.50

query user 

У команды есть интересные параметры, такие как, например получение некоторой статистики подключений.

Пример: 

query session /server 192.168.128.50 /counter

query session /counter

В общем, еще одна неплохая команда для получения пользователей, что работают на сервере.

5.     Qwinsta

Qwinsta это аналог query session, по этой причине описывать ее не буду. Работает все аналогично, вот только набрать ее можно быстрее, а соответственно и выполнить.

Qwinsta

Теперь, когда выше перечисленные способы у Вас по каким-то причинам не сработали, или не подошли, тогда можно обратиться к сторонним компонентам.

6.     Get-TerminalSession

Иногда может понадобится проверить какие в данный момент залогинены в системе, то есть являются активными. Такую информацию можно использовать для аудита, например для проверки какие учетные записи за какими компьютерами сидят или для последующей перезагрузки сервера, что бы не останавливать работу коллег. В примерах ниже рассмотрено как выполнять удаленные команды для получения активных пользователей и возврата включенных пользователей Active Directory.

Получение имени залогиненного пользователя

Я не могу вспомнить готовую команду Powershell, которая бы вернула логин пользователя, но такая возможность есть через WMI:

Get-WmiObject -Class Win32_ComputerSystem | Select-Object UserName

Есть еще вариант использовать CIM, который может работать немного быстрее:

Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object UserName

Залогиненные пользователи с Win32_ComputerSystem и Win32_ComputerSystem

Обе команды могут работать удаленно если добавить атрибут ComputerName:

Get-WmiObject -ComputerName 'localhost' -Class Win32_ComputerSystem | Select-Object UserName

Получение активных сеансов в Powershell удаленно

Если вы планируете выполнять эти команды удаленно, то может понадобится выполнить предварительные настройки в виде открытия портов и необходимых правах.

Получить только имя пользователя можно так:

$userinfo = Get-WmiObject -ComputerName 'localhost' -Class Win32_ComputerSystem
$user = $userinfo.UserName -split '\'
$user[1]

Получение имени залогиненного пользователя в Powershell удаленно

Как вы знаете в Winodws есть так же параллельные сеансы сервисов. Если вам нужно вернуть имена этих аккаунтов нужно использовать класс «win32_LoggedOnUser»:

Get-CimInstance -ComputerName 'localhost' -Class win32_LoggedOnUser | ft

Получение всех активных сеансов пользователей в Powershell

Получение списка компьютеров

Если у вас нет списка компьютеров к которым вы планируете подключиться и узнать активного пользователя — это можно сделать через AD. На примере ниже будут возвращены все компьютеры:

Get-ADComputer -Filter *

Получение списка компьютеров в Powershell

Операция по получению списка компьютеров может быть очень долгой, если у вас большой парк ПК в AD. Вы можете вернуть только компьютеры, которые не отключены в AD (Disable) следующим способом:

Get-ADComputer -Filter * | where Enabled -eq $True

Получение включенных компьютеров AD в Powershell

Можно использовать и фильтрацию. Так я верну компьютеры имена которые начинаются на «CL»:

Get-ADComputer -Filter {Name -like 'CL*'} | where Enabled -eq $True

Фильтрация списка компьютеров в Powershell

Получить список имен мы можем так:

$pc = Get-ADComputer -Filter {Name -like 'CL*'} | where Enabled -eq $True
$pc.Name

Фильтрация списка компьютеров в Powershell

Если у вас список компьютеров не относится к AD или имеет другой формат — то просто преобразуйте его в массив:

# Текст с именами компьютеров
$pc = 'Computer1,Computer2,Computer3'
# Преобразование в массив
$pc_array = $pc -split ','
$pc_array

Split в Powershell 

Удаленное получение залогиненных пользователей

Выше уже рассматривался вариант получения имени пользователя удаленно используя WMI и CIM. Если обе команды, то всех  пользователей активных в данный момент мы можем получить так:

# Текст с именами компьютеров
$computers = (Get-AdComputer -Filter *).Name
# Удаленное получение пользователей
foreach ($computer in $computers){
    Get-CimInstance -ComputerName $computer -ClassName Win32_ComputerSystem | Select-Object UserName
}

Такой подход может привести к ошибкам так как мы не проверяем включены ли компьютеры:

Обход ошибок в Powershell

Мы можем просто не выводить ошибки с помощью «-ErrorAction SilentlyContinue» или заранее пинговать (что было бы правильнее с точки зрения времени выполнения). В примере ниже я так же разбиваю имя компьютера и логин в более удобный формат:

# Текст с именами компьютеров
$computers = (Get-AdComputer -Filter *).Name
# Удаленное получение имен учетных записей
foreach ($computer in $computers){
    $result = Get-CimInstance -ComputerName $computer -ClassName Win32_ComputerSystem -ErrorAction SilentlyContinue
    $computer_login = $result.UserName -split '\'
    if ($computer_login){
        Write-Host 'ComputerName: ' $computer_login[0]
        Write-Host 'UserName: ' $computer_login[1]
       }
}

Обход ошибок в Powershell с ErrorAction

Если вы не хотите выполнять команды удаленно через WMI, то вы можете использовать PSRemoting. От так же требует предварительных настроек, которые описаны в статье «Удаленное управление через Powershell». Команда, которая использует PSRemoting, будет выглядеть примерно так же:

# Текст с именами компьютеров
$computers = (Get-AdComputer -Filter *).Name
# Удаленное получение имен учетных записей
foreach ($computer in $computers){
    $result = Invoke-Command -ComputerName $computer `
          -ScriptBlock {
              Get-WMIObject -ClassName Win32_ComputerSystem `
                            -ErrorAction SilentlyContinue
                       } `
          -ErrorAction SilentlyContinue
    $computer_login = $result.UserName -split '\'
    if ($computer_login){
        Write-Host 'ComputerName: ' $computer_login[0]
        Write-Host 'UserName: ' $computer_login[1]
       }
}

Получение списка активных сеансов пользователей в Powershell

Получение включенных пользователей AD

Если вам нужно вернуть учетные записи, которые включены в AD выполните следующую команду:

Get-AdUser -Filter * | where 'Enabled' -eq $True

Фильтрация включенных пользователей в AD с Powershell

Для возврата только отключенных учетных записей используйте $False.

Такой подход работает и с объектами компьютеров в AD:

Get-AdComputer -Filter * | where 'Enabled' -eq $False

Для последующей выгрузки данных в Excel почитайте статью «Как в Powershell выгрузить из AD пользователей и группы CSV».

Whoami или WMI

Вы можете вспомнить команду, которая так же возвращает имя пользователя:

whoami

whoami в Powershell

Как можно увидеть она вернет ту же информацию, что и класс WMI. Ситуация меняется, когда эти команды используются удаленно:

# Пользователь вошедший в Windows и открывший Powershell
whoami
# Пользователь, который будет удаленно подключатся через Powershell
$new_psuser = Get-Credential 'admin'
# Способ с whoami
Invoke-Command -ComputerName 'localhost' `
               -Credential $new_psuser `
               -ScriptBlock {whoami}
# Способ с WMI
Invoke-Command -ComputerName 'localhost' `
               -Credential $new_psuser `
               -ScriptBlock {(Get-WmiObject -Class Win32_ComputerSystem).UserName}

Разница WMI и whoami в Powershell

Как видно, в случае с whoami у нас вернулось имя учетной записи выполнившей команду Powershell, а с WMI пользователь Windows. 

Теги:

#powershell

#wmi

#ad

Рассмотрим такие команды как:

  • query
  • qwinsta (query session)
  • quser (query user)
  • mstsc (RDS shadow)
  • msg
  • change logon
  • shutdown

query

query — Отображение информации о процессах; сеансах; пользователя, вошедших на сервер; и серверах, обслуживающих подключение к удаленному рабочему столу

process | session | termserver | user

Более подробно здесь рассмотрятся команды:

query session
query user

а точнее их более короткие аналоги: qwinsta и quser


qwinsta

qwinsta (эквивалент query session) — Отображение информации о сеансах служб удаленных рабочих столов.

С помощью этой команды можно узнать, активен ли сеанс пользователя и ID сеанса

Просто команда без каких либо ключей и параметров выводит список сеансов на текущем сервере:

qwinsta

Ключ /server позволит указать другой сервер:

qwinsta /server:servername

Показать информацию о сеансе конкретного пользователя:

qwinsta username

Также можно узнать информацию о сеансе пользователя на другом сервере:

qwinsta username /server:servername

Остальные параметры и подробная справка по команде:

qwinsta /?

quser

quser (эквивалент query user) — Отображение информации о пользователях, вошедших в систему

Позволит помимо прочего узнать также время входа и время бездействия сеанса — весьма полезная информация в определенных случаях.

В остальном, все ключи у возможности, такие же как и у команды qwinsta:

quser 

Ключ /server позволит указать другой сервер:

 quser /server:servername

Показать информацию о конкретном пользователе:

quser username 

Показать информацию о конкретном пользователе на другом сервере:

quser username /server:servername

Справка и все функции:

quser /?

RDS shadow (mstsc)

RDS Shadow — теневое подключение к сеансу пользователя

Для того, чтобы узнать ID сеанса, нужно воспользоваться одной из вышеупомянутых команд: qwinsta или quser

Теневое подключение без возможности управления сеансом (только просмотр):

 mstsc /shadow:ID 

Теневое подключение для управления другим сеансом:

mstsc /shadow:ID /control

ключ /v:servername позволит подключиться к сеансам другого сервера:

 mstsc /v:servername /shadow:ID /control 

msg

msg — отправить сообщение пользователю

Для того, чтобы отправить сообщение в сеанс всем пользователям, нужно воспользоваться командой:

msg * your message here

Можно отправить сообщение конкретному пользователю — по его логину, имени сеанса или ID сеанса. Например, так мы скажем пользователю с ID сеанса 12, что ему необходимо выйти из системы:

 msg 12 Срочно завершите сеанс!

ID сеанса можно узнать с помощью уже рассмотренных команд qwinsta или quser


change logon

change logon — включение / отключение входа на терминальный сервер

Полностью отключить вход в терминальные сессии можно командой:

change logon /disable

Включение входа:

change logon /enable

Все возможные ключи смотрим в справке:

change logon /?

shutdown

shutdown — перезагрузка или выключение компьютера. С необходимыми параметрами команда может быть использована для перезагрузки текущего компьютера/сервера, отложенной перезагрузки, удаленной перезагрузки другого компьютера, группы компьютеров, серверов и т.п. Команда имеет множество опций.

Так, например, команда shutdown со следующими параметрами:

shutdown /r /f /t 180 /c "комментарий для перезагрузки"

перезагрузит ваш сервер (/r) спустя 180 секунд (/t 180), принудительно закроет все приложения (/f, используется при указании /t) и укажет причину перезагрузки или комментарий для пользователей (/c «комментарий для перезагрузки»).

Удаленно перезагрузить или выключить компьютер или группу компьютеров через GUI можно командой

shutdown /i

На чтение 5 мин Просмотров 2.8к. Опубликовано 21.12.2021

Появился интерес мониторить с помощью Zabbix сессии пользователей подключающихся к Windows серверу по RDP. Использовать данную возможность можно как для целей мониторинга производительности сервера, так и для целей безопасности. С точки зрения безопасности можно записывать и уведомлять о том какие именно пользователи подключены к серверу. Это полезно для мониторинга подключения к серверам не являющихся терминальными для отслеживания административных подключений. Как установить и минимально настроить Zabbix хорошо показано здесь.

Содержание

  1. Как узнать кто подключен к серверу по RDP в консоли
  2. Список пользователей из qwinsta в Powershell
  3. Настройка на стороне сервера в Zabbix Agent
  4. Шаблон мониторинга RDP подключений для Zabbix 5.4
  5. Скачать шаблон и скрипты с Github

Как узнать кто подключен к серверу по RDP в консоли

За основу решения взял консольную команду qwinsta, которая отображает все активные подключения к серверу по RDP и на консоль. Запущенная без параметров она просто выведет список всех подключений в виде таблицы:

C:UsersDyachenko>qwinsta
 СЕАНС             ПОЛЬЗОВАТЕЛЬ             ID  СТАТУС  ТИП         УСТР-ВО
 services                                    0  Диск
>console           Dyachenko                 1  Активно
 31c5ce94259d4...                        65536  Прием
 rdp-tcp                                 65537  Прием

Чтобы посчитать количество пользователей можно перенаправить вывод этой команды в команду find и отфильтровать только rdp подключения, а с ключом /c посчитать количество строк — это и будет число подключенных пользователей по RDP.

qwinsta | find /i "rdp-tcp#" /c

Эту команду ровно в таком виде можно использовать в сенсоре Zabbix для подсчета количества подключенных пользователей, рисовать на ее основе график и слать алерты. Но мне захотелось так же отображать в дашборде и алертах список логинов пользователей.

Список пользователей из qwinsta в Powershell

Для этих целей я нагуглил готовое решение и буквально двумя последними строчками доработал его под свои нужды. Я пытался сначала реализовать подобное с помощью bat-скрипта, но в итоге оказалось быстрее и проще на powershell. Вот сам скрипт:

 function Get-TSSessions {
    param(
        $ComputerName = "localhost"
    )

    qwinsta /server:$ComputerName |
    #Parse output
    ForEach-Object {
        $_.Trim() -replace "s+",","
    } |
    #Convert to objects
    ConvertFrom-Csv
}


#Get-TSSessions -ComputerName "localhost"
Get-TSSessions -ComputerName "localhost" | where -Property СЕАНС -Like "rdp-tcp#*" | select ПОЛЬЗОВАТЕЛЬ -ExpandProperty ПОЛЬЗОВАТЕЛЬ
Get-TSSessions -ComputerName "localhost" | where -Property SESSIONNAME -Like "rdp-tcp#*" | select USERNAME -ExpandProperty USERNAME 

Что он делает:

Функция получает список подключений с помощью qwinsta, после чего все пробелы в выводе меняются на запятые и полученный csv конвертируется в объект powershell, с которым потом очень удобно работать.

Последние две строки собственно получают объекты и выводят столбиком список пользователей без заголовка. Кусок кода с условием where отвечает за то, чтобы вывести только пользователей подключенных по RDP. Если вам нужно так же мониторить тех кто подключен к консоли сервера то необходимо будет эту часть отредактировать.

Два варианта вызова с русским и английским написанием параметров объекта нужны чтобы одинаково работать как на Windows Server с русской локализацией так и с английской. Если будете использовать на сервере с альтернативной локализацией, то раскоментируйте строчку #Get-TSSessions -ComputerName «localhost» и посмотрите вывод объекта, там будут все поля которые нужно прописать по аналогии с русским и английским вариантом.

Настройка на стороне сервера в Zabbix Agent

Все протестировано на серверах под управлением Windows Server 2012, 2016, 2019. В качестве Zabbix Agent использовалась версия Zabbix Agent 2 v 5.4.8. Агент установлен в папку c:zabbix в которой используется следующая структура:

  • c:zabbixconf.d — папка с подключаемыми конфигами;
  • c:zabbixscripts — папка со скриптами для сбора различных параметров для сенсоров Zabbix.

Если у вас другая структура каталогов и размещение агента то внесите соответствующие коррективы. Конфиг для мониторинга подключений по RDP следующего содержания:

UserParameter=rdps[*],qwinsta.exe | find /i "rdp-tcp#" /c
UserParameter=rdp_users[*],powershell.exe -NoProfile -ExecutionPolicy bypass -File "C:zabbixscriptsts_users.ps1"

Необходимо положить в папку conf.d, а представленный выше скрипт в папку scripts.

Шаблон мониторинга RDP подключений для Zabbix 5.4

Данный шаблон добавляет 2 сенсора собирающие данные по количеству подключенных пользователей и их логины, 2 тригера с уровнем «Информация» для отображения на дашборде, а так же график для отрисовки количества подключений. График можно использовать для сравнительного анализа загрузки сервера с количеством подключенных пользователей и таким образом иметь дополнительный индикатор необходимости увеличения ресурсов.

zabbix_export:
  version: '5.4'
  date: '2021-12-21T09:38:18Z'
  groups:
    -
      uuid: 7df96b18c230490a9a0a9e2307226338
      name: Templates
  templates:
    -
      uuid: d6d88a7e91e649a59825a04299287151
      template: 'Template RDP User sessions'
      name: 'Template RDP User sessions'
      groups:
        -
          name: Templates
      items:
        -
          uuid: 5f7ee37d4ab541138238b3166d906787
          name: 'RDP Open Sessions'
          key: rdps
          tags:
            -
              tag: Application
              value: Security
          triggers:
            -
              uuid: 0598b2cf3f4a44a894999de4eccbe115
              expression: 'last(/Template RDP User sessions/rdps)>0'
              name: 'Open Sessions on {HOST.NAME}'
              opdata: 'Users: {ITEM.LASTVALUE1}'
              priority: INFO
        -
          uuid: 7e507bc13ee54124ab7dd9497738ddfd
          name: 'RDP User Sessions'
          key: rdp_users
          trends: '0'
          value_type: TEXT
          tags:
            -
              tag: Application
              value: Security
          triggers:
            -
              uuid: 5992e489b8b145b0a921b94ac67d003f
              expression: 'last(/Template RDP User sessions/rdp_users,#1)<>""'
              name: 'Users on {HOST.NAME}'
              opdata: 'Users: {ITEM.LASTVALUE1}'
              priority: INFO
  graphs:
    -
      uuid: 9f890c1d1b094e20b2d7e4c152c95f5b
      name: 'RDP Users'
      show_triggers: 'NO'
      graph_items:
        -
          sortorder: '1'
          drawtype: GRADIENT_LINE
          color: 199C0D
          item:
            host: 'Template RDP User sessions'
            key: rdps

Вот как выглядит результат в веб-консоли Zabbix.

zabbix rdp monitoring

Мониторинг RDP сессий в Zabbix
rdp session graph zabbix
График RDP сессий в Zabbix

Скачать шаблон и скрипты с Github

Для удобства залил все наработки на github https://github.com/dkplayer/zabbix-windows-rdp-users

Вопросы, дополнения и здравая критика приветствуются в комментариях.

тогда такой вариант (powershell):

$owners = @{}
get-process -ComputerName ИМЯ.КОМПЬЮТЕРА | select processname,Id,@{l="Owner";e={$owners[$_.id.tostring()]}} | sort "owner"

это выведет все процессы на удалённом компьютере. Если пользователь будет залогинен — он будет в списке. Пример:

ProcessName              Id Owner
-----------              -- -----
System                    4
Idle                      0
ipoint                 3556 Admin
igfxEM                 4620 Admin
itype                  3548 Admin
jucheck                3628 Admin
jusched                6660 Admin
SystemSettings         9204 Admin
svchost                3420 Admin
chrome                 4452 Admin
chrome                 2968 Admin
chrome                11996 Admin
dllhost               11008 Admin
firefox                6752 Admin
firefox                5124 Admin
explorer               4056 Admin
firefox                 268 Admin
conhost               11296 Admin
AnVir                 11196 Admin
ctfmon                 4168 Admin
RuntimeBroker          7408 Admin
svchost                3784 LOCAL SERVICE
svchost                4988 LOCAL SERVICE
svchost                6980 LOCAL SERVICE
svchost               11020 LOCAL SERVICE
svchost               10680 LOCAL SERVICE
dasHost                5508 LOCAL SERVICE
svchost               10720 LOCAL SERVICE
svchost                2120 NETWORK SERVICE
svchost                4388 NETWORK SERVICE
svchost                3792 NETWORK SERVICE

или ещё проще cmd:

query user /server:ИМЯ.КОМПЬЮТЕР

и вывод:

 USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
 admin                 console             1  Active      none   28.04.2018 09:49

вообщем, в гугле полно примеров ;)

Допустим, вы администрируете сервер терминалов. (Кстати, согласно новой терминологии Майкрософт, сервер терминалов теперь называется сервером удалённых рабочих столов). Во время обслуживания сервера RDP администратору приходится его перезагружать. Но как узнать, кто из подключённых пользователей работает, а чей сеанс простаивает?

Для просмотра информации о сеансах и, в частности, о времени простоя терминальной сессии пользователя мы воспользуемся оснасткой tsadmin.msc

Нажимаем WIN+R для запуска окна Выполнить и вводим в поле tsadmin.msc :

tsadmin-001

Открывается окно Диспетчер служб удалённых рабочих столов . В отличие от диспетчера задач, где можно узнать лишь о том, подключён сеанс или отключён, Диспетчер служб удалённых рабочих столов отображает более исчерпывающую информацию.

В окне мы видим список сеансов удалённого рабочего стола. Поле Состояние показывает, чей сеанс активен, а чей отключён :

tsadmin-002

Поле LogOnTime показывает время, когда соответствующий пользователь подключился к серверу:

tsadmin-002-2

Время простоя

По информации из поля Idle Time вы можете узнать, кто работает, а чей сеанс бездействует. Так, значение 18 напротив пользователя User1 означает, что сеанс пользователя простаивает в течение 18 минут :

tsadmin-002-1

Также, можно просмотреть процессы пользователей удалённого рабочего стола:

tsadmin-003

Обновлено 12.04.2019

user logoДобрый день! Уважаемые читатели и гости IT блога Pyatilistnik.org. В прошлый раз мы с вами разобрали, как сделать таймер выключения компьютера. Сегодня я хочу вас научить определять ID (Уникальный идентификатор) и номер сеанса пользователя на терминальных столах. Уметь, это нужно, для решения ситуаций, когда такой сеанс зависает и пользователь не может работать и переключиться на другую ноду RDS фермы, так как посредники подключений видят, что у него есть активная сессия. Думаю. что мой опыт, описанный в статье окажется вам полезным.

Что такое ID сеанса

Когда пользователь входит на компьютер с включенными службами удаленных рабочих столов, для него запускается сеанс. Каждый сеанс идентифицируется уникальным идентификатором сеанса. Каждый такой сеанс ассоциируется с интерактивной оконной станцией (interactive window station) «WinSta0»; поэтому каждый сеанс связан со своей собственной оконной станцией «WinSta0». Для каждой оконной станции имеется три стандартных рабочих стола: рабочий стол Winlogon, рабочий стол с заставкой и интерактивный рабочий стол.

Подробнее про WinSta0 на https://docs.microsoft.com/en-us/windows/desktop/winstation/window-station-and-desktop-creation

Когда пользователь выходит с сервера удаленных рабочих столов (RDC), то сеанс, который клиент имеет на сервере узла сеансов удаленных рабочих столов (ранее назывался сервер терминалов), удаляется. Однако если сеанс консоли служб удаленных рабочих столов не смог завершится, то оконные станции, связанные с сеансом консоли, не удаляются, все процессы продолжают висеть. Это влияет на поведение приложений в среде служб удаленных рабочих столов, когда они настроены для работы в контексте безопасности интерактивного пользователя, также известного как режим активации объекта «RunAs Interactive User». Вот тогда, то и выявляется ID сеанса, чтобы его грохнуть.

Методы определения ID сеанса пользователя RDP

Существует несколько методов, которые могут вам помочь определить номер сеанса и его ID на терминальных серверах и RDS фермах.

  • Утилита quser
  • Утилита qwinsta
  • Утилита Query session
  • Оснастка диспетчер задач
  • PowerShell командлет Get-TerminalSession
  • PowerShell командлет Get-TSSession

Определение ID сеанса через quser

И так у меня есть RDS ферма состоящая из хостов с Windows Server 2012 R2, в базе Active Directory есть пользователь Барбоскин Геннадий Викторович. Данный пользователь вошел на терминал, работал, но по какой-то причине он завис и чтобы корректно разлогинить его сессию нам необходимо вычислить ее номер сеанса и уникальный идентификатор. Попробуем это выполнить через утилиту quser.

QUSER — это утилита командной строки Windows, которая отображает информацию, о пользовательских сессиях на серверах и обычных компьютерах, удобна в случае удаленных рабочих столов. Может получать информацию локально и удаленно.

Подробнее про quser https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/query-user

Вы можете использовать эту команду, чтобы выяснить, вошел ли конкретный пользователь на конкретный сервер Session Host. Команда возвращает:

  • Имя пользователя
  • Имя сеанса на сервере Session Host
  • ID сеанса
  • Состояние сеанса (активно или отключено)
  • Время простоя (количество минут с момента последнего нажатия клавиш или движения мыши во время сеанса)
  • Дата и время входа пользователя

Откройте командную строку cmd, лучше в режиме администратора и введите команду:

утилита quser

У вас будет выведен список всех текущих сессий на вашем терминальном сервере.Если пользователей много, то сложно сразу найти нужного, так как все идет не по алфавиту. Ранее я вам показывал, как фильтровать вывод результатов в командной строке Windows, там была команда findstr. Вводим команду:

quser | findstr barboskin.g

фильтрация данных в quser

В итоге я вижу, что номер сеанса rdp-tcp#24 и его ID 45, статус активно, это означает, что человек работает. Видно его время входа. Тот же результат можно получить и вот такой конструкцией:

Как определить ID сеанса пользователя RDP-03

Вы наверное спросите, почему сразу так не ввели, все просто, я лишь еще раз напомнил вам, о фильтрации в cmd, которая работает почти с любой командой, так сказать универсальный ключ.

Так же есть возможность запустить для конкретного сервера, для этого есть ключ /server

quser barboskin.g /server localhost

получение ID сеанса через quser

Определение ID сеанса через qwinsta

QWINSTA — Это утилита командной строки Windows, в задачи которой входит извлечение информации, о пользовательских сессиях на удаленных рабочих столах и выводя много полезной информации.

Для того, чтобы получить номер сеанса с ID, введите в командной строке:

qwinsta

Утилита выведет список всех авторизованных в системе пользователей, из полезной информации вы получите:

  • Сеанс — номер сеанса формата rdp-tcp#24
  • Пользователь — логин
  • ID — уникальный идентификатор сессии пользователя на терминальном столе
  • Статус — состояние сеанса (Активно или Диск (Отключено))
  • Тип
  • Устройство

Чтобы вывести определенного пользователя, введите команду:

qwinsta barboskin.g или qwinsta » findstr barboskin.g или с ключом /server. qwinsta barboskin.g /server localhost

получение id сеанса через qwinsta

Как узнать id пользователя через диспетчер задач

Покажу и графический метод. который позволяет вам получать ID и номер сеанса на терминальных столах. Откройте диспетчер задач и перейдите на вкладку «Пользователи». У вас будет отображен список сотрудников. Тут для удобства их можно выстроить по алфавиту. Все хорошо, но нет ID и номера сеанса.

как узнать ID сеанса из диспетчера задач

Чтобы включить отображение нужных нам столбцов, вам необходимо щелкнуть правым кликом на область с именем столбцов. В контекстном меню поставьте галки на «Код» и «Сеанс».

Как определить ID сеанса пользователя RDP-08

В итоге у вас теперь появилась возможность легко просматривать идентификационный код сеанса и имя сеанса, в моем примере, это RDP-Tcp#24.

Как определить ID сеанса пользователя RDP-09

Как узнать id пользователя через query session

QUERY SESSION — это утилита командной строки так же выводящая информацию, о вошедших в систему пользователей. Вводите в командной строке query session, вывод утилиты копия qwinsta. Вы так же будите видеть номер сеанса, логин учетной записи, ID, статус подключения.

query session

Получение информации о сеансе через Get-TerminalSession

PowerShell не зря называют могучим, он поистине может все. К сожалению родных командлетов, которые бы заменяли утилиты командной строки нет, но есть возможность установить дополнительные, из репозитория. Речь пойдет, о сборнике «PowerShell Community Extensions» (Pscx 3.2.2). Данный сборник включаем в себя огромный комплекс командлетов, нас будет интересовать Get-TerminalSession.

Установка «PowerShell Community Extensions» очень проста и выполняется одной командой. Перед установкой Pscx 3.2.2, вам необходимо обновить ваш PowerShell хотя бы до версии 5.1. Далее запускаете оболочку PowerShell от имени администратора и вводите команду:

Install-Module -Name Pscx -RequiredVersion 3.2.2

Про сам сборник вы можете почитать по ссылке (https://www.powershellgallery.com/packages/Pscx/3.2.2)

Пишите на терминальном сервере Get-TerminalSession, или же можете запросить удаленно Get-TerminalSession -ComputerName 192.168.1.51

Get-TerminalSession

Получение информации о сеансе через Get-TSSession

Модуль PSTerminalServices, так же позволяет взаимодействовать с терминальными профилями В состав PSTerminalServices входят вот такие командлеты:

  • Disconnect-TSSession — отключает любого подключенного пользователя от сеанса.
  • Get-TSCurrentSession — предоставляет информацию о сеансе, в котором выполняется текущий процесс.
  • Get-TSProcess — получает список процессов, запущенных в определенном сеансе или во всех сеансах.
  • Get-TSServers — перечисляет все терминальные серверы в данном домене.
  • Get-TSSession — перечисляет сессии на данном терминальном сервере.
  • Send-TSMessage — отображает окно сообщения в указанном идентификаторе сеанса.
  • Stop-TSProcess — завершает процесс, запущенный в определенном сеансе или во всех сеансах.
  • Stop-TSSession — отключает сеанс, отключая любого пользователя, который может быть подключен.

Скачать PSTerminalServices вы можете по ссылке https://github.com/imseandavis/PSTerminalServices, там будет MSI пакет, если его уже по какой-то причине не будет, то можете загрузить PSTerminalServices по ссылке слева.

Установка PSTerminalServices проста до безобразия. На первом экране нажимаем «Next».

Установка PSTerminalServices-01

При необходимости изменяем путь установки данного модуля.

Установка PSTerminalServices-02

Для продолжения нажимаем «Install»

Установка PSTerminalServices-03

Установка модуля завершена.

Установка PSTerminalServices-04

Теперь, чтобы модуль запускался вам нужно разрешить запуск скриптов, напоминаю, что для текущего пользователя, это можно сделать вот так:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Далее проверьте командой, что модуль PSTerminalServices доступен в системе, выполните:

Get-Module -Name PSTerminalServices -ListAvailable

PSTerminalServices

Далее импортируем модуль и запускаем его:

Import-Module PSTerminalServices

Get-TSSession

На выходе вы получаете информацию, о всех ваших сеансах пользователей на терминальном столе

Get-TSSession

Для удаленного вызова введите Get-TSSession -ComputerName имя сервера. На этом у меня все. Уверен, что существуют еще методы, позволяющие вам узнать  ID и номер сеанса пользователя на терминальных фермах. С вами был Иван Семин, автор и создатель IT блога Pyatilistnik.org.

Понравилась статья? Поделить с друзьями:
  • Посмотреть пароли пользователей windows server 2008
  • Посмотреть активных пользователей windows server 2008
  • Посмотреть параметры компьютера windows 10 оперативная память
  • Посмотреть ошибки на сетевой карте windows
  • Посмотреть автозагрузку в windows server 2016