Как я могу получить идентификатор сеанса из командной строки?

26

Как я могу получить текущий идентификатор сеанса пользователя через командную строку Windows?

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

отрицательный
источник
Я не уверен, что вы подразумеваете под идентификатором сессии?
EBGreen
В списке задач на вкладке пользователи каждый пользователь связан с идентификатором сеанса. Я хочу получить это через командную строку, чтобы я мог использовать его для удаленного приложения.
Негативно
также см. superuser.com/questions/123242/…
Мэтт Вилки
%% G будет, если вы вызываете его из пакета,% G, если напрямую из командной строки

Ответы:

28

Это, конечно, не самый эффективный способ, но вы можете взглянуть на результаты tasklist. Он будет отображать имя и номер сеанса каждого запущенного процесса. Если вы вошли в систему локально, посмотрите на идентификатор сеанса с именем «console».

d:\>tasklist

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
System Idle Process              0 Services                   0         24 K
System                           4 Services                   0      8,580 K
smss.exe                       316 Services                   0      1,500 K
...snip

Редактировать :

Query Session получит идентификатор сессии:

d:\>query session
 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           janedoe                   1  Active
 rdp-tcp                                 65536  Listen
Gary
источник
Я ищу, чтобы получить его через командную строку.
Негатив
1
Справа из командной строки введите tasklist.
Гэри
1
Хм, на самом деле вы можете быть здесь что-то. edit: tasklist / FI "imagename eq cmd.exe" / список FO Я планирую проанализировать этот вывод. Благодарность!
Негатив
Или я могу сделать это. Ницца
Негатив
tasklistэто хорошо, потому что не требует версии Pro / Ent OS. Вы также можете перечислить только интерактивные сеансы, отфильтровывая tasklist /fi "imagename eq explorer.exe"
файл
5
for /f "tokens=4 delims= " %%G in ('tasklist /FI "IMAGENAME eq tasklist.exe" /NH') do SET RDP_SESSION=%%G
echo Current RDP Session ID: %RDP_SESSION%
Оскар Бех
источник
1
Решение Оскара действительно сработало для меня, когда заменили %% G на% G: for / f "tokens = 4 delims ="% G in ('tasklist / FI "IMAGENAME eq tasklist.exe" / NH') do SET RDP_SESSION =% G
Павел Станковский
2
@ PawełStankowski: это разница, если вы запускаете его из пакетного файла (%%) или из консоли (%)
Томас Уэллер
Обратите внимание, что это прерывает маловероятное событие, когда одновременно работают несколько пользователей tasklist.
Мэтью Ландберг,
5

Это сочетает в себе аспекты ответа Гари и ответа Оскара . Как отмечает Гэри, выход query sessionвыглядит примерно так

 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           janedoe                   1  Active
 rdp-tcp                                 65536  Listen

или, в моем случае (с помощью «Переключить пользователя»)

 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           gman                      1  Active
                   otherguy                  2  Disc

(У меня не настроен RDP, поэтому я не могу проверить его.) Предположительно, цель вопроса - определить идентификатор текущего активного сеанса. Я предлагаю поискать вывод того, query session что выглядит как текущий сеанс:

 for /f "tokens=2-4" %a in ('query session') do @if "%a"=="%username%" if "%c"=="Active" echo %b

который назначает на 2 - й, 3 - й и 4 - -е слова (которые , как мы надеемся быть USERNAME [SESSION] ID и STATE) из каждой строки вывода query sessionк %a, %bи %c, соответственно, а затем передает SESSION ID от линии , где USERNAME - это я, а State - Active.

Получается, что query sessionпринимает usernameпараметр, поэтому вышесказанное можно упростить до

 for /f "tokens=2-4" %a in ('query session %username%') do @if "%c"=="Active" echo %b

или

for /f "tokens=3-4" %a in ('query session %username%') do @if "%b"=="Active" echo %a

Чтобы использовать это в сценарии (командный файл), вы можете сказать,

set MY_SESSION_ID=unknown
for /f "tokens=3-4" %%a in ('query session %username%') do @if "%%b"=="Active" set MY_SESSION_ID=%%a

используя %%aи %%b(вместо %aи %b), потому что это в сценарии. Возможно, вы можете пропустить, @ если весь пакетный файл находится под @echo off. Инициализация unknownпозволяет вам выполнять обработку ошибок (обнаружение, если на выходе нет query session совпадений). Расширение обработки ошибок для распознавания и реагирования, если в выходных данных есть несколько совпадающих строк, query sessionоставлено в качестве упражнения.

G-Man говорит: «Восстанови Монику»
источник
В моем случае, если есть несколько сессий, они всегда будут иметь одинаковое имя пользователя. Но это, вероятно, не типично.
Мэтью Ландберг
@MatthewLundberg: Как насчет государства? Определены ли сеансы, отличные от текущего, как «активные»?
G-Man говорит: «Восстановите Монику»
Да, они будут активны. Это серверная ОС.
Мэтью Ландберг,
2

В отличие от имени сеанса, идентификатор сеанса не хранится в переменной и к нему не так легко добраться. Я уверен, что есть один, но я не могу думать о встроенном инструменте командной строки, который делает это.

Тем не менее, я написал крошечный файл .exe (C #, .Net 4), который делает это.

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

Ссылка на файл на MediaFire

Уильям Хилсум
источник
1

Это основано на коде от Оскара Беха.

tasklistпокажет отчет ID сеанса (и другую информацию) для всех экземпляров данного исполняемого файла, включая самого себя. Когда вы запускаете команду, она покажет ваш идентификатор сессии. Единственный потенциальный дефект в его коде - это то, что он не сообщает вам, если есть несколько экземпляров программы, что может заставить скрипт возвращать неверные результаты.

Здесь мы сообщаем обо всех случаях, tasklistчтобы гарантировать, что нет другой сессии, выполняющей эту команду:

for /f "tokens=4 delims= " %%G in ('tasklist /FI "IMAGENAME eq tasklist.exe" /NH') do echo Session ID %%G

Если вы видите два идентификатора сеанса, запустите скрипт снова.

Мэтью Лундберг
источник