วิธีการตรวจสอบผู้ที่เข้าสู่ระบบใน Windows เวิร์กสเตชันจากบรรทัดคำสั่งในปัจจุบัน?


37

สภาพแวดล้อมอยู่ในโดเมนเซิร์ฟเวอร์คือ Windows Server 2003 เวิร์กสเตชันได้ติดตั้ง Vista และ XP
ฉันต้องการวิธีการตรวจสอบจากระยะไกลที่กำลังเข้าสู่ระบบเวิร์กสเตชันโดยเฉพาะอย่างยิ่งจากบรรทัดคำสั่งง่ายๆและไม่มี sysinternals หรือโปรแกรมของบุคคลที่สาม

ขอบคุณ

คำตอบ:


47

นี่คือแหล่งต้นฉบับแต่ตอนนี้ 404:

พวกเขาแนะนำให้ใช้ WMIC (คำสั่งการจัดการอินเทอร์เฟซการจัดการ) ซึ่งมีอยู่ใน windows:

WMIC /NODE: xxx.xxx.xxx.xxx COMPUTERSYSTEM GET USERNAME 

จะส่งคืนชื่อผู้ใช้ที่ลงชื่อเข้าใช้ใน xxx.xxx.xxx.xxx หรือ

WMIC /NODE: "workstation_name" COMPUTERSYSTEM GET USERNAME 

จะคืนชื่อผู้ใช้ที่ลงชื่อเข้าใช้ใน "workstation_name"

UPDATE: สิ่งนี้ควรใช้กับ Windows 10 ด้วย - หากคุณเป็นผู้ดูแลระบบของเครื่องระยะไกล


เมื่อฉันเรียกใช้คำสั่งนี้จากระยะไกลหรือในเครื่องฉันจะได้รับเอาต์พุตบรรทัดเดียวเท่านั้น " UserName" โดยไม่มีรายการอื่นแม้ว่าฉันจะลงชื่อเข้าใช้ในเครื่องนั้น
ได

@Dai คุณใช้ XP หรือ Vista หรือ 2003 หรือไม่ คำถามนี้มีไว้สำหรับระบบปฏิบัติการเหล่านั้น
Preet Sangha

17

ขออภัยไม่ได้สังเกตว่าคุณไม่ต้องการใช้ Sysinternals
นั่นคือตอนนี้เป็นเครื่องมือเทคโนของ Microsoft เหตุผลเฉพาะใด ๆ ที่ไม่ใช้
ฉันชอบ Sysinternals มากกว่าเครื่องมือของบุคคลที่สามอื่น ๆ ก่อนที่Mark Russinovich จะย้ายมาอยู่ที่ Microsoft


Microsoft Sysinternalsสวีทมีเครื่องมือที่เรียกว่าPsloggedon ,

psloggedon.exe -l

นอกจากนี้ยังมีNBTSTAT ,

nbtstat -a NetBIOS-Computer-NAme

3
sysinternals เป็นเพียงธุรกิจ ฉันหวังว่าพวกเขาจ่ายเงินเป็นจำนวนมากเพื่อไปที่นั่นตอนนี้พวกเขาไม่ได้หยุดเขาทำงานที่ดีที่เขาทำมาก่อน
gbjbaanb

@gbjbaanb ฉันมีความสุขกับมัน หวังว่าเขาจะอัปเดตและเพิ่มลงในชุด
nik

1
สิ่งนี้ได้ผลมหัศจรรย์สำหรับฉันในขณะที่WMICคำตอบที่ได้รับการยอมรับบ่นว่า RPC ไม่ทำงาน นั่นเป็นหนอนตัวใหม่ที่ฉันไม่รู้สึกเหมือนเปิดอยู่ตอนนี้ดังนั้นฉันเช็คอิน psloggedon และฉันมีความสุขมาก
Mike S

12

ฉันใช้ win32_loggedonuser แต่พบปัญหาที่มีผู้ใช้โดเมนมากกว่าหนึ่งรายถูกส่งคืนดังนั้นจึงไม่สามารถใช้งานได้ตามวัตถุประสงค์ของฉัน ฉันใช้แทน (ใน PowerShell)

#Get Currently logged in user
$ExplorerProcess = gwmi win32_process | where name -Match explorer

if($ExplorerProcess.getowner().user.count -gt 1){
    $LoggedOnUser = $ExplorerProcess.getowner().user[0]
}

else{
    $LoggedOnUser = $ExplorerProcess.getowner().user
}

ถ้าเป็นเพราะบางครั้งผู้ที่เป็นเจ้าของจะรายงานผู้ใช้มากกว่าหนึ่งรายด้วยเหตุผลบางอย่างไม่ทราบว่าทำไม แต่ในกรณีของฉันมันเป็นผู้ใช้รายเดียวกันดังนั้นจึงไม่มีปัญหา


2
เหตุผลก็คือผู้ใช้มากกว่าหนึ่งรายอาจเข้าสู่ระบบการสลับผู้ใช้อย่างรวดเร็วและอื่น ๆ ได้รับการแนะนำเมื่อหลายปีก่อน ฉัน) ไม่ให้ผู้ใช้อื่นล็อกออน
TomTom

Good Point @TomTom ฉันลืมไปแล้วฉันคิดว่า [win32_loggedonuser] จะส่งคืนใครก็ตามที่เป็น psexec หรือ powershell ก็ได้เช่นกัน
MDMoore313

6

คุณสามารถรับข้อมูลนี้ได้จาก win32_loggedonuser

จากหน้านี้ :

strComputer = "."   ' " use "." for local computer

Set objWMI = GetObject("winmgmts:" _
              & "{impersonationLevel=impersonate}!\\" _
              & strComputer & "\root\cimv2")

Set colSessions = objWMI.ExecQuery _
    ("Select * from Win32_LogonSession Where LogonType = 2 OR LogonType = 10")

If colSessions.Count = 0 Then
   Wscript.Echo "No interactive users found"
Else
   For Each objSession in colSessions
     If objSession.LogonType = 2 Then
       WScript.Echo "Logon type: Console"
     Else
       WScript.Echo "Logon type: RDP/Terminal Server"
     End If
     Set colList = objWMI.ExecQuery("Associators of " _
         & "{Win32_LogonSession.LogonId=" & objSession.LogonId & "} " _
         & "Where AssocClass=Win32_LoggedOnUser Role=Dependent" )

     For Each objItem in colList
       WScript.Echo "User: " & objItem.Name
       WScript.Echo "FullName: " & objItem.FullName
       WScript.Echo "Domain: " & objItem.Domain
     Next
     Wscript.Echo "Session start time: " & objSession.StartTime
     WScript.Echo
   Next
End If
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.