24

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

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

5 ответов5

27

Это, конечно, не самый эффективный способ, но вы можете взглянуть на результаты 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
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-е слова (которые, как мы надеемся, будут ИМЯ ПОЛЬЗОВАТЕЛЯ, ИД [SESSION] и СОСТОЯНИЕ) из каждой строки вывода 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 оставлено в качестве упражнения.

4
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

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

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

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

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

1

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .