Заметки о Windows и других программных продуктах Microsoft...

Парсинг вывода утилиты quser

Парсинг вывода утилиты quser

Quser (или Query User) — утилита командной строки, предназначенная для вывода сведений о пользовательских сеансах на серверах удаленных рабочих столов. С ее помощью можно определить, вошел ли конкретный пользователь на конкретный сервер. Вывод команды представляет собой список всех пользовательских сеансов на сервере.

Разбирать полученную информацию можно с помощью PowerShell. К примеру, найти на сервере сеанс пользователя adm3 можно вот такой командой:

quser /server:$server | where {$_ -match "adm3"}

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

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

вывод команды quser

 

Но просто найти сеанс пользователя недостаточно. Предположим мы хотим что то с этим сеансом сделать, например завершить его. Для этого нам понадобится имя или идентификатор (номер) сеанса. Вся необходимая информация имеется в полученной строке, но ее надо оттуда как то достать. Сделать это можно разными способами, например с помощью регулярных выражений.

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

(?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)
}
}
}

Ответить