如何确保不枚举系统服务?我想同时拥有系统进程以及所有其他系统服务,例如svchost不在列表中。
Get-Process | Sort-Object CPU -desc | Select-Object -first 3 | Format-Table CPU,ProcessName,Id -hidetableheader
答案 0 :(得分:2)
我喜欢另一个答案,但这是另一种不需要管理员权限的可能性,虽然它可能不是万无一失的:
大多数系统服务都在名为svchost
的流程中运行,因此您只需使用Where-Object
排除这些流程:
Get-Process | Where-Object {$_.name -ne 'svchost'} | Sort-Object CPU -desc | Select-Object -first 3 | Format-Table CPU,ProcessName,Id -hidetableheader
答案 1 :(得分:1)
您可能需要处于管理员模式。
Get-Process -IncludeUserName | where {$_.UserName -notlike "NT AUTHORITY\SYSTEM"} | Sort-Object CPU -desc | Select-Object -first 3 | Format-Table CPU,ProcessName,Id -hidetableheader
这是你要求的吗?
答案 2 :(得分:0)
我喜欢其他答案的简单性,但您可以使用WMI类Win32_Process
来检索流程列表和方法.GetOwner()
以获取流程所有者。
由于系统流程未显示所有者,我们可以轻松过滤执行拥有所有者的流程,显示大多数非系统流程(我说最多,因为svchost显示我不时地在我的账户下。)
# Get all processes
$processes = Get-WMIObject -Class Win32_Process
foreach($process in $processes)
{
try
{
$processOwner = $process.GetOwner()
}
catch
{
continue
}
if ($processOwner.User -ne $null)
{
$processData = Get-Process -Id $process.ProcessId
$process | Select-Object -Property @{n='CPU';e={$processData.CPU}},Name,ID | Sort-Object -Property CPU
}
}