qwinsta /server:Powershell中的一些esrv等效项?

qkf9rpyu  于 2023-03-18  发布在  Shell
关注(0)|答案(2)|浏览(165)

当我在cmd中运行qwinsta /server:somesrv命令时,我可以获得登录到特定Windows服务器的所有当前RDP会话的列表。

SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 console                                     0  Conn    wdcon
 rdp-tcp                                 65536  Listen  rdpwd
 rdp-tcp#594       tom1                      1  Active  rdpwd
 rdp-tcp#595       bob1                      2  Active  rdpwd

是否可以从Powershell在远程服务器上获得这样的列表,以便在其他地方使用这些数据?

iyfamqjs

iyfamqjs1#

有多种选择:

  • 使用Terminal Services PowerShell Module. * 简易解决方案 *。
  • 编写一个powershell Package 器,将qwinsta的输出解析为对象。* 简单的解决方案。参见下面的示例 *
  • 使用Cassia.DLL.Net Package 器访问qwinsta在后台运行的本机API。这是TS模块使用的类。* 比较困难,但可以根据您的需要进行自定义。*
  • 疯狂地使用Cassia.DLL通过P/Invoke访问的原生方法(wtsapi32.dllkernel32.dllwinsta.dll)。* 困难且过于复杂。*

Qwinsta的PowerShell Package

function Get-TSSessions {
    param(
        $ComputerName = 'localhost'
    )

    $output = qwinsta /server:$ComputerName
    if ($null -eq $output) {
        # An error occured. Abort
        return
    }

    # Get column names and locations from fixed-width header
    $columns = [regex]::Matches($output[0],'(?<=\s)\w+')
    $output | Select-Object -Skip 1 | Foreach-Object {
        [string]$line = $_

        $session = [ordered]@{}
        for ($i=0; $i -lt $columns.Count; $i++) {
            $currentColumn = $columns[$i]
            $columnName = $currentColumn.Value

            if ($i -eq $columns.Count-1) {
                # Last column, get rest of the line
                $columnValue = $line.Substring($currentColumn.Index).Trim()
            } else {
                $lengthToNextColumn = $columns[$i+1].Index - $currentColumn.Index
                $columnValue = $line.Substring($currentColumn.Index, $lengthToNextColumn).Trim()
            }

            $session.$columnName = $columnValue.Trim()
        }

        # Return session as object
        [pscustomobject]$session
    }
}

Get-TSSessions -ComputerName "localhost" | Format-Table -AutoSize

SESSIONNAME USERNAME ID STATE  TYPE DEVICE
----------- -------- -- -----  ---- ------
services             0  Disc
console     Frode    1  Active

#This is objects, so we can manipulate the results to get the info we want. Active sessions only:
Get-TSSessions -ComputerName "localhost" | Where-Object State -eq 'Active' | Format-Table -AutoSize SessionName, UserName, ID

SESSIONNAME USERNAME ID
----------- -------- --
console     Frode    1
avwztpqn

avwztpqn2#

我曾经使用过Terminal Services PowerShell模块(现在在codeplex归档中),但那是两年前的事了,我不能把手放在它上面,但它在gitshub或其他网站上也存在一个嵌入QWinsta/RmWinsta的函数。

相关问题