2011-06-29 14:17:06 +0000 2011-06-29 14:17:06 +0000
27
27

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

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

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

Ответы (5)

29
29
29
2011-06-29 14:24:34 +0000

Это, конечно, не самый эффективный способ, но вы можете взглянуть на результаты tasklist. На экране отобразится название и сеанс# каждого запущенного процесса. Если вы вошли в систему локально, то посмотрите на ID для сессии под названием “консоль”.

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

Edit:

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

d:\>query session
 SESSIONNAME USERNAME ID STATE TYPE DEVICE
 services 0 Disc
>console janedoe 1 Active
 rdp-tcp 65536 Listen
```.
6
6
6
2016-02-04 22:21:53 +0000

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

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

или, в моем случае (с помощью “Switch user”)

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 sessionis&nbsp имеется multipleсоответствующих строк; слева в качестве упражнения.

5
5
5
2013-01-03 14:52:01 +0000
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%
2
2
2
2011-06-29 14:28:57 +0000

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

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

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

1
1
1
2016-02-04 22:08:48 +0000

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

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

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

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

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

Похожие вопросы

3
19
10
28
3