当没有用户在远程计算机上登录时,Get-Process“用户名”返回我自己的用户名

时间:2019-04-29 15:32:18

标签: powershell

我正在使用Get-Process查询远程计算机的登录用户。它确实运行良好,但是当用户未登录时,查询将返回我自己的用户名作为登录用户。我只是想在用户未登录时不显示任何输出,或者只是一个简单的“未登录用户” on”出现在输出中。

我尝试了以下WMI路由:

Get-WmiObject -Class win32_LoggedOnUser -ComputerName $Comp

但这会返回太多的输出,很难过滤掉。

我还尝试了CIM路由:

(Get-CimInstance -ClassName CIM_ComputerSystem -ComputerName $Comp).UserName

CIM确实运行良好,并且具有我想要的输出,但是问题是我环境中的大多数计算机都不支持WS-Management协议,因此在查询时它们会出错。

Get-Process路线到目前为止效果最好,而且速度很快。我只是想不通如何过滤输出,以防止显示没有本地登录的远程计算机的用户名。

Invoke-Command -Computername $Comp -Scriptblock {
    Get-Process -IncludeUserName | Select-Object UserName | Where-Object { $_.UserName -ne $null -and $_.UserName.StartsWith("DomainName") } | Sort-Object SessionId -Unique
}

当用户在远程计算机上本地登录时,其用户名将显示在输出中。当用户未在远程计算机上本地登录时,我的用户名将显示在输出中。

我希望不显示任何内容,或者无论何时没有用户在远程计算机上本地登录,都显示“没有用户登录”。

1 个答案:

答案 0 :(得分:1)

您可以通过其进程ID过滤运行远程命令(在您的用户名上下文中运行)的进程,该进程ID反映在远程内部的自动变量$PID中执行脚本块传递给Invoke-Command -ComputerName

顺便说一句:执行远程命令的进程的名称wsmprovhost

在您的命令上下文中:

注意:在PSv3中,使用Where-Object { $_.Id -ne $PID }代替下面的Where-Object Id -ne $PID

Invoke-Command -Computername $Comp -Scriptblock {
  Get-Process -IncludeUserName | 
    Where-Object Id -ne $PID |
      Select-Object UserName |
        Where-Object { $_.UserName -ne $null -and $_.UserName.StartsWith("DomainName") } | 
          Sort-Object UserName -Unique
}
  • 假设您打算列出唯一的用户名,我将Sort-Object SessionId -Unique更改为Sort-Object UserName -Unique

  • 默认输出不仅显示用户名,还显示远程处理的属性.PSComputerName.RunspaceId,自动使用其装饰输出对象。

    • 如果只需要用户名,则使用Select-Object -ExpandProperty Username代替Select-Object UserName,并用Sort-Object -Unique代替Sort-Object UserName -Unique
      • 注意:对于某些进程,报告的是 no 用户名,Idle进程就是这种情况(还有其他吗?)。如果仅输出用户名,则从输出中消除该空用户名。