Quser (или Query User) — утилита командной строки, предназначенная для вывода сведений о пользовательских сеансах на серверах удаленных рабочих столов. С ее помощью можно определить, вошел ли конкретный пользователь на конкретный сервер. Вывод команды представляет собой список всех пользовательских сеансов на сервере.
Разбирать полученную информацию можно с помощью PowerShell. К примеру, найти на сервере сеанс пользователя adm3 можно вот такой командой:
quser /server:$server | where {$_ -match "adm3"}
В результате выполнения команды получаем строку с данными сеанса пользователя:
• Имя пользователя;
• Имя сеанса;
• Идентификатор сеанса;
• Состояние сеанса (активно или отключено);
• Время простоя (количество минут с момента последнего нажатия клавиши или перемещения мыши в сеансе);
• Дата и время входа пользователя.
Но просто найти сеанс пользователя недостаточно. Предположим мы хотим что то с этим сеансом сделать, например завершить его. Для этого нам понадобится имя или идентификатор (номер) сеанса. Вся необходимая информация имеется в полученной строке, но ее надо оттуда как то достать. Сделать это можно разными способами, например с помощью регулярных выражений.
Для разбора строки с данными сеанса воспользуемся таким вот регулярным выражением, в котором используются именованные группы:
(?m)^\s?(?<username>[\w\/.\/_\-]{2,64})\s\s+(?<sessionname>\w?.{0,22})\s\s+(?<sessionid>\d{1,5})\s\s+(?<state>.{0,12})\s\s+(?<idletime>.{0,20})\s\s+(?<logontime>.{0,32})$
Действуем так — сначала находим сеанс и помещаем его в переменную:
$string = quser /server:$server | where {$_ -match "adm3"}
Затем берем переменную и скармливаем ее нашей регулярке:
$string -match "(?m)^\s?(?<username>[\w\/.\/_\-]{2,64})\s\s+(?<sessionname>\w?.{0,22})\s\s+(?<sessionid>\d{1,5})\s\s+(?<state>.{0,12})\s\s+(?<idletime>.{0,20})\s\s+(?<logontime>.{0,32})$"
В результате получаем переменную $Matches, из которой можем получить всю необходимую информацию, например:
$Matches.sessionid
— идентификатор сеанса;
$Matches.sessionname
— имя сеанса;
$Matches.state
— состояние сеанса.
Ну и второй способ — это разобрать строку на составляющие и поместить их в массив, предварительно убрав все лишнее. Для этого так же помещаем вывод команды в переменную:
$string = quser /server:$server | where {$_ -match "adm3"}
Затем разбиваем строку на элементы и помещаем их в массив:
$array = $string -replace "\s\s+",";" -split ";"
Теперь к элементам массива можно обращаться по их индексу, например:
$array[1]
— имя сеанса;
$array[3]
— состояние сеанса.
Способы старые, проверенные 🙂 Каким воспользоваться — дело вкуса. Лично мне больше нравится регулярка.
Если делать, то до конца, чтобы все выглядело решением:
$pattern = «(?m)^\s?(?[>\w\/.\/_\-]{2,64})\s\s+(?\w?.{0,22})\s\s+(?\d{1,5})\s\s+(?.{0,12})\s\s+(?.{0,20})\s\s+(?.{0,32})$»
quser | Select-Object -skip 1 | ForEach-Object {
if ($_ -match $pattern) {
[pscustomobject]@{
Computername = $server
Current = $matches.username[0] -eq ‘>’
Username = $matches.username
SessionName = $matches.sessionname
SessionId = $matches.sessionid
State = $matches.state
IdleTime = $matches.idletime
LogonTime = [datetime]::parse($matches.logontime)
}
}
}