Scripting - Làm thế nào để ngắt kết nối các phiên Remote Desktop?


8

Tôi đang tìm cách đóng tất cả các phiên Remote Desktop đang hoạt động trên máy tính (máy tính cục bộ). Windows bao gồm một số lệnh (rwinsta, qwinsta, v.v.) để xem xét các phiên hoạt động, nhưng tôi không thấy làm thế nào tôi có thể dễ dàng sử dụng thông tin (trừ khi tôi phân tích chuỗi ...) để đóng tất cả các phiên.

Có cách nào trong Powershell (hoặc C #, Batch) để đóng tất cả các phiên Remote Desktop trên máy tính cục bộ không?

Cảm ơn, Martin


Tôi đã cập nhật câu trả lời của mình để bao gồm một vòng lặp sẽ chỉ ngắt kết nối các phiên từ xa đang hoạt động, không phải bảng điều khiển
Kevin Kuphal

Câu trả lời:


5

Bạn có thể thử sử dụng /smtham số không có giấy tờ cho query session(trong tệp bó) để sắp xếp mọi thứ dễ dàng hơn:

FOR /f %%G IN ('query session /sm') DO tsdiscon %%G

Đó là một khởi đầu tốt ... nhưng tôi chỉ muốn ngắt kết nối các phiên Remote Desktop.
Martin

4

Có, sử dụng tsdiscon từ một dòng lệnh:

tsdiscon n

trong đó n nên được thay thế bằng id phiên.

Bạn có thể lấy số phiên từ

query session

Vì bạn nói rằng bạn muốn đóng tất cả các phiên trên máy tính cục bộ, tôi đoán bạn sẽ cần cẩn thận về thứ tự bạn thực hiện (tức là đóng phiên của bạn lần trước).


2

Bạn có thể muốn kiểm tra Tiện ích mở rộng cộng đồng Powershell. Nó bao gồm các lệnh ghép ngắn Get, Stop và Ngắt kết nối TerminalSession.


2

Bạn có thể sử dụng tiện ích tsdiscon để ngắt kết nối các phiên. Nếu bạn sử dụng lệnh "phiên truy vấn" từ dấu nhắc lệnh, bạn có thể xem danh sách ID và sau đó ban hành lệnh tsdiscon cho mỗi lệnh.

Một cấu trúc lặp như thế này sẽ hoạt động

FOR /f %%G IN ('q.bat') DO tsdiscon %%G

trong đó q.bat là

query session /sm | find "Active"

Điều đó sẽ chỉ ngắt kết nối các phiên từ xa và bỏ qua người dùng giao diện điều khiển.


1

Bạn có thể ngắt kết nối các phiên cục bộ hoặc từ xa với tsdiscon.

Disconnects a terminal session.

TSDISCON [sessionid | sessionname] [/SERVER:servername] [/V]

  sessionid           The ID of the session.
  sessionname         The name of the session.
  /SERVER:servername  Specifies the Terminal server (default is current).
  /V                  Displays information about the actions performed.

1

Tôi thấy TSDISCON không xóa các phiên "Đĩa".

Tôi đã thay thế TSDISCON bằng đăng xuất.



1

Tôi biết OP hiện tại đã khá cũ, nhưng điều này sẽ làm những gì bạn đang theo đuổi (và trong trường hợp bất kỳ ai khác vẫn đang tìm kiếm thứ gì đó để làm điều tương tự, tôi nghĩ dù sao tôi cũng sẽ trả lời).

Tương tự như vậy bạn có thể sử dụng query/reset sessioninplace của q/rwinsta...

FOR /F %%A IN (computers.txt) DO (
    FOR /f "tokens=2" %%i IN ('qwinsta /SERVER:%%A ^| find /i "disc"') DO ECHO %%i | rwinsta %%i /SERVER:%%A /V
)

1

FOR /F %A IN (c:\scripts\ps\computers.txt) DO (FOR /f "tokens=2" %i IN ('qwinsta /SERVER:%A ^| find /i "disc"') **DO if "%i" NEQ "0" ECHO %i** | rwinsta %i /SERVER:%A /V)


0

Lệnh TSDiscon sẽ ngắt kết nối các phiên dịch vụ đầu cuối (RDP). Được sử dụng riêng sẽ làm mất hiệu lực phiên hiện tại, bạn có thể chỉ định ID phiên của phiên bạn muốn ngắt kết nối, bạn cũng có thể cung cấp tên máy chủ để ngắt kết nối.

Chi tiết đầy đủ có thể được tìm thấy ở đây .


0

Bạn đã không chỉ định nếu bạn muốn làm điều này mà không tắt hoặc khởi động lại máy tính. Nhưng nếu bạn không nhớ khởi động lại hoặc tắt máy, bạn có thể gọi:

shutdown -r -f -m \\computer_to_restart

Điều này thực sự sẽ buộc khởi động lại máy tính.


Chà ... đó là một ý tưởng. Nhưng tôi không muốn giết tất cả các phiên. Chỉ các phiên máy tính để bàn từ xa.
Martin

0

Ngay cả câu hỏi rất cũ cũng khó có giải pháp nào cho tất cả các phiên bản mà không có qwinsta / query / tsdiscon, cụ thể là tất cả các phiên bản Windows home.

Tuy nhiên, có một phiên bản quyền hạn dễ dàng để ngắt kết nối phiên:

$code = @'
[DllImport("wtsapi32.dll")]
static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] String pServerName);

[DllImport("wtsapi32.dll")]
static extern void WTSCloseServer(IntPtr hServer);

[DllImport("Wtsapi32.dll")]
static extern bool WTSDisconnectSession(System.IntPtr hServer, int SessionId, bool bWait);

public static void DisconnectSession (String ServerName, int SessionId)
{
    IntPtr serverHandle = WTSOpenServer(ServerName);
    WTSDisconnectSession(serverHandle, SessionId, true);
    WTSCloseServer(serverHandle);
}
'@

$tstType=Add-Type -name Test -MemberDefinition $code -PassThru
#$tstType::DisconnectSession("localhost", 2)

Một id phiên có thể được lấy ví dụ với getProcesss. Để ngắt kết nối (không đăng xuất!) Sử dụng phiên $tstType::DisconnectSession("localhost", 2).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.