Powershell script to see currently logged in users (domain and machine) + status (active, idle, away) Powershell script to see currently logged in users (domain and machine) + status (active, idle, away) powershell powershell

Powershell script to see currently logged in users (domain and machine) + status (active, idle, away)


In search of this same solution, I found what I needed under a different question in stackoverflow:Powershell-log-off-remote-session. The below one line will return a list of logged on users.

query user /server:$SERVER


There's no "simple command" to do that. You can write a function, or take your choice of several that are available online in various code repositories. I use this:

function get-loggedonuser ($computername){#mjolinor 3/17/10$regexa = '.+Domain="(.+)",Name="(.+)"$'$regexd = '.+LogonId="(\d+)"$'$logontype = @{"0"="Local System""2"="Interactive" #(Local logon)"3"="Network" # (Remote logon)"4"="Batch" # (Scheduled task)"5"="Service" # (Service account logon)"7"="Unlock" #(Screen saver)"8"="NetworkCleartext" # (Cleartext network logon)"9"="NewCredentials" #(RunAs using alternate credentials)"10"="RemoteInteractive" #(RDP\TS\RemoteAssistance)"11"="CachedInteractive" #(Local w\cached credentials)}$logon_sessions = @(gwmi win32_logonsession -ComputerName $computername)$logon_users = @(gwmi win32_loggedonuser -ComputerName $computername)$session_user = @{}$logon_users |% {$_.antecedent -match $regexa > $nul$username = $matches[1] + "\" + $matches[2]$_.dependent -match $regexd > $nul$session = $matches[1]$session_user[$session] += $username}$logon_sessions |%{$starttime = [management.managementdatetimeconverter]::todatetime($_.starttime)$loggedonuser = New-Object -TypeName psobject$loggedonuser | Add-Member -MemberType NoteProperty -Name "Session" -Value $_.logonid$loggedonuser | Add-Member -MemberType NoteProperty -Name "User" -Value $session_user[$_.logonid]$loggedonuser | Add-Member -MemberType NoteProperty -Name "Type" -Value $logontype[$_.logontype.tostring()]$loggedonuser | Add-Member -MemberType NoteProperty -Name "Auth" -Value $_.authenticationpackage$loggedonuser | Add-Member -MemberType NoteProperty -Name "StartTime" -Value $starttime$loggedonuser}}


Since we're in the PowerShell area, it's extra useful if we can return a proper PowerShell object ...

I personally like this method of parsing, for the terseness:

((quser) -replace '^>', '') -replace '\s{2,}', ',' | ConvertFrom-Csv

Note: this doesn't account for disconnected ("disc") users, but works well if you just want to get a quick list of users and don't care about the rest of the information. I just wanted a list and didn't care if they were currently disconnected.

If you do care about the rest of the data it's just a little more complex:

(((quser) -replace '^>', '') -replace '\s{2,}', ',').Trim() | ForEach-Object {    if ($_.Split(',').Count -eq 5) {        Write-Output ($_ -replace '(^[^,]+)', '$1,')    } else {        Write-Output $_    }} | ConvertFrom-Csv

I take it a step farther and give you a very clean object on my blog.

I ended up making this into a module.