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

后端 未结 6 1368
无人及你
无人及你 2020-11-29 22:44

I am searching for a simple command to see logged on users on server. I know this one :

Get-WmiObject -Class win32_computersystem

but this

相关标签:
6条回答
  • 2020-11-29 22:48

    If you want to find interactively logged on users, I found a great tip here :https://p0w3rsh3ll.wordpress.com/2012/02/03/get-logged-on-users/ (Win32_ComputerSystem did not help me)

    $explorerprocesses = @(Get-WmiObject -Query "Select * FROM Win32_Process WHERE Name='explorer.exe'" -ErrorAction SilentlyContinue)
    If ($explorerprocesses.Count -eq 0)
    {
        "No explorer process found / Nobody interactively logged on"
    }
    Else
    {
        ForEach ($i in $explorerprocesses)
        {
            $Username = $i.GetOwner().User
            $Domain = $i.GetOwner().Domain
            Write-Host "$Domain\$Username logged on since: $($i.ConvertToDateTime($i.CreationDate))"
        }
    }
    
    0 讨论(0)
  • 2020-11-29 22:50

    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.

    0 讨论(0)
  • 2020-11-29 23:03

    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
    }
    
    }
    
    0 讨论(0)
  • 2020-11-29 23:04

    Here is my Approach based on DarKalimHero's Suggestion by selecting only on Explorer.exe processes

    Function Get-RdpSessions 
    {
        param(
            [string]$computername 
        )
    
        $processinfo = Get-WmiObject -Query "select * from win32_process where name='explorer.exe'" -ComputerName $computername
    
        $processinfo | ForEach-Object { $_.GetOwner().User } | Sort-Object -Unique | ForEach-Object { New-Object psobject -Property @{Computer=$computername;LoggedOn=$_} } | Select-Object Computer,LoggedOn
    }
    
    0 讨论(0)
  • 2020-11-29 23:06

    Maybe you can do something with

    get-process -includeusername
    
    0 讨论(0)
  • 2020-11-29 23:11

    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
    
    0 讨论(0)
提交回复
热议问题