在 PowerShell 中登出遠端會話
作為組織的管理員,在特定伺服器或工作站可能會遇到效能下降的工作場所中,這是一個常見問題。
這種情況通常是由多個使用者遠端連線到機器引起的,特別是如果這是一個共享工作站。但是,大多數遠端連線的使用者沒有正確登出,只是點選了遠端桌面連線或 RDP 上的關閉按鈕。
如果使用者沒有從機器上正確登出,他們的配置檔案將保持活動狀態並佔用資源。作為管理員,我們可以通過執行登出操作來解決此問題。
本文將討論我們如何使用命令列和 PowerShell 登出遠端使用者。
在 PowerShell 中登出遠端會話
以程式設計方式登出遠端會話很容易。但是,在此用例中,最好使用舊命令而不是內建的 PowerShell 命令模組。
例如,PowerShell 模組 Invoke-RDUserLogoff
命令有其侷限性,例如只能在加入域的計算機和作業系統 Windows Server 2012 R2 或 8.1 及更低版本上執行。
現在,讓我們關注幾個遺留的命令來登出遠端使用者,這些命令直到今天仍然被廣泛使用。
登出
命令
logoff
命令將終止使用者在本地或遠端伺服器或工作站中的當前會話。如果我們使用下面的程式碼執行幫助命令,我們可以看到 logoff
cmdlet 使用了一些引數,例如會話名稱或 id 以及伺服器名稱,它們都很重要。
示例程式碼:
logoff /?
輸出:
LOGOFF [sessionname | sessionid] [/SERVER:servername] [/V] [/VM]
如果我們已經知道要定位哪個伺服器,我們怎麼知道那臺機器上的當前會話?然後我們將使用查詢使用者命令或 quser
。
使用 quser
命令查詢使用者會話
現在,嘗試使用下面的程式碼片段在你的本地計算機上執行 quser
。
示例程式碼:
quser
輸出:
USERNAME SESSION NAME ID STATE IDLE TIME LOGON TIME
>marion console 1 Active none 6/10/2022 5:56 AM
執行 quser
命令將顯示你計算機上的所有當前會話。但是,我們如何在不實際登入到該伺服器的情況下隔離遠端伺服器上特定使用者的會話 ID?
請記住,我們可以在以遠端計算機為目標時在本地執行 quser
命令。它所需要的只是一個有權遠端連線到計算機的管理員帳戶。
從這一點開始,我們將需要 Windows PowerShell。
我們將需要 PowerShell 來執行下面的程式碼片段,以執行諸如 -split
之類的字串操作。此外,下面的輸出將顯示使用者的會話 ID,我們需要它作為 logoff
命令的引數。
示例程式碼:
((quser /server:RDP01 | ? { $_ -match "marion" }) -split ' +')[3]
輸出:
1
值得注意的是,我們可以在 PowerShell 中執行舊命令,例如 quser
和 logoff
。因此,從這裡開始,我們現在將使用 PowerShell 終端而不是命令提示符作為我們的直譯器。
使用 quser
和 logoff
命令登出使用者
現在我們知道如何在不建立計算機遠端會話的情況下獲取使用者的會話 ID,我們可以在 PowerShell 中組合所有命令。我們可以以下面的程式碼片段為例。
Set-Alias Query-User quser
Set-Alias Logoff-User logoff
$serverName = 'RDP01'
$userName = 'marion'
$sessionID = ((Query-User /server:$serverName | ? { $_ -match $userName }) -split ' +')[3]
Logoff-User $sessionID /server:$serverName
如你所見,我們為 quser
和 logoff
命令建立了新別名。此步驟是可選的,但我們這樣做是為了通過使用動詞-名詞命令格式讓自己更加沉浸在 PowerShell 指令碼中。
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn