Як я можу отримати ідентифікатор сесії з командного рядка?


26

Як я можу отримати поточний ідентифікатор користувача сесії за допомогою командного рядка Windows?

У списку завдань на вкладці користувачів кожен користувач асоціюється з ідентифікатором сеансу. Я хочу отримати це за допомогою командного рядка, щоб я міг використовувати його для віддаленої програми.


Я не впевнений, що ви маєте на увазі під ідентифікатором сеансу?
EBGreen

У списку завдань на вкладці користувачів кожен користувач асоціюється з ідентифікатором сеансу. Я хочу отримати це за допомогою командного рядка, щоб я міг використовувати його для віддаленої програми.
Негативний

також дивіться superuser.com/questions/123242/…
matt wilkie

%% G було б, якщо ви називаєте його з партії,% G, якщо безпосередньо з командного рядка

Відповіді:


28

Це, звичайно, не найефективніший спосіб, але ви можете подивитися на результати tasklist. Він відображатиме ім’я та номер сеансу кожного запущеного процесу. Якщо ви ввійшли в систему на локальному рівні, перегляньте ідентифікатор сеансу під назвою "консоль".

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

Я хочу отримати його за допомогою командного рядка.
Негативний

1
У командному рядку введіть список завдань.
Гері

1
Хм, насправді ви можете щось тут. редагувати: список завдань / FI "imagename eq cmd.exe" / FO list Я планую проаналізувати цей вихід. Спасибі!
Негативний

Або я можу це зробити. Ніцца
негативний

tasklistце добре, тому що для нього не потрібна версія Pro / Ent OS. Ви також можете перелічити лише інтерактивні сеанси, відфільтрувавши для explorer.exe -tasklist /fi "imagename eq explorer.exe"
shawn

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: для / f "жетони = 4 delims ="% G in ('tasklist / FI "IMAGENAME eq tasklist.exe" / NH') зробіть SET RDP_SESSION =% G
Paweł Stankowski

2
@ PawełStankowski: це різниця, якщо ви запускаєте його з пакетного файлу (%%) або з консолі (%)
Thomas Weller

Зауважте, що ця помилка є малоймовірною у тому випадку, коли одночасно працює кілька користувачів 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 залишається як вправа.


У моєму випадку, якщо є кілька сеансів, вони завжди матимуть одне ім’я користувача. Але це, мабуть, не типово.
Метью Лундберг

@MatthewLundberg: Як щодо ДЕРЖАВИ? Чи визначені сеанси, крім поточного, "Активні"?
G-Man каже: "Відновіть Моніку"

Так, вони будуть активними. Це серверна ОС.
Метью Лундберг

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

Якщо ви бачите два ідентифікатори сеансу, запустіть сценарій ще раз.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.