我需要在Powershell中创建一个应用程序,它将列出“已断开连接”的远程会话,它必须输出用户名和会话ID,稍后将与rwinsta一起使用以删除会话
我在stackoverflow上找到了一个脚本,它通过搜索会话并提供一个缩短的列表来显示概念证明,该列表仅显示用户名和会话ID,但我正在努力解决格式问题。 Foreach和replace是修剪空格并导致行切换列。
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-删除Format-Table -Property USERNAME,ID -Autosize TSSessions - 我得到下表:
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列。
答案 0 :(得分:0)
编辑:根据问题的更清晰描述更新
似乎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