在PowerShell(或quser)中更轻松地解析查询用户 [英] Easier way to parse 'query user' in PowerShell (or quser)
本文介绍了在PowerShell(或quser)中更轻松地解析查询用户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我当前在PowerShell中有以下查询:
query user /server:$server
返回输出:
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
svc_chthost 2 Disc 1:05 8/16/2016 12:01 PM
myusername rdp-tcp 3 Active . 8/29/2016 11:29 AM
目前,我使用@(query user /server:$server).Count - 1
作为一个值来表示登录的用户数(我知道它不是很好)。但是,现在我想获取诸如USERNAME
、ID
和LOGON TIME
之类的信息,以便在脚本的其他部分使用。
我的问题围绕着一种更简单的方式来分析上面的信息,或者可能是对我的问题的更好的解决方案:统计和收集与登录用户相关的信息。
我已经找到了其他似乎效果更好的解决方案,但我相信一定有更简单的方法来完成此任务:
$ComputerName | Foreach-object {
$Computer = $_
try
{
$processinfo = @(Get-WmiObject -class win32_process -ComputerName $Computer -EA "Stop")
if ($processinfo)
{
$processinfo | Foreach-Object {$_.GetOwner().User} |
Where-Object {$_ -ne "NETWORK SERVICE" -and $_ -ne "LOCAL SERVICE" -and $_ -ne "SYSTEM"} |
Sort-Object -Unique |
ForEach-Object { New-Object psobject -Property @{Computer=$Computer;LoggedOn=$_} } |
Select-Object Computer,LoggedOn
}#If
}
catch
{
}
推荐答案
评论中很棒的引用,仍然可以获得更多关于此问题的答案,因为它应该有一个更简单的解决方案!
foreach ($s in $servers) #For Each Server
{
foreach($ServerLine in @(query user /server:$s) -split "
") #Each Server Line
{
#USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
$Parsed_Server = $ServerLine -split 's+'
$Parsed_Server[1] #USERNAME
$Parsed_Server[2] #SESSIONNAME
$Parsed_Server[3] #ID
$Parsed_Server[4] #STATE
$Parsed_Server[5] #IDLE TIME
$Parsed_Server[6] #LOGON TIME
}
}
此解决方案暂时解决了问题,有点草率。
有关功能更多的更深入的解决方案,请查看对原始问题的评论:)
这篇关于在PowerShell(或quser)中更轻松地解析查询用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文