This is my attempt to create a command similar to Linux’s who command. Basically all this is doing is using WMI to see who the logged on user is, this is the key line:
Get-WMIObject Win32_Computersystem -Comp $Hostname -ev myError -ea SilentlyContinue | Select Name, UserName
Here is the full script with help doc and exception handling:
##############################
# Author: Erich Cottom
# Copyright: Erich Cottom http://erichcottom.com
# Title: Who
# Description: This script gets the current loged on user of the local or remote computer
##############################
# who 1.0.0 - inital release
# who 1.0.1 - added default local hostname fixed trap exception
# who 1.1.0 - trap statment now only for dns
# who 1.1.1 - fixed dns trap to reset on fail
# bug - rdp user appear as not logged on
<#
.SYNOPSIS
This script acts like Linux's who command
.DESCRIPTION
This command uses WMI to get the user who is currently logged onto the system.
.PARAMETER Hostnames
A list of Hostnames to inquire about logged on users
.EXAMPLE
who.ps1 mycomp
Name UserName
---- --------
mycomp MYCOMP\myuser
.EXAMPLE
who.ps1 pc1,pc2,pc3,pc4,pc5
Name UserName
---- --------
pc1 DOMAIN\user1
pc2 DOMAIN\user2
pc3 DOMAIN\user3
pc4 DOMAIN\user4
pc5 DOMAIN\user5
.NOTES
.LINK
#>
##############
# MAIN
##############
param
(
[parameter(Mandatory=$true,ValueFromPipeline=$true)] $Hostnames = $env:computername
)
$Hostnames = $Hostnames | get-unique
foreach ($Hostname in $Hostnames)
{
# Test if hostname will resolve to ip
$DnsTest = [System.Net.Dns]::GetHostEntry("$hostname")
trap [System.Net.Sockets.SocketException]
{
Write-Output "$hostname has no dns reccord" | Write-Host -ForegroundColor Red -BackgroundColor Black
$DnsTest.AddressList = $null
continue
}
if($DnsTest.AddressList -ne $null)
{
# Ping test
$Ping = new-object System.Net.NetworkInformation.Ping
$Reply = $Ping.Send($Hostname)
$PingTest = $Reply.status
if ($PingTest -eq "Success")
{
# Get logged on user
Get-WMIObject Win32_Computersystem -Comp $Hostname -ev myError -ea SilentlyContinue | Select Name, UserName
# RPC error if WMI call fails
if ($MyError -ne $null)
{
Write-Output "The RPC server on $hostname is unavailable" | Write-Host -ForegroundColor Red -BackgroundColor Black
continue
}
}
# Ping test errors
elseif ($PingTest -eq "TimedOut")
{
Write-Output "Ping Failed: $hostname appears to be down" | Write-Host -ForegroundColor Red -BackgroundColor Black
}
else
{
Write-Output "Other ping error: $PingTest" | Write-Host -ForegroundColor Red -BackgroundColor Black
}
}
}