Search code examples
powershellparsingscriptingserverpowershell-3.0

Easier way to parse 'query user' in PowerShell (or quser)


I currently have the following query in PowerShell:

query user /server:$server

Which returns output:

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

Currently, I'm using @(query user /server:$server).Count - 1 as a value to represent the number of users logged on (it's not pretty, I know). However now I would like to obtain information such as USERNAME, ID, and LOGON TIME to use in other parts of my script.

My question is surrounding an easier way to parse the information above, or maybe a better solution to my problem all together: Counting and gathering information related to logged on users.

I've found other solutions that seem to work better, but I'm sure there's got to be a simpler way to accomplish this task:

$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 
    { 

    }

Solution

  • Awesome references in the comments, and still open to more answers for this question as it should have an easier solution!

        foreach ($s in $servers) #For Each Server
    {
        foreach($ServerLine in @(query user /server:$s) -split "\n") #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
        }
    }
    

    This solution solves the problem for now, kind of sloppy.

    For more in-depth solutions with more functionalities, check the comments on the original question :)