ฉันจะดึง ID เซสชันผู้ใช้ปัจจุบันผ่านทางบรรทัดคำสั่งของ windows ได้อย่างไร
ในรายการงานภายใต้แท็บผู้ใช้ผู้ใช้แต่ละคนจะเชื่อมโยงกับรหัสเซสชัน ฉันต้องการเรียกคืนผ่านทางบรรทัดคำสั่งเพื่อให้ฉันสามารถใช้กับแอปพลิเคชันระยะไกลได้
ฉันจะดึง ID เซสชันผู้ใช้ปัจจุบันผ่านทางบรรทัดคำสั่งของ windows ได้อย่างไร
ในรายการงานภายใต้แท็บผู้ใช้ผู้ใช้แต่ละคนจะเชื่อมโยงกับรหัสเซสชัน ฉันต้องการเรียกคืนผ่านทางบรรทัดคำสั่งเพื่อให้ฉันสามารถใช้กับแอปพลิเคชันระยะไกลได้
คำตอบ:
นี้อย่างแน่นอนไม่ได้เป็นวิธีที่มีประสิทธิภาพมากที่สุด 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
tasklist
ดีเพราะไม่จำเป็นต้องใช้เวอร์ชัน Pro / Ent OS นอกจากนี้คุณยังสามารถแสดงรายการเซสชันแบบโต้ตอบโดยการกรองสำหรับ explorer.exe -tasklist /fi "imagename eq explorer.exe"
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%
tasklist
ในเวลาเดียวกัน
นี้รวมด้านของคำตอบของแกรี่และคำตอบของออสการ์ ตามที่ระบุไว้โดย 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
ถูกทิ้งไว้เป็นแบบฝึกหัด
ไม่เหมือนกับชื่อเซสชันรหัสเซสชันจะไม่ถูกเก็บไว้ในตัวแปรและไม่ง่ายที่จะไป ฉันแน่ใจว่ามี แต่ฉันไม่สามารถนึกถึงเครื่องมือบรรทัดคำสั่งในตัวที่ทำสิ่งนี้
อย่างไรก็ตามฉันได้เขียนไฟล์. exe ขนาดเล็ก (C #, .Net 4) ที่ทำสิ่งนี้
ทั้งสองจะแสดงรหัสเซสชันและยังเป็นรหัสส่งคืนเพื่อให้คุณสามารถใช้งานได้ในสคริปต์ / เทคนิคที่หลากหลาย
นี้จะขึ้นอยู่กับรหัสจากออสการ์ Beh
tasklist
จะแสดงรายงานรหัสเซสชัน (และข้อมูลอื่น ๆ ) สำหรับทุกกรณีของการปฏิบัติการที่กำหนดรวมถึงตัวเอง ในขณะที่คุณกำลังรันคำสั่งมันจะแสดงรหัสเซสชันของคุณ ข้อบกพร่องที่อาจเกิดขึ้นเพียงอย่างเดียวในรหัสของเขาคือมันไม่ได้แจ้งให้คุณทราบหากมีหลายอินสแตนซ์ของโปรแกรมซึ่งอาจทำให้สคริปต์ส่งคืนผลลัพธ์ที่ไม่ถูกต้อง
ที่นี่เรารายงานกรณีทั้งหมดของtasklist
เพื่อให้แน่ใจว่าไม่มีเซสชันอื่นที่ใช้คำสั่งนั้น:
for /f "tokens=4 delims= " %%G in ('tasklist /FI "IMAGENAME eq tasklist.exe" /NH') do echo Session ID %%G
หากคุณเห็นรายงาน ID ของเซสชันสองรายการให้เรียกใช้สคริปต์อีกครั้ง