首页 > 解决方案 > 使用 Qwinsta 导出断开连接会话的缩短列表

问题描述

我需要在 Powershell 中创建一个应用程序,它将列出“断开连接”的远程会话,它必须输出会话的用户名和 ID,稍后将与 rwinsta 一起使用以删除会话

我在 stackoverflow 上找到了一个脚本,它几乎可以通过搜索会话并提供一个仅显示用户名和会话 ID 的简短列表来进行概念验证,但我正在努力解决格式问题。Foreach 和替换正在修剪空格并导致行切换列。

function Get-TSSessions
{
    param ($ComputerName = "SERVER")
    qwinsta /server:$ComputerName | ForEach-Object {$_.Trim() -replace "\s+","," } | ConvertFrom-Csv
}

Get-TSSessions -ComputerName "SERVER2016" | ft -Property USERNAME, ID -AutoSize

然后我得到以下信息:

USERNAME      ID
--------      --
0             Disc
1             Conn
Administrator 5
6             Disc
65536         Listen

如果我从 Qwinsta 命令中删除 ForEach-Object {$_.Trim() -replace "\s+","," } 然后从 Get-TSSessions 中删除 Format-Table -Property USERNAME, ID -Autosize - 我得到下表:

 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
 console                                     1  Conn
 31c5ce94259d4...  Administrator             5  Active
                   admin2                    6  Disc
 31c5ce94259d4...                        65536  Listen
 rdp-tcp                                 65537  Listen

如您所见,当该列不包含条目时,第一个表中的结果被移动到左侧的空白区域,因此两个断开连接的会话未显示正确的用户名和 ID。

我基本上只需要显示第二个表中的用户名和 ID 列。

标签: powershelltrim

解决方案


编辑:根据对问题的更清晰描述进行更新

它似乎qwinsta.exe在固定宽度的列中输出其文本,因此以下内容应正确替换空格以提供有效的 CSV 输出:

function Get-TSSessions
{
    param ($ComputerName = "SERVER")

    qwinsta /server:$ComputerName |
        ForEach-Object {$_ -replace "\s{2,18}","," } | 
            ConvertFrom-Csv
}

Get-TSSessions -ComputerName "SERVER2016" |
    Where-Object State -eq 'Disc' |
        Format-Table UserName, ID -AutoSize

推荐阅读