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
}
}
我需要一个脚本来终止 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
}
}