Làm cách nào tôi có thể truy xuất ID phiên từ dòng lệnh?


26

Làm cách nào tôi có thể truy xuất ID phiên người dùng hiện tại qua dòng lệnh windows?

Trong danh sách tác vụ dưới tab người dùng, mỗi người dùng được liên kết với ID phiên. Tôi muốn truy xuất thông qua dòng lệnh này để tôi có thể sử dụng nó cho một ứng dụng từ xa.


Tôi không chắc ý của bạn về ID phiên là gì?
EBGreen

Trong danh sách tác vụ dưới tab người dùng, mỗi người dùng được liên kết với ID phiên. Tôi muốn truy xuất thông qua dòng lệnh này để tôi có thể sử dụng nó cho một ứng dụng từ xa.
Tiêu cực


%% G sẽ là nếu bạn gọi nó từ một đợt,% G nếu trực tiếp từ dòng lệnh

Câu trả lời:


28

Đây chắc chắn không phải là cách hiệu quả nhất, nhưng bạn có thể xem kết quả tasklist. Nó sẽ hiển thị tên và phiên # của mỗi quá trình đang chạy. Nếu bạn đã đăng nhập cục bộ thì hãy xem ID cho phiên có tên "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

Chỉnh sửa :

Query Session sẽ lấy id phiên:

d:\>query session
 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           janedoe                   1  Active
 rdp-tcp                                 65536  Listen

Tôi đang tìm cách lấy nó thông qua dòng lệnh.
Tiêu cực

1
Phải, từ dòng lệnh, gõ danh sách tác vụ.
Gary

1
Hmm thực sự bạn có thể vào một cái gì đó ở đây. chỉnh sửa: danh sách tác vụ / FI "tên hình ảnh eq cmd.exe" / danh sách FO Tôi dự định phân tích cú pháp đầu ra này. Cảm ơn!
Tiêu cực

Hoặc tôi có thể làm điều đó. Nice
Tiêu cực

tasklistlà tốt vì nó không yêu cầu phiên bản Pro / Ent OS. Bạn cũng chỉ có thể liệt kê các phiên tương tác bằng cách lọc cho 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
Giải pháp của Oscar thực sự hiệu quả với tôi, khi thay thế %% G bằng% G: for / f "tokens = 4 delims ="% G in ('tasklist / FI "IMAGENAME eq tasklist.exe" / NH') làm SET RDP_SESSION =% G
Paweł Stankowski

2
@ PawełStankowski: đó là sự khác biệt nếu bạn chạy nó từ một tệp bó (%%) hoặc từ bảng điều khiển (%)
Thomas Weller

Lưu ý rằng điều này phá vỡ trong trường hợp không chắc là nhiều người dùng đang chạy tasklistcùng một lúc.
Matthew Lundberg

5

Điều này kết hợp các khía cạnh của câu trả lời của Garycâu trả lời của Oscar . Theo ghi nhận của Gary, đầu ra của nó query sessiontrông giống như

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

hoặc, trong trường hợp của tôi (sử dụng người dùng trên Switch Switch)

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

(Tôi chưa thiết lập RDP, vì vậy tôi không thể kiểm tra với nó.) Có lẽ mục đích của câu hỏi là xác định ID của phiên hiện đang hoạt động. Tôi đề nghị tìm kiếm đầu ra của query session phiên trông giống như phiên hiện tại:

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

mà giao cho 2, 3, và từ lần thứ 4 (mà chúng tôi hy vọng sẽ là USERNAME, [PHIÊN] ID, và NHÀ NƯỚC) từ mỗi dòng đầu ra của query sessionđể %a, %b%c, tương ứng, và sau đó báo cáo PHẦN ID từ dòng nơi USERNAME là tôi và NHÀ NƯỚC là Active.

Nó chỉ ra rằng query sessioncó một usernametham số, vì vậy ở trên có thể được đơn giản hóa để

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

hoặc là

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

Để sử dụng điều này trong một tập lệnh (tệp bó), bạn có thể muốn nói

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

sử dụng %%a%%b(thay vì %a%b) vì nó nằm trong một tập lệnh. Bạn có thể có thể bỏ qua @ nếu toàn bộ tập tin lô nằm dưới @echo off. Việc khởi tạo để unknowncho phép bạn xử lý lỗi (phát hiện nếu không có dòng nào trong đầu ra của query session kết quả khớp đó). Mở rộng xử lý lỗi để nhận biết và phản ứng nếu có nhiều dòng khớp trong đầu ra của query session còn lại là một bài tập.


Trong trường hợp thực tế của tôi, nếu có nhiều phiên, họ sẽ luôn có cùng tên người dùng. Nhưng điều này có lẽ không điển hình.
Matthew Lundberg

@MatthewLundberg: Làm thế nào về NHÀ NƯỚC? Các phiên không phải là phiên hiện tại được xác định là "Hoạt động"?
G-Man nói 'Phục hồi Monica'

Vâng, họ sẽ hoạt động. Đây là một hệ điều hành máy chủ.
Matthew Lundberg

2

Không giống như Tên phiên, ID phiên không được lưu trữ trong một biến và không dễ dàng để có được. Tôi chắc chắn có một, nhưng tôi không thể nghĩ ra một công cụ dòng lệnh tích hợp nào thực hiện việc này.

Tuy nhiên, tôi đã viết một tệp .exe nhỏ (C #, .Net 4) thực hiện việc này.

Cả hai sẽ hiển thị id phiên và cũng có thể là mã trả về để bạn có thể sử dụng mã này trong nhiều tập lệnh / kỹ thuật khác nhau.

Liên kết đến tệp trên MediaFire


1

Điều này dựa trên mã từ Oscar Beh.

tasklistsẽ hiển thị báo cáo ID phiên (và thông tin khác) cho tất cả các phiên bản của một tệp thực thi nhất định, bao gồm cả chính nó. Khi bạn đang chạy lệnh, nó sẽ hiển thị id phiên của bạn. Khiếm khuyết tiềm năng duy nhất trong mã của anh ta là nó không thông báo cho bạn nếu có nhiều phiên bản của chương trình, điều này có thể khiến tập lệnh trả về kết quả không chính xác.

Ở đây chúng tôi báo cáo tất cả các trường hợp tasklistđể đảm bảo rằng không có phiên nào khác đang chạy lệnh đó:

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

Nếu bạn thấy hai ID phiên được báo cáo, hãy chạy lại tập lệnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.