我正在使用get-process查询登录远程计算机的用户。它确实很好,但是当用户未登录时,查询将返回我自己的用户名,因为它被登录时。我只是喜欢在未登录用户时不要输出,或者只是简单的"没有用户"在"出现在输出中。
我尝试了以下WMI路线:
Get-WmiObject -Class win32_LoggedOnUser -ComputerName $Comp
,但这返回了太多的输出,很难过滤掉。
我还尝试了CIM路线:
(Get-CimInstance -ClassName CIM_ComputerSystem -ComputerName $Comp).UserName
cim的运作效果非常好,并且具有我想要的输出,但是问题是我环境中的大多数机器都不支持WS管理协议,因此在查询时会出错。
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
}
当用户以远程计算机本地登录时,其用户名显示在输出中。当用户未在远程计算机上本地登录时,我的用户名显示在输出中。
我希望没有显示任何内容,或者每当没有用户在远程计算机上登录的用户时,都不会显示任何用户。
您可以通过其进程ID过滤远程命令(在 your 用户名的上下文中运行的过程(,该过程反映在自动变量中$PID
在远程执行脚本块中传递给Invoke-Command -ComputerName
:
旁边:远程命令执行的过程的 name 是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
。- NOTE :对于某些过程, no 用户名报道了
Idle
进程是这种情况(还有其他情况吗?(。如果您仅输出用户名,则该空的用户名将从输出中删除。
- NOTE :对于某些过程, no 用户名报道了
- 如果您只想要用户名,请使用