使用Get-Process查询远程机器登录用户:无本地登录时返回自身用户名的问题
解决方法:排除远程会话自身的用户条目
你的问题核心在于:当远程机器无本地用户登录时,Get-Process -IncludeUserName会包含你通过Invoke-Command建立的远程会话对应的进程,所以返回了你的用户名。我们只需要在结果中排除掉这个自身用户的条目,就能实现需求。
下面提供两种方案,你可以根据场景选择:
方案1:在远程机器上直接处理(推荐)
把判断逻辑放到远程脚本块中,减少数据传输,更高效:
Invoke-Command -Computername $Comp -Scriptblock { # 获取所有符合条件的进程用户 $processUsers = Get-Process -IncludeUserName | Select-Object UserName, SessionId | Where-Object { $_.UserName -ne $null -and $_.UserName.StartsWith("DomainName") } | Sort-Object SessionId -Unique # 获取当前远程会话的用户(也就是执行Invoke-Command的你) $currentRemoteUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name # 过滤掉自身用户,只保留本地登录的用户 $localLoggedUsers = $processUsers | Where-Object { $_.UserName -ne $currentRemoteUser } # 根据结果输出 if ($localLoggedUsers) { $localLoggedUsers | Select-Object UserName -Unique } else { Write-Output "No user logged in" # 如果需要无输出,直接注释上面一行即可 } }
方案2:本地处理远程返回结果
如果你需要在本地做更多后续处理,可以把结果传回本地再判断:
# 获取远程机器的进程用户结果 $remoteResults = Invoke-Command -Computername $Comp -Scriptblock { Get-Process -IncludeUserName | Select-Object UserName, SessionId | Where-Object { $_.UserName -ne $null -and $_.UserName.StartsWith("DomainName") } | Sort-Object SessionId -Unique } # 获取当前执行脚本的用户完整名称(格式:DomainName\YourUsername) $currentLocalUser = "$env:USERDOMAIN\$env:USERNAME" # 过滤掉自身用户条目 $validUsers = $remoteResults | Where-Object { $_.UserName -ne $currentLocalUser } # 根据过滤结果输出 if ($validUsers) { $validUsers | Select-Object UserName -Unique } else { Write-Output "No user logged in" # 无输出的话就删除上面一行 }
补充说明
- 为什么之前的脚本会返回你的用户名?因为
Invoke-Command在远程机器上创建了一个PowerShell会话,这个会话的进程会被Get-Process捕获,所以当没有其他本地用户登录时,就只剩下你的用户条目。 - 如果你想更精准地筛选本地交互式登录的用户,还可以通过
SessionId判断(通常本地控制台会话的SessionId为0或1,远程会话的SessionId会更高),但这种方法可能因系统版本/配置不同有差异,不如排除自身用户的方法通用。
内容的提问来源于stack exchange,提问作者DRuppe
相关产品推荐
相关产品推荐

