qwinsta/server:Powershell中的somesrv等价物?

lee*_*d00 7 powershell remote-desktop

当我运行该qwinsta /server:somesrv命令时,cmd我可以获得登录到特定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
Run Code Online (Sandbox Code Playgroud)

是否有可能在Powershell的远程服务器上获得这样的列表,以便数据可以在别处使用?

Fro*_* F. 8

有多种选择:

  • 使用终端服务PowerShell模块.简单的解决方案.
  • 编写一个解析qwinsta对象输出的powershell包装器.轻松解决方案 见下面的例子
  • 使用Cassia.DLL.Net包装器访问qwinsta在场景后面运行的本机API .这是TS模块使用的类.更难,但将有利于根据您的需求进行定制.
  • 发疯并使用本地方法Cassia.DLL存取使用P/Invoke( ,wtsapi32.dll,).kernel32.dll 艰难而且过于复杂.winsta.dll

适用于qwinsta的PowerShell包装器

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

    qwinsta /server:$ComputerName |
    #Parse output
    ForEach-Object {
        $_.Trim() -replace "\s+",","
    } |
    #Convert to objects
    ConvertFrom-Csv
}

Get-TSSessions -ComputerName "localhost" | ft -AutoSize

SESSIONNAME USERNAME ID     STATE  TYPE DEVICE
----------- -------- --     -----  ---- ------
services    0        Disc                     
console     Frode    1      Active            
rdp-tcp     65537    Listen     

#This is objects, so we can manipulate the results to get the info we want. Active sessions only:
Get-TSSessions -ComputerName "localhost" | ? { $_.State -eq 'Active' } | ft -AutoSize SessionName, UserName, ID

SESSIONNAME USERNAME ID
----------- -------- --
console     Frode    1 
Run Code Online (Sandbox Code Playgroud)