列出当前用户的进程

Pat*_*icF 10 powershell

作为管理员,我可以通过运行它来获取用户进程

Get-Process -IncludeUserName | Where UserName -match test

但作为非管理员,我不能使用-IncludeUserName"'IncludeUserName'参数需要提升用户权限".

因此,如果我作为用户测试登录,我如何仅列出他的进程而不是所有正在运行的进程?

Ale*_*tny 9

这更快,一行,不需要管理员。

Get-Process | ? {$_.SI -eq (Get-Process -PID $PID).SessionId}

  • 当然。`Get-Process` 返回所有进程。它通过管道传输到“?”(“Where-Object”的别名)。因此,它会循环遍历所有进程,查找等于“$PID”会话 ID 的“$_.SI”(SessionId),这是一个自动变量(当前任务的进程 ID)。基本上是说,“列出会话 ID 等于当前运行进程的会话 ID 的所有进程”。由于我们正在寻找当前用户,因此“$PID”应该共享我们正在寻找的相同会话 ID。您可以进行多个会话,但随后您会进行修改。当前用户意味着登录的任何内容。 (2认同)

Dav*_*ant 8

你可以通过WMI做到这一点.以下是您可以在此处找到的文章的摘录.

$View = @(
 @{l='Handles';e={$_.HandleCount}},
 @{l='NPM(K)';e={ (Get-Process -Id $_.ProcessId).NonpagedSystemMemorySize/1KB -as [int]}},
 @{l='PM(K)';e={ $_.PrivatePageCount/1KB -as [int]}},
 @{l='WS(K)';e={ $_.WorkingSetSize/1KB -as [int]}},
 @{l='VM(M)';e={ $_.VirtualSize/1mB -as [int]}},
 @{l='CPU(s)';e={ (Get-Process -Id $_.ProcessId).CPU -as [int]}},
 @{l='Id';e={ $_.ProcessId}},
 'UserName'
 @{l='ProcessName';e={ $_.ProcessName}}
)
Get-WmiObject Win32_Process | % { $_ | 
    Add-Member -MemberType ScriptProperty -Name UserName -Value {
        '{0}\{1}' -f $this.GetOwner().Domain,$this.GetOwner().User
    } -Force -PassThru
} | ? UserName -match $env:USERNAME | ft $View -AutoSize
Run Code Online (Sandbox Code Playgroud)


Mar*_*arc 6

Get-Process 单独不会给你这个信息,你需要WMI:

$owners = @{}
gwmi win32_process |% {$owners[$_.handle] = $_.getowner().user}
$ps = get-process | select processname,Id,@{l="Owner";e={$owners[$_.id.tostring()]}}
foreach($p in $ps) {
    if($p.Owner -eq $env:USERNAME) {
        $p
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

感谢您的代码。基于此,我创建了一个修改版本,以允许用户杀死自己的进程(一部分):

#Script to allow users to kill (a subset of) their own processes 
#Based on : /sf/ask/2463665501/
#Previously we used Task Nanny created by Michel Stevelmans which is a lot faster, but it did not show a process that was causing issues for our users.
$UserProcesses = @()
$Owners = @{}
Get-WmiObject win32_process | Foreach{$owners[$_.handle] = $_.getowner().user}
$Processes = Get-Process | select processname,Description,Id,@{l="Owner";e={$owners[$_.id.tostring()]}}
Foreach($Process in $Processes)
{
    IF($process.Owner -eq $env:USERNAME)
    {
        $UserProcesses += $Process
    }
}
$UserProcessesToExclude = @(
    'concentr', #Citrix Connection Center
    'conhost', #Console Window Host
    'dwm', #Desktop Windows Manager
    'explorer', #Explorer
    'Receiver', #Citrix Receiver Application
    'rundll32', #Windows host process (Rundll32)
    'ssonsvr', #Citrix  Receiver 
    'taskhost' #Host Process for Windows Tasks
    'wfcrun32' #Citrix Connection Manager
    'wfshell' #Citrix wfshell shell
)

$UserProcesses | Where{$_.ProcessName -notin $UserProcessesToExclude} | Out-GridView -Title 'Task killer - Select the process(es) you want to kill. Hold CTRL to select multiple processes.' -PassThru | Foreach{Stop-Process -id $_.Id}
Run Code Online (Sandbox Code Playgroud)