Bagaimana saya bisa mengambil ID Sesi dari baris perintah?

26

Bagaimana saya bisa mengambil ID sesi pengguna saat ini melalui baris perintah windows?

Di daftar tugas di bawah tab pengguna, setiap pengguna dikaitkan dengan ID sesi. Saya ingin mengambil ini melalui baris perintah sehingga saya dapat menggunakannya untuk aplikasi jarak jauh.

Negatif
sumber
Saya tidak yakin apa yang Anda maksud dengan ID sesi?
EBGreen
Di daftar tugas di bawah tab pengguna, setiap pengguna dikaitkan dengan ID sesi. Saya ingin mengambil ini melalui baris perintah sehingga saya dapat menggunakannya untuk aplikasi jarak jauh.
Negatif
juga lihat superuser.com/questions/123242/...
matt wilkie
%% G akan jika Anda memanggilnya dari batch,% G jika langsung dari baris perintah

Jawaban:

28

Ini tentu bukan cara yang paling efisien, tetapi Anda dapat melihat hasilnya tasklist. Ini akan menampilkan nama dan sesi # dari setiap proses yang berjalan. Jika Anda masuk secara lokal maka lihat ID untuk sesi yang bernama "konsol".

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 akan mengambil id sesi:

d:\>query session
 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           janedoe                   1  Active
 rdp-tcp                                 65536  Listen
Gary
sumber
Saya mencari untuk mengambilnya melalui baris perintah.
Negatif
1
Kanan, dari baris perintah, ketikkan daftar tugas.
Gary
1
Hmm sebenarnya Anda mungkin tertarik pada sesuatu di sini. sunting: daftar tugas / FI "imagename eq cmd.exe" / daftar FO Saya berencana menguraikan output ini. Terima kasih!
Negatif
Atau saya bisa melakukan itu. Bagus
Negatif
tasklistbagus karena tidak memerlukan versi Pro / Ent OS. Anda juga dapat mendaftar hanya sesi interaktif dengan memfilter untuk 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%
Oscar Beh
sumber
1
Solusi Oscar benar-benar bekerja untuk saya, ketika diganti %% G dengan% G: untuk / f "token = 4 delims ="% G di ('tasklist / FI "IMAGENAME eq tasklist.exe" / NH') lakukan SET RDP_SESSION =% G
Paweł Stankowski
2
@ PawełStankowski: itulah bedanya jika Anda menjalankannya dari file batch (%%) atau dari konsol (%)
Thomas Weller
Perhatikan bahwa ini terputus jika ada beberapa pengguna yang berjalan tasklistpada waktu yang bersamaan.
Matthew Lundberg
5

Ini menggabungkan aspek jawaban Gary dan jawaban Oscar . Seperti dicatat oleh Gary, output dari query sessionterlihat seperti

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

atau, dalam kasus saya (menggunakan "Ganti pengguna")

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

(Saya tidak memiliki RDP yang diatur, jadi saya tidak dapat mengujinya.) Mungkin maksud dari pertanyaan ini adalah untuk menentukan ID dari sesi yang sedang aktif. Saya sarankan mencari output query session untuk apa yang tampak seperti sesi saat ini:

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

yang menugaskan 2, 3, dan kata-4 (yang kami berharap untuk menjadi USERNAME itu, [SESI] ID, dan NEGARA) dari setiap baris dari output query sessionuntuk %a, %bdan %c, masing-masing, dan kemudian melaporkan SESI ID dari garis mana USERNAME adalah saya dan STATE adalah Active.

Ternyata yang query sessionmengambil usernameparameter, sehingga di atas dapat disederhanakan

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

atau

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

Untuk menggunakan ini dalam skrip (file batch), Anda mungkin ingin mengatakannya

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

menggunakan %%adan %%b(bukan %adan %b) karena itu dalam skrip. Anda mungkin dapat mengabaikan @ jika seluruh file batch berada di bawah @echo off. Inisialisasi untuk unknownmemungkinkan Anda melakukan penanganan kesalahan (mendeteksi jika tidak ada garis dalam output query session yang cocok). Memperluas penanganan kesalahan untuk mengenali dan bereaksi jika ada beberapa garis yang cocok dalam output query session dibiarkan sebagai latihan.

G-Man Mengatakan 'Reinstate Monica'
sumber
Dalam kasus dunia nyata saya, jika ada beberapa sesi, mereka akan selalu memiliki nama pengguna yang sama. Tapi ini mungkin bukan tipikal.
Matthew Lundberg
@MatthewLundberg: Bagaimana dengan STATE? Apakah sesi selain sesi saat ini diidentifikasi sebagai "Aktif"?
G-Man Mengatakan 'Reinstate Monica'
Ya, mereka akan aktif. Ini adalah OS server.
Matthew Lundberg
2

Berbeda dengan Nama Sesi, ID Sesi tidak disimpan dalam variabel dan tidak mudah untuk dicapai. Saya yakin ada satu, tapi saya tidak bisa memikirkan alat baris perintah bawaan yang melakukan ini.

Namun, saya telah menulis file .exe kecil (C #, .Net 4) yang melakukan ini.

Keduanya akan menampilkan id sesi, dan juga memilikinya sebagai kode pengembalian sehingga Anda dapat menggunakannya dalam berbagai skrip / teknik.

Tautan ke file di MediaFire

William Hilsum
sumber
1

Ini berdasarkan kode dari Oscar Beh.

tasklistakan menampilkan laporan ID sesi (dan informasi lainnya) untuk semua instance dari executable yang diberikan, termasuk dirinya sendiri. Saat Anda menjalankan perintah, itu akan menampilkan id sesi Anda. Satu-satunya cacat potensial dalam kodenya adalah bahwa itu tidak memberi tahu Anda jika ada beberapa contoh program, yang dapat menyebabkan skrip mengembalikan hasil yang salah.

Di sini kami melaporkan semua contoh tasklistuntuk memastikan bahwa tidak ada sesi lain yang menjalankan perintah itu:

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

Jika Anda melihat dua ID Sesi dilaporkan, jalankan kembali skrip.

Matthew Lundberg
sumber