我正在使用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
}
当用户在远程计算机上本地登录时,其用户名将显示在输出中。当用户未在远程计算机上本地登录时,我的用户名将显示在输出中。
我希望不显示任何内容,或者无论何时没有用户在远程计算机上本地登录,都显示“没有用户登录”。
答案 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
。
Idle
进程就是这种情况(还有其他吗?)。如果仅输出用户名,则从输出中消除该空用户名。