Powershell 替代 Unix who 命令显示 ssh 会话

Sha*_*mar 2 windows ssh powershell

我在 Windows 服务器上,想知道谁通过 ssh 进入了服务器。在 Linux 上,以下命令有效

who -s
Run Code Online (Sandbox Code Playgroud)

Windows 10 上的替代方案是什么?

sta*_*tor 6

使用提升的 PowerShell,您可以通过以下方式列出所有登录用户:

Get-CimInstance -ClassName Win32_LogonSession | Get-CimAssociatedInstance -Association Win32_LoggedOnUser
Run Code Online (Sandbox Code Playgroud)

要仅获取通过 SSH 登录的用户,您可以使用以下管道:

Get-CimInstance -ClassName Win32_Process -Filter "Name = 'sshd.exe'" | Get-CimAssociatedInstance -Association Win32_SessionProcess | Get-CimAssociatedInstance -Association Win32_LoggedOnUser | Where-Object {$_.Name -ne 'SYSTEM'}
Run Code Online (Sandbox Code Playgroud)

解释:

您正在寻找已登录的帐户(通过 SSH)。在 WMI 中,帐户由类表示Win32_Account。登录会话由类表示Win32_LogonSession。如果用户登录,aWin32_Account将与 关联Win32_LogonSession。该关联将由该类的一个实例来表示Win32_LoggedOnUser

上面的第一个管道获取所有现有登录会话并返回与这些登录会话关联的所有用户帐户。总之,您将获得所有登录用户的列表。

要获取通过 SSH 登录的所有用户的列表,您可以评估更多关联。每个进程 ( Win32_Process) 通过该类与一个登录会话相关联Win32_SessionProcess。上面的第二个管道执行以下操作:

  1. 它过滤所有进程,仅获取 SSH 守护进程的进程。
  2. Win32_LogonSession对于 SSH 进程,它通过关联类确定关联的登录会话 ( ) Win32_SessionProcess
  3. 然后,它使用这些登录会话通过关联类来确定登录的用户,Win32_LoggedOnUser就像第一个管道中一样。
  4. 最后,它会过滤结果以忽略该SYSTEM帐户。