Get-ActiveUser.psm1
<#
.Synopsis Retrive list of active users on windows machine .DESCRIPTION Uses WMI, CIM or Query.exe .EXAMPLE PS C:\> Get-ActiveUser localhost -Method Query ComputerName UserName ------------ -------- localhost jonas localhost test .EXAMPLE PS C:\> Get-ActiveUser localhost -Method wmi ComputerName UserName ------------ -------- localhost Jonas .EXAMPLE PS C:\> Start-Multithread -Script {param($C) Get-ActiveUser -ComputerName $C -Method Query} -ComputerName ::1,Localhost | Out-GridView .NOTES This module was created with a powershell.org blogpost in mind http://powershell.org/wp/2015/08/28/list-users-logged-on-to-your-machines/ Created by Jonas Sommer Nielsen #> function Get-ActiveUser { [CmdletBinding(DefaultParameterSetName='Standard Parameters', SupportsShouldProcess=$true, PositionalBinding=$false, HelpUri = 'https://github.com/mrhvid/Get-ActiveUser', ConfirmImpact='Medium')] [Alias()] [OutputType([string[]])] Param ( # Computer name, IP, Hostname [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)] [String] $ComputerName, # Choose method, WMI, CIM or Query [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)] [ValidateSet('WMI','CIM','Query')] [String] $Method ) Begin { } Process { Write-Verbose "$Method selected as method" switch ($Method) { 'WMI' { Write-Verbose "Contacting $ComputerName via WMI" $WMI = (Get-WmiObject Win32_LoggedOnUser).Antecedent $ActiveUsers = @() foreach($User in $WMI) { $StartOfUsername = $User.LastIndexOf('=') + 2 $EndOfUsername = $User.Length - $User.LastIndexOf('=') -3 $ActiveUsers += $User.Substring($StartOfUsername,$EndOfUsername) } $ActiveUsers = $ActiveUsers | Select-Object -Unique } 'CIM' { Write-Verbose "Contacting $ComputerName via CIM" $ActiveUsers = (Get-CimInstance Win32_LoggedOnUser -ComputerName $ComputerName).antecedent.name | Select-Object -Unique } 'Query' { Write-Verbose "Contacting $ComputerName via Query" $Template = @' USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME >{USER*:jonas} console 1 Active 1+00:27 24-08-2015 22:22 {USER*:test} 2 Disc 1+00:27 25-08-2015 08:26 >{USER*:mrhvid} rdp-tcp#2 2 Active . 9/1/2015 8:54 PM '@ $Query = query.exe user /server $ComputerName $ActiveUsers = $Query | ConvertFrom-String -TemplateContent $Template | Select-Object -ExpandProperty User } } # Create nice output format $UsersComputersToOutput = @() foreach($User in $ActiveUsers) { $UsersComputersToOutput += New-Object psobject -Property @{ComputerName=$ComputerName;UserName=$User} } # output data $UsersComputersToOutput } End { } } |