ไม่สามารถออกจากระบบตัดการเชื่อมต่อหรือรีเซ็ตผู้ใช้เซิร์ฟเวอร์เทอร์มินัลในสภาพแวดล้อมการใช้งานจริง


19

ฉันกำลังค้นหาแนวคิดบางอย่างเกี่ยวกับวิธีตัดการเชื่อมต่อออกจากระบบหรือรีเซ็ตเซสชันของผู้ใช้ในเซิร์ฟเวอร์เทอร์มินัล 2008 (ไม่สามารถเข้าสู่ระบบในฐานะผู้ใช้อย่างใดอย่างหนึ่งเนื่องจากถูกล็อคไว้อย่างสมบูรณ์) นี่เป็นสภาพแวดล้อมที่ใช้งานจริงดังนั้นการรีบูตเซิร์ฟเวอร์หรือทำบางสิ่งที่ทั้งระบบไม่สามารถทำได้ในตอนนี้ ลูกเล่น Powershell ใดที่จะช่วยพวกเราในเรื่องนี้?

เราได้พยายามตัดการเชื่อมต่อออกจากระบบของผู้ใช้และรีเซ็ตเซสชั่นเช่นเดียวกับการฆ่ากระบวนการของเซสชั่นโดยตรงจากเซิร์ฟเวอร์เทอร์มินัลเดียวกัน (จากตัวจัดการงาน, Terminal Services Manager และ Resource Monitor) โดยไม่มีผลลัพธ์

ช่วยด้วย!


UPDATE: เราสิ้นสุดการรีบู๊ตเซิร์ฟเวอร์เนื่องจากไม่มีความพยายามอื่น ๆ ที่เราคิดว่าใช้ได้ ฉันจะเปิดคำถามนี้ไว้โดยหวังว่าบางคนอาจมีข้อมูลเพิ่มเติมเกี่ยวกับปัญหานี้และอาจแก้ไขได้


2
ฉันมีปัญหาเดียวกันบนเซิร์ฟเวอร์เทอร์มินัล windows 2008 R2 SP1 พวกเขาแฮงค์แบบสุ่มและผู้ใช้ไม่สามารถออกจากระบบหรือเข้าสู่ระบบเซิร์ฟเวอร์ ฉันไม่สามารถเข้าสู่ระบบ localy ในฐานะผู้ดูแลท้องถิ่นหรือผู้ดูแลโดเมน วิธีเดียวที่จะเชื่อมต่อกับเซิร์ฟเวอร์คือการใช้ compmgmt.msc แต่ที่นี่ฉันไม่เห็นปัญหาใด ๆ ในบันทึกเหตุการณ์ ในบางครั้งฉันได้รับข้อความแจ้งว่าบริการ IMA ไม่ตอบสนองและเซิร์ฟเวอร์ถูกลบออกจากเตห์ฟาร์ม วิธีเดียวในการแก้ไขปัญหานี้คือการรีบูตเซิร์ฟเวอร์ฮาร์ด ปิดและเปิดใหม่อีกครั้ง ฉันไม่สามารถ จำกัด สาเหตุของเรื่องนี้ให้แคบลงได้และฉัน



1
ลิงก์ที่มีประโยชน์ที่อาจเป็นประโยชน์สำหรับทุกคนที่พบปัญหานี้จะดำเนินต่อไป
JohnLBevan

คำตอบ:


7

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

จากนั้นผู้ใช้สามารถเข้าสู่ระบบอีกครั้งภายใต้บัญชี

ไม่จำเป็นต้องรีบูตและไม่จำเป็นต้องดาวน์โหลดซอฟต์แวร์ของ บริษัท อื่น


- ขอบคุณช่วยฉันจากการรีบูทเซิร์ฟเวอร์! จริงๆไม่ต้องการที่จะเตะทุกคนในระหว่างวันทำงานเพราะ 1 เซสชั่นติดอยู่
MAW74656

การฆ่ากระบวนการเหล่านี้ปลอดภัยหรือไม่ ผู้ใช้ของฉันมีcsrss.exe, dwm.exe, และLoginUI.exe winlogon.exeฉันคิดว่าการฆ่าwinlogon.exeจะทำให้ BSOD เกิดขึ้น…
binki

6

ฉันต้องการแชร์วิธีรีเซ็ตบัญชีโดยไม่จำเป็นต้องรีบูตเซิร์ฟเวอร์ ก่อนอื่นคุณต้องมีสิทธิ์ของผู้ดูแลระบบในการเข้าถึงเซิร์ฟเวอร์ ฉันใช้ตัวเลือกการเข้าสู่ระบบต่อไปนี้: mstsc / v: servername / console / adminเพื่อเข้าถึงเซิร์ฟเวอร์ จากนั้นใน "Windows Taks Manager" ไปที่แท็บผู้ใช้และดำเนินการคลิกขวาที่บัญชีที่คุณต้องการ "ออกจากระบบ" เลือกออกจากระบบ สิ่งนี้ควรทำให้เซสชันที่ถูกล็อคใช้งานโดยบัญชีนั้นว่าง


1
ยกเว้นมันจะไม่เสมอไป บวกกับ OP กล่าวว่าพวกเขาได้ลองสิ่งนี้แล้ว
BeowulfNode42

สำหรับปัญหานี้ปุ่มลงชื่อออกในตัวจัดการงาน→ผู้ใช้ไม่ทำอะไรเลย
binki

5

คำตอบง่าย ๆ คือเรียกใช้พรอมต์คำสั่งที่ยกระดับแล้วพิมพ์ "Taskmgr" จากนั้นจะอนุญาตให้คุณออกจากระบบในแท็บ USERS มันจะไม่ทำงานหากไม่อยู่ในเซสชั่นที่ยกระดับ


ผ่านการทดสอบและโซลูชันนั้นทำงาน
Overmind

1
ไม่ได้สำหรับฉัน. ไม่สามารถใช้ taskmanager ในฐานะผู้ดูแลระบบเพื่อฆ่ากระบวนการใด ๆ ของผู้ใช้
BeowulfNode42

3

คุณสามารถเริ่มต้นคำสั่งให้ทำในเซสชั่แบบสอบถามตรวจสอบรหัสของเซสชั่นจะถูกฆ่าตายแล้วทำเซสชั่นการตั้งค่า ตัวอย่างเช่นหากมีเซสชันการสืบค้นคุณจะได้รับชื่อเซสชัน rdp-tcp # 1 เป็นสิ่งที่คุณต้องการฆ่าคุณสามารถดำเนินการรีเซ็ตเซสชัน rdp-tcp # 1และฆ่ามันได้


ขอบคุณ แต่นั่นก็ไม่ได้ช่วยอะไรเช่นกัน
l0c0b0x

เมื่อฉันเรียกใช้reset session 9คำสั่งนั้นก็ค้าง เซสชั่นของฉันยังคงมีสี่กระบวนการทำงานโดยไม่ต้องปรากฏที่จะใช้งาน: crss.exe, dwm.exe, และLogonUI.exe i.imgur.com/cFM62RA.pngและเอาท์พุท winlogon.exequery session 9No User exists for 9
binki

3

ฉันคิดเหมือนกันว่าเกิดขึ้นวันนี้ใน Terminal Server ของ Win2008R2 Sympthoms คือ: 1. เขาโทรหาฉันด้วยข้อความ "การเชื่อมต่อ" เพียงแค่แฮงค์ตลอดไป " เขาเป็นผู้ใช้ที่เรียบง่ายดังนั้นฉันไม่สามารถคาดหวังคำอธิบายปัญหาโดยละเอียดได้ 2. พยายามล็อกออฟ / รีเซ็ตเซสชั่น (ซึ่งมักจะช่วยในกรณีเหล่านี้) - ไม่ทำงาน เซสชั่นยังคงแขวนในรายการที่มีสถานะ 'ตัดการเชื่อมต่อ' 3. พยายามฆ่ากระบวนการทั้งหมดสำหรับผู้ใช้รายนั้น - ไม่ได้ช่วยอะไร เซสชันยังคงอยู่และปฏิเสธที่จะถูกฆ่า

วิธีแก้ไขคือ - เชื่อมต่อในฐานะผู้ใช้ (ลงชื่อเข้าใช้ด้วยข้อมูลประจำตัวของเขาหากคุณสามารถรีเซ็ตรหัสผ่านหรือใช้ความช่วยเหลือระยะไกลเพื่อดูว่าเกิดอะไรขึ้นบนคอมพิวเตอร์ของเขา) และดูว่าเกิดอะไรขึ้นในหน้าต่างเข้าสู่ระบบ เมื่อเชื่อมต่อฉันคลิกที่ปุ่ม 'รายละเอียด' ของไคลเอนต์ RDP - และที่นี่มันเป็นข้อผิดพลาดที่ winlogon ทำบางอย่างผิดปกติมันกำลังรอให้ผู้ใช้คลิกที่ปุ่ม 'ลองใหม่ / เพิกเฉย / ฯลฯ ' และเนื่องจากเป็น ทุกพฤติกรรมที่แปลก

ป.ล. ฉันไม่พบวิธีใดที่จะบังคับให้ฆ่าเซสชัน: (


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

นี่คือสิ่งที่สถานการณ์ของฉันดูเหมือนว่าเมื่อเกิดปัญหา: i.imgur.com/W6eO5wW.png i.imgur.com/EpPwyJc.png i.imgur.com/cFM62RA.pngนอกจากนี้ฉันใช้ Windows Server 2016
binki

3

เราเพิ่งมีปัญหาที่คล้ายกันกับเซิร์ฟเวอร์ Windows Server 2008 R2 Remote Desktop ของเรา เซสชั่นผู้ใช้แสดงให้เห็นว่า "ใช้งานอยู่" เมื่อดูที่ RDS Manager แต่ไม่มี ID เซสชัน # ที่เชื่อมโยงหรืออุปกรณ์ที่เชื่อมต่อแสดงอยู่ (ทั้งคู่ว่าง)

เทคนิคทั้งหมดข้างต้นไม่สามารถแก้ไขปัญหาได้ เมื่อเชื่อมต่อในฐานะผู้ใช้ที่มีปัญหาข้อความแสดงข้อผิดพลาดจะกลับมาระบุว่า Terminal Server ไม่ว่างและลองอีกครั้งในภายหลังหรือติดต่อผู้ดูแลระบบ

เราทำการรีบูตเครื่องเซิร์ฟเวอร์ด้วยเช่นกัน


2

ฉันมีปัญหาเดียวกันใน Windows Server 2016 ผู้ใช้ไม่สามารถเข้าสู่ระบบได้

ดังนั้นฉันจึงลองทำตามขั้นตอนต่อไปนี้เพื่อยกเลิกการเชื่อมต่อเซสชั่นเด็กกำพร้า:

  1. บน CLI qwinstaจะแสดงรายการเซสชันที่มีอยู่ทั้งหมด, เซสชันที่ไม่ได้ใช้งานและที่ใช้งานอยู่, มีเซสชันที่ไม่ได้เชื่อมต่อหนึ่งเซสชัน (เรียกว่า "getr." ในภาพหน้าจอ) โดยไม่มีชื่อผู้ใช้ แต่เป็นรหัสเซสชัน

แสดงเซสชันที่ใช้งานและฆ่าพวกเขา

  1. ด้วย session id (7) จาก 1 ฉันพยายามฆ่า session นี้ด้วยเซสชั่นการรีเซ็ต 7 (fyi: rwinstaเป็นนามแฝงสำหรับเซสชั่นการรีเซ็ต)

  2. มันใช้งานได้หนึ่งครั้ง แต่ครั้งต่อไปมันไม่มีผลดังนั้นฉันจึงเปิดตัวจัดการงานและแท็บผู้ใช้ คุณจะพบรายการที่ขยายได้หนึ่งรายการที่กำหนดให้กับผู้ใช้เดสก์ท็อประยะไกลทุกราย - หนึ่งรายการไม่มีชื่อผู้ใช้และแสดง 4 งานที่กำลังดำเนินการเท่านั้น

  3. ฉันลองสิ่งที่ชัดเจนแล้ว: ออกจากระบบผู้ใช้ โดยไม่มีผลกระทบใด ๆ

พยายามออกจากระบบผู้ใช้

  1. ดังนั้นฉันจึงพยายามจบงานทั้งสี่ที่มอบหมายให้กับผู้ใช้รายนี้ ระวังเพราะงานบางอย่างที่สำคัญที่สุดคือ csrss.exe เมื่อถูกฆ่าก็จะส่งผลให้ระบบรีบูท ฉันข้ามพวกเขาและฆ่างาน RDP ที่เห็นได้ชัดบางอย่าง

หลังจากขั้นตอน / ลอง 4 แม้แต่เซสชันที่ล้มเหลวครั้งสุดท้ายก็ถูกฆ่าและผู้ใช้ก็สามารถเข้าสู่ระบบได้อีกครั้ง

  1. หากวิธีนี้ยังใช้งานไม่ได้ให้ลองใช้วิธีแก้ไขปัญหานี้กับคำถามอื่น : เมื่อคุณเชื่อมต่อกับไคลเอนต์ RDP ให้คลิกปุ่ม "รายละเอียด" - ที่นั่นคุณควรเห็นข้อผิดพลาดและคุณสามารถคลิกลองใหม่หรือเพิกเฉยได้

คุณมีความเจาะจงมากขึ้นเกี่ยวกับกระบวนการที่คุณฆ่าและกระบวนการที่ไม่ฆ่า ผมคิดว่าผมควรจะข้ามwinlogon.exeแต่ฉันไม่แน่ใจเกี่ยวกับคนอื่น ๆ เช่นLoginUI.exe, และcsrss.exe dwm.exe
binki

อาการช่วงที่สองที่คุณมีเสียงคล้ายกับระเบิดและserverfault.com/a/176080/164429 คุณอาจเพิ่ม“ เชื่อมต่อ” เป็นขั้นตอนเพื่อลองหาวิธีแก้ปัญหาที่สมบูรณ์ยิ่งขึ้นและอาจหลีกเลี่ยงที่จะต้องฆ่ากระบวนการ
binki

@binki มันควรจะเป็น "csrss.exe" - ถ้าคุณฆ่ากระบวนการนี้ระบบจะเริ่มต้นใหม่
nr

1

อาจเป็นการตรวจสอบว่าผู้ใช้ไม่มีกล่องป๊อปอัปข้อมูลรับรองซ่อนอยู่หลังหน้าต่างเดสก์ท็อประยะไกลพร้อมแท็บ alt +

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


1

ฉันต้องการสถานการณ์เดียวกัน: Windows Server 2008 R2 ที่มีบริการเดสก์ท็อประยะไกลการเชื่อมต่อ RDP ตั้งค่าให้ออกจากระบบผู้ใช้หลังจากที่เซสชันไม่ทำงานหรือถูกตัดการเชื่อมต่อ 3 ชั่วโมงและยังคงมีบางเซสชันที่ถูกล็อค ฉันพยายามออกจากระบบด้วย Remote Desktop Manager และ qwinsta / quser โดยไม่ประสบความสำเร็จ

นี่คือวิธีที่ฉันแก้ไขมัน:

  1. qwinstaผมเคยอยู่หมายเลขเซสชั่นที่มี
  2. ผมเคยอยู่ PID ของเซสชันแขวนกับwinlogon.exequery process /ID:yourid
  3. taskkill /f /PID yourPIDผมเคยฆ่ากระบวนการที่มี

ทางที่จะไป. ฉันต้องการหาวิธีอื่นเพื่อแก้ไขปัญหานี้ไม่ให้เกิดขึ้น


1

สิ่งที่ทำงานให้ฉันคือ:

  • เข้าสู่ระบบเซิร์ฟเวอร์
  • ผู้จัดการงานเปิด
  • มองหาผู้ใช้ในแท็บผู้ใช้
  • คลิกขวาเชื่อมต่อป้อนรหัสผ่านผู้ใช้ฉันเห็นหน้าจอ 'โปรดรอ'
  • กด alt-tab ที่ออกจากระบบจากเซิร์ฟเวอร์และออกจากระบบผู้ใช้ด้วย

1

ฉันมีปัญหานี้กับผู้ใช้แอปพลิเคชันเดสก์ท็อประยะไกลที่ล็อคไว้ ฉันเขียนสคริปต์ Powershell นี้เพื่อทำงานตามกำหนดเวลาเพื่อออกจากระบบผู้ใช้ที่แสดงว่าไม่ได้เชื่อมต่อนานกว่า 2 นาที การแก้ไขที่จำเป็นเท่านั้นคือSERVERNAMEที่ฉันตั้งค่าให้ยกเว้นเซิร์ฟเวอร์ Broker ของเดสก์ท็อประยะไกลอย่างไรก็ตามคุณสามารถยกเว้นเซิร์ฟเวอร์ที่คุณต้องการหรือไม่ต้องการเลยก็ได้

สคริปต์ของฉันเขียนขึ้นสำหรับ Windows Server 2012 R2 โดยวิธี ...

สคริปต์ทำสิ่งนี้:

  • รับรายการเซสชันผู้ใช้เดสก์ท็อประยะไกลทั้งหมด
  • ละเว้นเซสชันใด ๆ ที่ไม่ได้พูดว่า "STATE_DISCONNECTED"
  • ละเว้นเซิร์ฟเวอร์โบรคเกอร์ (หรือเซิร์ฟเวอร์อื่น ๆ )
  • ละเว้นเซสชันใด ๆ ที่ไม่มีรหัสเซสชันแบบรวม
  • ละเว้นเซสชันใด ๆ ที่ไม่มีเวลาตัดการเชื่อมต่อ
  • สำหรับเซสชันที่มีเวลาตัดการเชื่อมต่อจะตรวจสอบเวลาปัจจุบันและหากความแตกต่างของเวลาระหว่างตอนนี้และเวลาตัดการเชื่อมต่อมากกว่า X นาที (ในกรณีนี้ 2) จะฆ่ากระบวนการ winlogon
  • นอกจากนี้ยังพยายามที่จะออกคำสั่งออกจากระบบ (ซึ่งมักจะล้มเหลวหลังจากกระบวนการ winlogon ถูกฆ่าตาย)

มันใช้งานได้สำหรับฉัน! ฉันหวังว่ามันจะช่วยคนอื่น! :)

CLS
$RD = Get-RDUserSession | select ServerName, UserName, SessionState, DisconnectTime, UnifiedSessionId, SessionId #Get details about the sessions
foreach ($item in $RD) {
    $UsessionID = $item.UnifiedSessionId -as [int] 
    $sessionID = $item.SessionId -as [int] 
    if ($item.SessionState -eq "STATE_DISCONNECTED" -and $item.ServerName -ne "SERVERNAME" -and $item.DisconnectTime -ne $null -and $item.UnifiedSessionId -ne $null){
        $TimeDiff = New-TimeSpan -start $item.DisconnectTime -end (Get-Date) #check time difference between disconnect time and now. If time is greater than 2 minutes....
        if ($TimeDiff.Minutes -gt 2) {
            #Kill winlogon session for the user
            Get-WmiObject -ComputerName $item.Servername -query "select * from win32_process where name='winlogon.exe'" | Where-Object {$_.SessionId -eq $SessionId} | %{$_.terminate()}
            #Log off user if session still exists (will fail if user kicked)
            Invoke-RDUserLogoff -HostServer $item.ServerName -UnifiedSessionID $UsessionID -Force -erroraction 'silentlycontinue'
            }
         }
      }

หรือหากคุณต้องการรุ่นที่คุณสามารถเห็นสิ่งที่เกิดขึ้นบนหน้าจอ:

 CLS
    $RD = Get-RDUserSession | select ServerName, UserName, SessionState, DisconnectTime, UnifiedSessionId, SessionId
    foreach ($item in $RD) {
        $UsessionID = $item.UnifiedSessionId -as [int]
        $sessionID = $item.SessionId -as [int]
        if ($item.SessionState -eq "STATE_DISCONNECTED" -and $item.ServerName -ne "SERVERNAME" -and $item.DisconnectTime -ne $null -and $item.UnifiedSessionId -ne $null){
            #On Screen Output
            write-host " Name : " $Item.UserName -ForegroundColor "yellow" -NoNewline
            write-host " Unified Session Id : " $UsessionID -ForegroundColor "darkcyan" -NoNewline
            write-host " User Session Id : " $sessionID -ForegroundColor "darkyellow" -NoNewline
            write-host " Session State : " $item.SessionState -ForegroundColor "magenta" -NoNewline
            write-host " Server : " $item.ServerName -ForegroundColor "cyan" -NoNewline
            write-host " Disconnect Time : " $item.DisconnectTime -ForegroundColor "gray" 
            #End On Screen Output
            $TimeDiff = New-TimeSpan -start $item.DisconnectTime -end (Get-Date)
            if ($TimeDiff.Minutes -lt 2) {
                write-host " Disconnected for less than 2 minutes" -ForegroundColor "Green"}
            else {
                write-host " Disconnected for more than 2 minutes" -ForegroundColor "Red" -BackgroundColor "darkyellow"
                write-host " Killing session : " $item.ServerName " ID : " $UsessionID $item.UserName -ForegroundColor "Red"
                #Kill Process "Winlogon.exe" for the user (this should kill the session)
                Get-WmiObject -ComputerName $item.Servername -query "select * from win32_process where name='winlogon.exe'" | Where-Object {$_.SessionId -eq $SessionId} | %{$_.terminate()}
                #Logout User (if session still exists)
                Invoke-RDUserLogoff -HostServer $item.ServerName -UnifiedSessionID $UsessionID -Force -erroraction 'silentlycontinue'
                Write-host " Done! " -ForegroundColor "Green" -BackgroundColor "blue"
                }
             }
          }

1

สร้างไฟล์ใน Notepad และเรียกมัน findession.cmd วางคำสั่ง Query Session / server: servername | ค้นหา / i "% 1" และบันทึกลงในไดเรกทอรี สร้างไฟล์ใหม่ชื่อ resetsession.cmd และใส่คำสั่งรีเซ็ตเซสชัน% 1 / เซิร์ฟเวอร์:% 2 และบันทึก

จากพรอมต์คำสั่งไปที่ dir ที่คุณบันทึกไฟล์เหล่านั้นและพิมพ์ชื่อผู้ใช้ findession (เข้าสู่ระบบของผู้ใช้ที่คุณพยายามค้นหา) กด Enter แล้วคุณจะเห็น ID การเข้าสู่ระบบและเซสชัน พิมพ์ resetsession.cmd ID Servername และจะรีเซ็ตเซสชันนั้น ฉันใช้สิ่งนี้ทุกวันและมันเร็วสุด ๆ ในการค้นหาผู้ใช้และรีเซ็ตเซสชันของพวกเขา


โปรดใช้ตัวเลือกการจัดรูปแบบข้อความเพื่อคำสั่งไฮไลท์และเพิ่มขีดความสามารถในการอ่าน มันเป็นคำตอบที่ดี แต่โปรดแก้ไข
มาร์โก

มีจุดที่จะเขียนไฟล์ชุดคำสั่งเมื่อเป็นดังนั้นในระยะสั้นและคุณจะต้องผ่านข้อโต้แย้งพวกเขาต่อไป
Binki

1
  1. qwinstaค้นหาหมายเลขเซสชั่นที่มี
  2. ฆ่ากระบวนการทั้งหมดภายใต้เซสชันtaskkill /FI "SESSION eq 1" /Fโดยถือว่า ID เซสชันที่คุณต้องการจะสิ้นสุดที่ส่งคืนจาก qwinsta คือ 1

สิ่งนี้ทำงานบน Server 2012 เวอร์ชัน 6.2 Build 9200 ฉันคาดว่ามันจะทำงานบน windows ทุกรุ่น


1

สคริปต์ power-shell นี้ใช้งานได้สำหรับฉันมันให้ไฟล์บันทึกที่ดี ฉันได้รับจากที่นี่ : ฉันหวังว่าสิ่งนี้จะช่วยคนอื่นได้เนื่องจากคำตอบอื่น ๆ มีข้อกำหนดเบื้องต้นมากมายและหรือไม่ได้ผลสำหรับฉัน

    # .SYNOPSIS
    #   Checks for disconnected sessions and logs off the disconnected user sessions.

    #.DESCRIPTION
    #   Checks for disconnected sessions and logs off the disconnected user sessions.

    #.NOTES
    #   File Name: Logoff-DisconnectedSession.ps1
    #   Author   : Bart Kuppens
    #   Version  : 1.1

    #.EXAMPLE
    #   PS > .\Logoff-DisconnectedSession.ps1


    function Ensure-LogFilePath([string]$LogFilePath)
    {
     if (!(Test-Path -Path $LogFilePath)) {New-Item $LogFilePath -ItemType directory >> $null}
    }

    function Write-Log([string]$message)
    {
       Out-File -InputObject $message -FilePath $LogFile -Append
    }

    function Get-Sessions
    {
       $queryResults = query session
       $starters = New-Object psobject -Property @{"SessionName" = 0; "UserName" = 0; "ID" = 0; "State" = 0; "Type" = 0; "Device" = 0;}
       foreach ($result in $queryResults)
       {
          try
          {
             if($result.trim().substring(0, $result.trim().indexof(" ")) -eq "SESSIONNAME")
             {
                $starters.UserName = $result.indexof("USERNAME");
                $starters.ID = $result.indexof("ID");
                $starters.State = $result.indexof("STATE");
                $starters.Type = $result.indexof("TYPE");
                $starters.Device = $result.indexof("DEVICE");
                continue;
             }

             New-Object psobject -Property @{
                "SessionName" = $result.trim().substring(0, $result.trim().indexof(" ")).trim(">");
                "Username" = $result.Substring($starters.Username, $result.IndexOf(" ", $starters.Username) - $starters.Username);
                "ID" = $result.Substring($result.IndexOf(" ", $starters.Username), $starters.ID - $result.IndexOf(" ", $starters.Username) + 2).trim();
                "State" = $result.Substring($starters.State, $result.IndexOf(" ", $starters.State)-$starters.State).trim();
                "Type" = $result.Substring($starters.Type, $starters.Device - $starters.Type).trim();
                "Device" = $result.Substring($starters.Device).trim()
             }
          } 
          catch 
          {
             $e = $_;
             Write-Log "ERROR: " + $e.PSMessageDetails
          }
       }
    }

    Ensure-LogFilePath($ENV:LOCALAPPDATA + "\DisconnectedSessions")
    $LogFile = $ENV:LOCALAPPDATA + "\DisconnectedSessions\" + "sessions_" + $([DateTime]::Now.ToString('yyyyMMdd')) + ".log"

    [string]$IncludeStates = '^(Disc)$'
    Write-Log -Message "Disconnected Sessions CleanUp"
    Write-Log -Message "============================="
    $DisconnectedSessions = Get-Sessions | ? {$_.State -match $IncludeStates -and $_.UserName -ne ""} | Select ID, UserName
    Write-Log -Message "Logged off sessions"
    Write-Log -Message "-------------------"
    foreach ($session in $DisconnectedSessions)
    {
       logoff $session.ID
       Write-Log -Message $session.Username
    }
    Write-Log -Message " "
    Write-Log -Message "Finished"  

แก้ไข:
เริ่มแรกฉันใช้สคริปต์นี้เพื่อออกจากระบบและปิดเซสชัน "ไม่ได้เชื่อมต่อ" ทั้งหมด เรามีแอปพลิเคชั่นเทอร์มินัลเซิร์ฟเวอร์สองสามตัวที่มีผู้ใช้จำนวนมากและมีใบอนุญาต จำกัด เซสชันที่ถูกตัดการเชื่อมต่อจะยังคงเปิดอยู่เป็นเวลานานและบางครั้งก็จะเปิดตลอดเวลา สิ่งนี้ส่งผลให้เซสชันไม่ได้ใช้งานซึ่งจะใช้สิทธิ์การใช้งานบางส่วนและผู้ใช้รายอื่นจะไม่สามารถเชื่อมต่อได้

  • ฉันรันสคริปต์โดยใช้งานที่กำหนดเวลาไว้เพื่อตรวจสอบและ
    ยกเลิกการเชื่อมต่อเซสชันในเซิร์ฟเวอร์บางตัวเป็นประจำ มันทำงานได้อย่างอิสระ
    โดยไม่ต้องมีปฏิสัมพันธ์ใด ๆ
  • ฉันใช้กับระบบปฏิบัติการ Windows 2008 R2 Server และ Windows 2012 R2 Server
  • จะปิดเฉพาะเซสชันที่ไม่ได้เชื่อมต่อเท่านั้น
  • มันอัปเดตไฟล์ 'บันทึก' กับผู้ใช้หรือรอบที่มันตัดการเชื่อมต่อ

คุณช่วยอธิบายสิ่งที่มันทำ?
Konrad Gajewski

1
สวัสดี Konrad ฉันแก้ไขคำตอบเล็กน้อยและหวังว่ามันจะอธิบายสิ่งที่สคริปต์ทำ โดยพื้นฐานแล้วสคริปต์จะปิดเซสชันที่ไม่ได้เชื่อมต่อทั้งหมดซึ่งยังคงเปิดอยู่หลังจากผู้ใช้ระยะไกลยกเลิกการเชื่อมต่อจากเซิร์ฟเวอร์
9953-div-37

0

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

ตรวจสอบHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Runคีย์รีจิสทรีที่กระบวนการที่จำเป็นเท่านั้นเริ่มทำงาน ใน 64bit HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Runมันเป็น


0

คุณสามารถดาวน์โหลดเครื่องมือ " Process Explorer " จาก Microsoft และใช้เพื่อแก้ไขปัญหาของคุณ หากคุณมีรหัสเซสชันคุณสามารถค้นหากระบวนการที่เกี่ยวข้องได้ จากนั้นหากเซสชันผู้ใช้ถูกตัดการเชื่อมต่อคุณสามารถฆ่ากระบวนการด้วย Process Explorer


0

สภาพแวดล้อมไม่เหมือนกันอย่างแน่นอน (เรามี 2012r2) แต่การรีสตาร์ทบริการการจัดการเครื่องเสมือน Hyper-V (VMMS) ปล่อยการเชื่อมต่อสำหรับฉัน


0

คุณต้องคลิกเพื่อดำเนินการและแสดงกระบวนการจากผู้ใช้ทั้งหมดจากนั้นคุณจะสามารถยกเลิกการเชื่อมต่อได้

เหตุใดจึงไม่สร้างนโยบายเซสชันภายใต้การกำหนดค่าโฮสต์เซสชันเดสก์ท็อประยะไกลสิ้นสุดการเชื่อมต่อหรือเซสชันที่ไม่ได้ใช้งานหลังจากช่วงเวลาหนึ่ง


0

การแก้ไขของฉัน: บนเครือข่ายที่แตกต่างตัดฉันเชื่อมต่อกับเซิร์ฟเวอร์ปัญหาผ่านเครื่องมือการจัดการคอมพิวเตอร์ในช่วงเปิดฉันคลิกขวาและปิดทุกไฟล์ที่เปิดแล้วก็สามารถเชื่อมต่อผ่าน mstsc


0

คุณสามารถใช้ PowerShell จากเครื่องในท้องที่ของคุณและทำมันจากระยะไกล

Invoke-command -computername <servername> -Credential (get-credential) { 
    $session = ((quser | ? { $_ -match <username> }) -split ' +' )[2]
    logoff $session
} 

เพื่อให้คำตอบของคุณมีประโยชน์มากยิ่งขึ้นมันจะเป็นประโยชน์ในการให้คำอธิบายพื้นฐานว่าคำสั่งนี้ทำงานอย่างไร ทุกคนอาจไม่เคยมีประสบการณ์เพียงพอกับ PowerShell ที่จะเข้าใจ ขอบคุณสำหรับการมีส่วนร่วม
ฉันพูดว่า Reinstate Monica

-1

น่าเสียดาย. เซสชันผู้ใช้ของฉันถูกตัดการเชื่อมต่อ ตัวจัดการงานไม่ได้แสดงกระบวนการใด ๆ ที่ทำงานในฐานะผู้ใช้ ฉันไม่สามารถล็อกผู้ใช้ออกจากตัวจัดการงาน ฉันลองรีเซ็ตคำสั่งsession idและจบด้วยการแช่แข็งด้วย ฉันต้องจบการเข้าสู่ระบบในเซสชันอื่นในฐานะผู้ดูแลระบบลบบัญชีและสร้างใหม่อีกครั้ง


-1

คุณได้พยายามที่จะออกจากระบบผู้ใช้จากเดสก์ท็อปผู้จัดการบริการระยะไกล? ไปที่เครื่องมือการดูแลระบบ -> บริการเดสก์ท็อประยะไกล -> ผู้จัดการบริการเดสก์ท็อประยะไกลและออกจากระบบ มันอาจทำงานได้


-1

ไปที่หน้าต่างเริ่มต้นและคลิกที่ชื่อของคุณ

ดูตัวอย่างได้ที่นี่


ผมคิดว่านี่เป็นซ้ำของหลายคำตอบอื่น ๆ ได้ที่นี่ (ซึ่งส่วนใหญ่จะค่อนข้างมีรายละเอียดเพิ่มเติม) - เช่นserverfault.com/a/804638/402709 มันอาจช่วยปรับปรุงคำตอบของคุณเพื่อขยายด้วยบริบทและประสบการณ์ของคุณเอง
iwaseatenbyagrue

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