Let’s say you’ve got an app that needs to be closed throughout your environment.
If you can identify that app by a running process, you’ll probably want to know who has the application/process still running.
For this goal I’ve written the following function in order to get the name of the owner (read: person running the app) of the process.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
function Get-ProcessOwner { <# .SYNOPSIS Get the owner of a process. .DESCRIPTION Get the owner of a process via WMI. .PARAMETER ComputerName Gets the processes owner of processes running on the specified computers. The default is the local computer. .PARAMETER ProcessName Specifies one or more processes by process name. You can type multiple process names (separated by commas). .EXAMPLE PS C:\> Get-Process -ComputerName minimonster -Name notepad | Get-ProcessOwner ProcessName UserName Domain ComputerName handle ----------- -------- ------ ------------ ------ notepad.exe Jeff MINIMONSTER METHOS 2228 .EXAMPLE PS C:\> Get-ProcessOwner 'notepad.exe' -ComputerName RDS01 ProcessName UserName Domain ComputerName handle ----------- -------- ------ ------------ ------ notepad.exe Jeff RDS01 METHOS 2228 notepad.exe Lars RDS01 METHOS 3466 notepad.exe Angelique RDS01 METHOS 8672 .EXAMPLE PS C:\> Get-ProcessOwner 'notepad.exe' -ComputerName RDS01,MINIMONSTER ProcessName UserName Domain ComputerName handle ----------- -------- ------ ------------ ------ notepad.exe Jeff RDS01 METHOS 2228 notepad.exe Lars RDS01 METHOS 3466 notepad.exe Angelique RDS01 METHOS 8672 notepad.exe Jeff MINIMONSTER METHOS 2228 .NOTES Author: Jeff Wouters #> [cmdletbinding()] param( [parameter(mandatory=$false,position=0,valuefrompipelinebypropertyname=$true)]$ComputerName=$env:COMPUTERNAME, [parameter(Mandatory=$true,position=1,valuefrompipelinebypropertyname=$true)]$ProcessName ) begin { $PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($(New-Object System.Management.Automation.PSPropertySet(‘DefaultDisplayPropertySet’,[string[]]$('ProcessName','UserName','Domain','ComputerName','handle')))) } process { try { $Processes = Get-wmiobject -Class Win32_Process -ComputerName $ComputerName -Filter "name LIKE '$ProcessName%'" } catch { Write-Warning "Unable to query $ComputerName via WMI" } if ($Processes -ne $null) { foreach ($Process in $Processes) { $Process | Add-Member -MemberType NoteProperty -Name 'Domain' -Value $($Process.getowner().domain) -PassThru | Add-Member -MemberType NoteProperty -Name 'ComputerName' -Value $ComputerName -PassThru | Add-Member -MemberType NoteProperty -Name 'UserName' -Value $($Process.getowner().user) -PassThru | Add-Member -MemberType MemberSet -Name PSStandardMembers -Value $PSStandardMembers -PassThru } } else { Write-Warning "No processes found that match the criteria on $ComputerName" } } end { } } |