PowerShell 终止用户的所有 RDP 会话

PowerShell terminate all RDP sessions of a user

我需要一个脚本来终止 AD 用户的所有 RDP 会话。 只应提供用户名,脚本会终止该用户的所有 RDP 会话(如有必要,也会强制执行)。

不幸的是,Get-RDUserSession cmdlet 不起作用(无法找到 ConnectionBroker)。 不幸的是,我无法在 PowerShell 中处理 CMD 命令 qwinsta 的结果。

有什么想法或提示吗?

谢谢。

您可以从 qwinsta 的输出创建自定义对象,过滤它们并使用 rwinsta 终止会话。

Function Get-TSSessions
{

param (
    [Parameter(Mandatory = $true, Position = 0 )]
    [String]$ComputerName
    ) # End Parameter Block

qwinsta /server:$ComputerName |
ForEach-Object{
    If($_ -notmatch "SESSIONNAME")
    {
    New-Object -TypeName PSObject -Property `
    @{
        "ID"           = [Int]$_.SubString(41,05).Trim()
        "ComputerName" = $Computer
        "User"         = $_.SubString(19,22).Trim()
        "State"        = $_.SubString(47,08).Trim()
        }
    }
}

} # End Function Get-TSSessions

Get-TSSessions -ComputerName <ServerName> | 
Where-Object{$_.User -eq "SomeUser"} |
ForEach{ & "rwinsta /Server:$($_.ComputerName) $($_.ID)" }

显然,您可以通过将 rwinsta 命令包装在它自己的函数中来进行改进。目前我只有围绕这类事情写的报告工作,所以本着回答问题而不写整个事情的精神,这应该让你通过。

此外,我相信 PowerShell Gallery 上有许多脚本和函数可用于此。事实上,我认为 PowerShell Community Extensions 中有函数 Get/Stop-TerminalSession,您可以将其作为模块安装。

param
(
    [Parameter(Mandatory = $false,
               HelpMessage = 'Specifies the user name (SamAccountName).',
               DontShow = $false)]
    [SupportsWildcards()]
    [ValidateNotNullOrEmpty()]
    [ValidateScript({
            Import-Module -Name 'ActiveDirectory' -Force
            if (Get-ADUser -Filter "sAMAccountName -eq '$_'") {
                return $true
            } else {
                return $false
            }
        })]
    [string]$Username = $env:USERNAME
)

$ErrorActionPreference = 'SilentlyContinue'
Import-Module -Name 'ActiveDirectory' -Force

foreach ($system in (Get-ADComputer -Filter ("Name -ne '$env:COMPUTERNAME' -and OperatingSystem -like 'Windows Server*'"))) {
    [string]$system = $system.Name
    $session = ((quser /server:$system | Where-Object {
                $_ -match $Username
            }) -split ' +')[3]
    if ($session) {
        logoff $session /server:$system
    }
}