Scripting - Bagaimana cara memutuskan sesi Remote Desktop?

8

Saya mencari cara untuk menutup semua sesi Remote Desktop aktif di komputer (komputer lokal). Windows menyertakan beberapa perintah (rwinsta, qwinsta, dll.) Untuk melihat sesi aktif, tetapi saya tidak melihat bagaimana saya dapat dengan mudah menggunakan informasi (kecuali saya mengurai string ...) untuk menutup semua sesi.

Apakah ada cara di Powershell (atau C #, Batch) untuk menutup semua sesi Remote Desktop di komputer lokal?

Terima kasih, Martin

Martin
sumber
Saya memperbarui jawaban saya untuk menyertakan loop yang hanya akan memutuskan sesi remote aktif, bukan konsol
Kevin Kuphal

Jawaban:

5

Anda dapat mencoba menggunakan /smparameter tidak berdokumen untuk query session(dalam file batch) untuk mengurutkan hal-hal lebih mudah:

FOR /f %%G IN ('query session /sm') DO tsdiscon %%G
Adam Brand
sumber
Itu awal yang bagus ... tapi saya hanya ingin memutuskan sesi Remote Desktop.
Martin
4

Ya, menggunakan tsdiscon dari baris perintah:

tsdiscon n

di mana n harus diganti dengan id sesi.

Anda bisa mendapatkan nomor sesi dari

query session

Karena Anda mengatakan Anda ingin menutup semua sesi di komputer lokal, saya kira Anda harus berhati-hati dengan urutan Anda melakukannya (yaitu, tutup sesi Anda yang terakhir).

Rob Levine
sumber
2

Anda mungkin ingin melihat Ekstensi Komunitas Powershell. Ini termasuk Get, Stop, dan Disconnect cmdlet TerminalSession.

Chad Miller
sumber
2

Anda dapat menggunakan utilitas tsdiscon untuk memutuskan sesi. Jika Anda menggunakan perintah "sesi permintaan" dari prompt perintah, Anda dapat melihat daftar ID dan kemudian mengeluarkan perintah tsdiscon untuk masing-masing.

Konstruk perulangan seperti ini harus berhasil

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

dimana q.bat berada

query session /sm | find "Active"

Itu hanya akan memutuskan sesi jarak jauh dan mengabaikan pengguna konsol.

Kevin Kuphal
sumber
1

Anda dapat memutuskan sesi lokal atau jarak jauh dengan 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.
JasonMArcher
sumber
1

Saya menemukan TSDISCON tidak menghapus sesi "Disc" yang terhubung.

Saya mengganti TSDISCON dengan logoff.


sumber
1

Saya tahu OP sudah cukup tua sekarang, tetapi ini harus melakukan apa yang Anda cari (dan memetikan orang lain masih mencari sesuatu untuk melakukan hal yang sama, saya pikir saya akan tetap menjawab).

Demikian pula Anda bisa menggunakan query/reset sessioninplace dari 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
)
Carly
sumber
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)

greg
sumber
0

Perintah TSDiscon akan memutuskan sesi layanan terminal (RDP). Digunakan sendiri akan memutus sesi saat ini, Anda dapat menentukan ID sesi sesi yang ingin Anda putuskan, Anda juga dapat menyediakan nama server untuk memutuskan sambungan.

Rincian lengkap dapat ditemukan di sini .

Sam Cogan
sumber
0

Anda tidak menentukan apakah Anda ingin melakukan ini tanpa mematikan atau me-restart komputer. Tetapi jika Anda tidak keberatan memulai ulang atau mematikan, Anda cukup menelepon:

shutdown -r -f -m \\computer_to_restart

Ini sebenarnya akan memaksa restart komputer.

Nick Berardi
sumber
Ya ... itu ide. Tetapi saya tidak ingin membunuh semua sesi. Hanya sesi desktop jarak jauh.
Martin
0

Bahkan pertanyaannya sudah sangat lama, hampir tidak ada solusi untuk semua versi tanpa qwinsta / query / tsdiscon, yaitu semua versi Windows home.

Namun ada versi PowerShell yang mudah untuk memutuskan sesi:

$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)

Id sesi dapat diperoleh misalnya dengan getProcesss. Untuk memutuskan (bukan logoff!) Gunakan sesi $tstType::DisconnectSession("localhost", 2).

GMA
sumber