If this helps anyone, I'm currently using the code below to get the results from "query user" into array. Tested on English versions of Windows 2003 Server Standard SP2, Windows Server 2008 Enterprise R2, Windows 7.
#include <Constants.au3>
#include <Array.au3>
Opt("MustDeclareVars", 1)
Local $users = _QueryUser()
If Not @error Then
_ArrayDisplay($users)
Else
MsgBox(48, 'Error', $users)
EndIf
Func _QueryUser()
Local $line, $lines, $return
Local $runPID = Run(@ComSpec & " /c query useur", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
Do
$line = StdoutRead($runPID)
If $line Then $lines &= $line
Until @error
If $lines Then
$lines = StringSplit(StringTrimRight(StringReplace(StringRegExpReplace($lines, "(rn)|r|n|(nr)", "|"), ">", ""),1), "|")
Local $data[$lines[0]][6]
;Field lengths: (1+)22, 19, 4, 8, 11, the rest
For $i = 0 To $lines[0]-1 Step 1
StringStripWS($lines[$i+1], 3)
$data[$i][0] = StringStripWS(StringLeft($lines[$i+1], 22), 3)
$data[$i][1] = StringStripWS(StringLeft(StringTrimLeft($lines[$i+1], 22), 19), 3)
$data[$i][2] = StringStripWS(StringLeft(StringTrimLeft($lines[$i+1], 22+19), 4), 3)
$data[$i][3] = StringStripWS(StringLeft(StringTrimLeft($lines[$i+1], 22+19+4), 8), 3)
$data[$i][4] = StringStripWS(StringLeft(StringTrimLeft($lines[$i+1], 22+19+4+8), 11), 3)
$data[$i][5] = StringStripWS(StringTrimLeft($lines[$i+1], 22+19+4+8+11), 3)
Next
$return = $data
SetError(0)
Else
Do
$line = StderrRead($runPID)
If $line Then $lines &= $line
Until @error
$return = String($lines)
SetError(1)
EndIf
Return($return)
EndFunc
This code is far from ideal, and I'm still looking for a better way to get this information, especially user's idle time.
Edit: made the code more pretty