ฉันจะดึงข้อมูล ID ของเซสชันจากบรรทัดคำสั่งได้อย่างไร


26

ฉันจะดึง ID เซสชันผู้ใช้ปัจจุบันผ่านทางบรรทัดคำสั่งของ windows ได้อย่างไร

ในรายการงานภายใต้แท็บผู้ใช้ผู้ใช้แต่ละคนจะเชื่อมโยงกับรหัสเซสชัน ฉันต้องการเรียกคืนผ่านทางบรรทัดคำสั่งเพื่อให้ฉันสามารถใช้กับแอปพลิเคชันระยะไกลได้


ฉันไม่แน่ใจว่าคุณหมายถึง ID เซสชันหรือไม่
EBGreen

ในรายการงานภายใต้แท็บผู้ใช้ผู้ใช้แต่ละคนจะเชื่อมโยงกับรหัสเซสชัน ฉันต้องการเรียกคืนผ่านทางบรรทัดคำสั่งเพื่อให้ฉันสามารถใช้กับแอปพลิเคชันระยะไกลได้
ลบ


%% G น่าจะเป็นถ้าคุณเรียกมันจากแบตช์% G ถ้าโดยตรงจากบรรทัดคำสั่ง

คำตอบ:


28

นี้อย่างแน่นอนไม่ได้เป็นวิธีที่มีประสิทธิภาพมากที่สุด 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

แก้ไข :

Query Session จะดึงรหัสเซสชั่น:

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

ฉันต้องการดึงข้อมูลผ่านทางบรรทัดคำสั่ง
ลบ

1
ขวาจากบรรทัดคำสั่งพิมพ์ tasklist
Gary

1
อืมจริงๆแล้วคุณอาจจะทำอะไรบางอย่างที่นี่ แก้ไข: tasklist / FI "รายการ imagename eq cmd.exe" / FO รายการที่ฉันวางแผนจะแยกเอาท์พุทนี้ ขอบคุณ!
ลบ

หรือฉันสามารถทำเช่นนั้น ดี
ติดลบ

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
โซลูชันของ Oscar ใช้งานได้จริงสำหรับฉันเมื่อแทนที่ %% G ด้วย% G: สำหรับ / f "tokens = 4 delims ="% G in ('tasklist / FI "IMAGENAME eq tasklist.exe" / NH') ทำ SET RDP_SESSION =% G
Paweł Stankowski

2
@ PawełStankowski: นั่นคือความแตกต่างถ้าคุณเรียกใช้จากแฟ้มแบตช์ (%%) หรือจากคอนโซล (%)
Thomas Weller

โปรดทราบว่าสิ่งนี้จะหยุดลงในเหตุการณ์ที่ไม่น่าเป็นไปได้ที่ผู้ใช้หลายคนกำลังทำงานtasklistในเวลาเดียวกัน
Matthew Lundberg

5

นี้รวมด้านของคำตอบของแกรี่และคำตอบของออสการ์ ตามที่ระบุไว้โดย Gary ผลลัพธ์ของการ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 ดังนั้นฉันจึงไม่สามารถทดสอบได้) สันนิษฐานว่าเจตนาของคำถามคือการพิจารณา ID ของเซสชันที่ใช้งานอยู่ในปัจจุบัน ฉันขอแนะนำให้ค้นหาผลลัพธ์ของquery session สิ่งที่ดูเหมือนเซสชันปัจจุบัน:

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

ซึ่งกำหนด 2, 3, และคำพูดที่ 4 (ซึ่งเราหวังว่าจะเป็นชื่อผู้ใช้ [SESSION] ID และรัฐ) จากแต่ละสายของการส่งออกของquery sessionไป%a, %bและ%cตามลำดับและแล้วรายงาน SESSION ID จากบรรทัดที่ USERNAME 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 ถูกทิ้งไว้เป็นแบบฝึกหัด


ในกรณีจริงของฉันหากมีหลายเซสชันพวกเขาจะมีชื่อผู้ใช้เดียวกันเสมอ แต่นี่อาจไม่ธรรมดา
Matthew Lundberg

@ Matthewthundberg: แล้วรัฐล่ะ? เซสชันอื่นนอกเหนือจากเซสชันที่ระบุว่า "ใช้งานอยู่"
G-Man กล่าวว่า 'Reinstate Monica'

ใช่พวกเขาจะใช้งานได้ มันเป็นระบบปฏิบัติการเซิร์ฟเวอร์
Matthew Lundberg

2

ไม่เหมือนกับชื่อเซสชันรหัสเซสชันจะไม่ถูกเก็บไว้ในตัวแปรและไม่ง่ายที่จะไป ฉันแน่ใจว่ามี แต่ฉันไม่สามารถนึกถึงเครื่องมือบรรทัดคำสั่งในตัวที่ทำสิ่งนี้

อย่างไรก็ตามฉันได้เขียนไฟล์. exe ขนาดเล็ก (C #, .Net 4) ที่ทำสิ่งนี้

ทั้งสองจะแสดงรหัสเซสชันและยังเป็นรหัสส่งคืนเพื่อให้คุณสามารถใช้งานได้ในสคริปต์ / เทคนิคที่หลากหลาย

ลิงก์ไปยังไฟล์บน MediaFire


1

นี้จะขึ้นอยู่กับรหัสจากออสการ์ Beh

tasklistจะแสดงรายงานรหัสเซสชัน (และข้อมูลอื่น ๆ ) สำหรับทุกกรณีของการปฏิบัติการที่กำหนดรวมถึงตัวเอง ในขณะที่คุณกำลังรันคำสั่งมันจะแสดงรหัสเซสชันของคุณ ข้อบกพร่องที่อาจเกิดขึ้นเพียงอย่างเดียวในรหัสของเขาคือมันไม่ได้แจ้งให้คุณทราบหากมีหลายอินสแตนซ์ของโปรแกรมซึ่งอาจทำให้สคริปต์ส่งคืนผลลัพธ์ที่ไม่ถูกต้อง

ที่นี่เรารายงานกรณีทั้งหมดของtasklistเพื่อให้แน่ใจว่าไม่มีเซสชันอื่นที่ใช้คำสั่งนั้น:

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

หากคุณเห็นรายงาน ID ของเซสชันสองรายการให้เรียกใช้สคริปต์อีกครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.