PoshCode Archive  Artifact [f6002da42c]

Artifact f6002da42ccd25551853b82a5397448b1f348ba0ba13f9f7844e10fc53a3a2c1:

  • File Get-LastLoggedOnUser.ps1 — part of check-in [8b491a2b1f] at 2018-06-10 14:06:21 on branch trunk — Gets the last logged on user of a workstation. (user: dotps1 size: 3510)

# encoding: ascii
# api: powershell
# title: Get-LastLoggedOnUser
# description: Gets the last logged on user of a workstation.
# version: 0.1
# type: script
# author: dotps1
# license: CC0
# function: Get-LastLoggedOnUser
# x-poshcode-id: 6026
# x-archived: 2016-05-17T13:06:35
# x-published: 2016-09-19T17:43:00
#
#
#requires -RunAsAdministrator

<#
.SYNOPSIS
    Gets the last logged on user of a system.
.DESCRIPTION
    Queries the Win32_UserProfile Windows Management Instrimentation Class and returns the result with the greatest LastUseTime value.
.INPUTS
    System.String.
    System.Management.Automation.PSCredential.
.OUTPUTS
    System.Management.Automation.PSCustomObject.
.PARAMETER Name
    Name of the system.
.PARAMETER Credential
    Account with administrative actions on the system.
    Uses current user context credentials by default.
.EXAMPLE
    Get-LastLoggedOnUser

    UserName  LastLoggedOnTimeStamp CurrentlyLoggedOn
    --------  --------------------- -----------------
    MyPC\User 1/1/2015 12:00:00 AM               True
.EXAMPLE
    Get-LastLoggedOnUser -Name 'Computer1','Computer2'

    UserName       LastLoggedOnTimeStamp CurrentlyLoggedOn
    --------       --------------------- -----------------
    Computer1\User 1/1/2015 12:00:00 AM               True
    Computer2\User 1/1/2015 12:00:00 AM              False
.EXAMPLE
    Get-ADComputer -Filter { Name -like 'Contoso*' } | Get-LastLoggedOnUser -Credential (Get-Credential)

    UserName      LastLoggedOnTimeStamp CurrentlyLoggedOn
    --------      --------------------- -----------------
    Contoso1\User 1/1/2015 12:00:00 AM               True
    Contoso2\User 1/1/2015 12:00:00 AM              False
.NOTES
    Administrative rights is required to use the function.
.LINK
    http://dotps1.github.io
#>

Function Get-LastLoggedOnUser {
    
    [OutputType([PSCustomObject])]

    Param (
        [Parameter(
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true
        )]
        [ValidateScript({
            if (Test-Connection -ComputerName $_ -Count 1 -ErrorAction SilentlyContinue){
                $true
            } else {
                throw "Unable to contact $_."
            }
        })]
        [Alias(
            'ComputerName'
        )]
        [String[]]
        $Name = $env:COMPUTERNAME,

        [Parameter(
            ValueFromPipelineByPropertyname = $true
        )]
        [PSCredential]
        $Credential
    )

    Process {
        foreach ($n in $Name) {
            $params = @{
                Class = 'Win32_UserProfile'
                Namespace = 'root\CimV2'
                ComputerName = $n
                ErrorAction = 'Stop'       
            }

            if ($Credential) {
                $params.Add('Credential', $Credential)
            }
            
            Get-WmiObject @params | Sort-Object -Property LastUseTime | ForEach-Object {
                if (-not ($_.Special)) {
                    [PSCustomObject]@{
                        UserName = ([System.Security.Principal.SecurityIdentifier]$_.SID).Translate([System.Security.Principal.NTAccount]).Value
                        LastLoggedOnTimeStamp = $_.ConvertToDateTime($_.LastUseTime)
                        CurrentlyLoggedOn = $_.Loaded
                    }
                }
            } | Select-Object -Last 1
        }
    }
}